From a638ad49ac484ba87e512f6dfebf8aa83e4b3ad7 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Thu, 5 Apr 2018 20:47:18 -0400 Subject: [PATCH 1/2] Fix bash number comparison This adds JDK 10 and 11 testing on Linux --- .travis.yml | 8 +- citest/install-jdk.sh | 167 ++++++++++++++++++++++++++ citest/install-jdk10.sh | 20 --- src/universal/bin/sbt-launch-lib.bash | 6 +- 4 files changed, 174 insertions(+), 27 deletions(-) create mode 100755 citest/install-jdk.sh delete mode 100755 citest/install-jdk10.sh diff --git a/.travis.yml b/.travis.yml index 84a1ba6cd..b1f6cad6d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,17 +23,17 @@ matrix: os: osx osx_image: xcode9.2 - ## build using JDK 8, test using JDK 9 + ## build using JDK 8, test using OpenJDK 10 - script: - sbt -Dsbt.build.version=$SBT_VER universal:packageBin - - jdk_switcher use oraclejdk9 + - citest/install-jdk.sh -F 10 - cd citest && ./test.sh jdk: oraclejdk8 - ## build using JDK 8, test using JDK 10 + ## build using JDK 8, test using OpenJDK 11 - script: - sbt -Dsbt.build.version=$SBT_VER universal:packageBin - - citest/install-jdk10.sh + - citest/install-jdk.sh -F 11 - cd citest && ./test.sh jdk: oraclejdk8 diff --git a/citest/install-jdk.sh b/citest/install-jdk.sh new file mode 100755 index 000000000..a22b44c29 --- /dev/null +++ b/citest/install-jdk.sh @@ -0,0 +1,167 @@ +#!/usr/bin/env bash + +# +# Install JDK for Linux +# +# This script determines the most recent early-access build number, +# downloads the JDK archive to the user home directory and extracts +# it there. +# +# Example usage +# +# install-jdk.sh -D | only gather and print variable values +# install-jdk.sh | install most recent (early-access) OpenJDK +# install-jdk.sh -W /usr/opt | install most recent (early-access) OpenJDK to /usr/opt +# install-jdk.sh -C | install most recent (early-access) OpenJDK with linked system CA certificates +# install-jdk.sh -F 9 | install most recent OpenJDK 9 +# install-jdk.sh -F 10 | install most recent OpenJDK 10 +# install-jdk.sh -F 11 | install most recent OpenJDK 11 +# install-jdk.sh -F 11 -L BCL | install most recent Oracle JDK 11 +# +# Options +# +# -D | Dry-run, only gather and print variable values +# -F f | Feature number of the JDK release [9|10|...|?] +# -L l | License of the JDK [GPL|BCL] +# -W w | Working directory and install path [${HOME}] +# -C | Use system CA certificates (currently only Debian/Ubuntu is supported) +# +# Exported environment variables +# +# JAVA_HOME is set to the extracted JDK directory +# PATH is prepended with ${JAVA_HOME}/bin +# +# (C) 2018 Christian Stein +# +# https://github.com/sormuras/bach/blob/master/install-jdk.sh +# +set -e + +VERSION='2018-04-05' +DRY_RUN='0' +LINK_SYSTEM_CACERTS='0' + +JDK_FEATURE='?' +JDK_BUILD='?' +JDK_LICENSE='GPL' +JDK_WORKSPACE=${HOME} +JDK_DOWNLOAD='https://download.java.net/java' +JDK_ORACLE='http://download.oracle.com/otn-pub/java/jdk' + +echo "install-jdk.sh (${VERSION})" + +# +# Parse command line options +# +while getopts ':F:L:W:CD' option; do + case "${option}" in + D) DRY_RUN='1';; + C) LINK_SYSTEM_CACERTS='1';; + F) JDK_FEATURE=${OPTARG};; + L) JDK_LICENSE=${OPTARG};; + W) JDK_WORKSPACE=${OPTARG};; + :) echo "Option -${OPTARG} requires an argument."; exit 1;; + \?) echo "Invalid option: -${OPTARG}"; exit 1;; + esac +done + +# +# Determine latest (early access or release candidate) number. +# +LATEST='11' +TMP=${LATEST} +while [ "${TMP}" != '99' ] +do + CODE=$(curl -o /dev/null --silent --head --write-out %{http_code} http://jdk.java.net/${TMP}) + if [ "${CODE}" -ge '400' ]; then + break + fi + LATEST=${TMP} + TMP=$[${TMP} +1] +done + +# +# Sanity checks. +# +if [ "${JDK_FEATURE}" == '?' ]; then + JDK_FEATURE=${LATEST} +fi +if [ "${JDK_FEATURE}" -lt '9' ] || [ "${JDK_FEATURE}" -gt "${LATEST}" ]; then + echo "Expected JDK_FEATURE number in range of [9..${LATEST}], but got: ${JDK_FEATURE}" + exit 1 +fi + +# +# Determine URL... +# +JDK_URL=$(wget -qO- http://jdk.java.net/${JDK_FEATURE} | grep -Eo 'href[[:space:]]*=[[:space:]]*"[^\"]+"' | grep -Eo '(http|https)://[^"]+') +if [ "${JDK_FEATURE}" == "${LATEST}" ]; then + JDK_URL=$(echo "${JDK_URL}" | grep -Eo "${JDK_DOWNLOAD}/.+/jdk${JDK_FEATURE}/.+/${JDK_LICENSE}/.*jdk-${JDK_FEATURE}.+linux-x64_bin.tar.gz$") +else + JDK_URL=$(echo "${JDK_URL}" | grep -Eo "${JDK_DOWNLOAD}/.+/jdk${JDK_FEATURE}/.+/.*jdk-${JDK_FEATURE}.+linux-x64_bin.tar.gz$") + if [ "${JDK_LICENSE}" == 'BCL' ]; then + case "${JDK_FEATURE}" in + 9) JDK_URL="${JDK_ORACLE}/9.0.4+11/c2514751926b4512b076cc82f959763f/jdk-9.0.4_linux-x64_bin.tar.gz";; + 10) JDK_URL="${JDK_ORACLE}/10+46/76eac37278c24557a3c4199677f19b62/jdk-10_linux-x64_bin.tar.gz";; + esac + fi +fi + +# +# Inspect URL properties. +# +JDK_ARCHIVE=$(basename ${JDK_URL}) +JDK_STATUS=$(curl -o /dev/null --silent --head --write-out %{http_code} ${JDK_URL}) + +# +# Print variables and exit if dry-run is active. +# +echo " FEATURE = ${JDK_FEATURE}" +echo " LICENSE = ${JDK_LICENSE}" +echo " ARCHIVE = ${JDK_ARCHIVE}" +echo " URL = ${JDK_URL} [${JDK_STATUS}]" +echo +if [ "${DRY_RUN}" == '1' ]; then + exit 0 +fi + +# +# Create any missing intermediate paths, switch to workspace, download, unpack, switch back. +# +mkdir -p ${JDK_WORKSPACE} +cd ${JDK_WORKSPACE} +wget --continue --header "Cookie: oraclelicense=accept-securebackup-cookie" ${JDK_URL} +file ${JDK_ARCHIVE} +JDK_HOME=$(tar --list --auto-compress --file ${JDK_ARCHIVE} | head -1 | cut -f1 -d"/") +tar --extract --auto-compress --file ${JDK_ARCHIVE} +cd ${OLDPWD} + +# +# Update environment variables. +# +export JAVA_HOME=${JDK_WORKSPACE}/${JDK_HOME} +export PATH=${JAVA_HOME}/bin:$PATH + +# +# Link to system certificates. +# - http://openjdk.java.net/jeps/319 +# - https://bugs.openjdk.java.net/browse/JDK-8196141 +# +if [ "${LINK_SYSTEM_CACERTS}" == '1' ]; then + mv "${JAVA_HOME}/lib/security/cacerts" "${JAVA_HOME}/lib/security/cacerts.jdk" + # TODO: Support for other distros than Debian/Ubuntu could be provided + ln -s /etc/ssl/certs/java/cacerts "${JAVA_HOME}/lib/security/cacerts" +fi + +# +# Test-drive. +# +echo +java --version +echo + +# +# Always print value of JAVA_HOME as last line. +# Usage from other scripts or shell: JAVA_HOME=$(./install-jdk.sh -L GPL | tail -n 1) +# +echo ${JAVA_HOME} diff --git a/citest/install-jdk10.sh b/citest/install-jdk10.sh deleted file mode 100755 index 0693a6890..000000000 --- a/citest/install-jdk10.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -# copied from https://github.com/junit-team/junit5/blob/master/src/install/install-jdk-10.sh - -set -e - -JDK_FEATURE=10 -TMP=$(curl -L jdk.java.net/${JDK_FEATURE}) # extract most recent "JDK_BUILD" number from web page source... -TMP="${TMP#*Most recent build: jdk-${JDK_FEATURE}+}" # remove everything before the number -TMP="${TMP%%<*}" # remove everything after the number -JDK_BUILD="$(echo -e "${TMP}" | tr -d '[:space:]')" # remove all whitespace -JDK_ARCHIVE=jdk-${JDK_FEATURE}+${JDK_BUILD}_linux-x64_bin.tar.gz - -cd ~ -wget http://download.java.net/java/jdk${JDK_FEATURE}/archive/${JDK_BUILD}/BCL/${JDK_ARCHIVE} -tar -xzf ${JDK_ARCHIVE} -export JAVA_HOME=~/jdk-${JDK_FEATURE} -export PATH=${JAVA_HOME}/bin:$PATH -cd - -java --version diff --git a/src/universal/bin/sbt-launch-lib.bash b/src/universal/bin/sbt-launch-lib.bash index 37127e7e2..c03c7a771 100755 --- a/src/universal/bin/sbt-launch-lib.bash +++ b/src/universal/bin/sbt-launch-lib.bash @@ -106,19 +106,19 @@ get_mem_opts () { (( $codecache > 128 )) || codecache=128 (( $codecache < 512 )) || codecache=512 local class_metadata_size=$(( $codecache * 2 )) - local class_metadata_opt=$([[ "$java_version" < "8" ]] && echo "MaxPermSize" || echo "MaxMetaspaceSize") + local class_metadata_opt=$((( $java_version < 8 )) && echo "MaxPermSize" || echo "MaxMetaspaceSize") local arg_xms=$([[ "${java_args[@]}" == *-Xms* ]] && echo "" || echo "-Xms${mem}m") local arg_xmx=$([[ "${java_args[@]}" == *-Xmx* ]] && echo "" || echo "-Xmx${mem}m") local arg_rccs=$([[ "${java_args[@]}" == *-XX:ReservedCodeCacheSize* ]] && echo "" || echo "-XX:ReservedCodeCacheSize=${codecache}m") - local arg_meta=$([[ "${java_args[@]}" == *-XX:${class_metadata_opt}* && ! "$java_version" < "8" ]] && echo "" || echo "-XX:${class_metadata_opt}=${class_metadata_size}m") + local arg_meta=$([[ "${java_args[@]}" == *-XX:${class_metadata_opt}* && ! (( $java_version < 8 )) ]] && echo "" || echo "-XX:${class_metadata_opt}=${class_metadata_size}m") echo "${arg_xms} ${arg_xmx} ${arg_rccs} ${arg_meta}" fi } get_gc_opts () { - local older_than_9="$(expr $java_version "<" 9)" + local older_than_9=$(( $java_version < 9 )) if [[ "$older_than_9" == "1" ]]; then # don't need to worry about gc From b2fdb7685fc05f202f3b88536e4b07d61eb06419 Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Thu, 5 Apr 2018 20:53:11 -0400 Subject: [PATCH 2/2] Fix Java version detection on Windows Fixes https://github.com/sbt/sbt/issues/4055 Adds JDK 10 testing on Windows --- .appveyor.yml | 4 ++-- citest/test.bat | 4 ++-- citest/test1.bat | 4 ++-- citest/test2.bat | 4 ++-- citest/test3/test3.bat | 4 ++-- src/universal/bin/sbt.bat | 33 +++++++++++++++++---------------- 6 files changed, 27 insertions(+), 26 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index c822f2293..ef6d53c05 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -5,7 +5,7 @@ init: install: - cinst jdk8 -params 'installdir=C:\\jdk8' - - cinst jdk9 -version 9.0.4.11 -params 'installdir=C:\\jdk9' + - cinst jdk10 -params 'installdir=C:\\jdk10' - SET JAVA_HOME=C:\jdk8 - SET PATH=C:\jdk8\bin;%PATH% @@ -22,7 +22,7 @@ install: - SET SBT_OPTS=-XX:MaxPermSize=2g -Xmx4g -Dfile.encoding=UTF8 test_script: - - sbt "-Dsbt.build.version=1.0.4" universal:packageBin + - sbt "-Dsbt.build.version=1.1.2" universal:packageBin - cd citest - test.bat - test1.bat diff --git a/citest/test.bat b/citest/test.bat index 7d35a6ca6..f1a372b55 100644 --- a/citest/test.bat +++ b/citest/test.bat @@ -9,8 +9,8 @@ SETLOCAL "freshly-baked\sbt\bin\sbt" about -SET JAVA_HOME=C:\jdk9 -SET PATH=C:\jdk9\bin;%PATH% +SET JAVA_HOME=C:\jdk10 +SET PATH=C:\jdk10\bin;%PATH% SET SBT_OPTS=-Xmx4g -Dfile.encoding=UTF8 "freshly-baked\sbt\bin\sbt" about diff --git a/citest/test1.bat b/citest/test1.bat index b02954cd9..a0bbd1169 100644 --- a/citest/test1.bat +++ b/citest/test1.bat @@ -2,8 +2,8 @@ SETLOCAL -SET JAVA_HOME=C:\jdk9 -SET PATH=C:\jdk9\bin;%PATH% +SET JAVA_HOME=C:\jdk10 +SET PATH=C:\jdk10\bin;%PATH% SET SBT_OPTS=-Xmx4g -Dfile.encoding=UTF8 "freshly-baked\sbt\bin\sbt" about 1> output.txt 2> err.txt diff --git a/citest/test2.bat b/citest/test2.bat index b02598217..4a7301ee9 100644 --- a/citest/test2.bat +++ b/citest/test2.bat @@ -2,8 +2,8 @@ SETLOCAL -SET JAVA_HOME=C:\jdk9 -SET PATH=C:\jdk9\bin;%PATH% +SET JAVA_HOME=C:\jdk10 +SET PATH=C:\jdk10\bin;%PATH% SET SBT_OPTS=-Xmx4g -Dfile.encoding=UTF8 "freshly-baked\sbt\bin\sbt" check diff --git a/citest/test3/test3.bat b/citest/test3/test3.bat index 8b3fe5a94..e70f4e38c 100644 --- a/citest/test3/test3.bat +++ b/citest/test3/test3.bat @@ -2,8 +2,8 @@ SETLOCAL -SET JAVA_HOME=C:\jdk9 -SET PATH=C:\jdk9\bin;%PATH% +SET JAVA_HOME=C:\jdk10 +SET PATH=C:\jdk10\bin;%PATH% SET SBT_OPTS=-Xmx4g -Dfile.encoding=UTF8 SET BASE_DIR=%CD% diff --git a/src/universal/bin/sbt.bat b/src/universal/bin/sbt.bat index 13087fe38..ff8507716 100644 --- a/src/universal/bin/sbt.bat +++ b/src/universal/bin/sbt.bat @@ -99,24 +99,25 @@ goto end goto :eof :process -rem parses 1.7, 1.8, 9, etc out of java version "1.8.0_91" -"%_JAVACMD%" -Xmx512M -version 2> "%TEMP%\out.txt" +rem Parses x out of 1.x; for example 8 out of java version 1.8.0_xx +rem Otherwise, parses the major version; 9 out of java version 9-ea set JAVA_VERSION=0 ->nul findstr /c:"version \"9" "%TEMP%\out.txt" -if /I %ERRORLEVEL% EQU 0 (set JAVA_VERSION=9) ->nul findstr /c:"version \"1.8" "%TEMP%\out.txt" -if /I %ERRORLEVEL% EQU 0 (set JAVA_VERSION=1.8) ->nul findstr /c:"version \"1.7" "%TEMP%\out.txt" -if /I %ERRORLEVEL% EQU 0 (set JAVA_VERSION=1.7) ->nul findstr /c:"version \"1.6" "%TEMP%\out.txt" -if /I %ERRORLEVEL% EQU 0 (set JAVA_VERSION=1.6) ->nul findstr /c:"version \"1.5" "%TEMP%\out.txt" -if /I %ERRORLEVEL% EQU 0 (set JAVA_VERSION=1.5) +for /f "tokens=3" %%g in ('%_JAVACMD% -Xms32M -Xmx32M -version 2^>^&1 ^| findstr /i "version"') do ( + set JAVA_VERSION=%%g +) +set JAVA_VERSION=%JAVA_VERSION:"=% +for /f "delims=.-_ tokens=1-2" %%v in ("%JAVA_VERSION%") do ( + if /I "%%v" EQU "1" ( + set JAVA_VERSION=%%w + ) else ( + set JAVA_VERSION=%%v + ) +) exit /B 0 :checkjava -set required_version=1.6 -if /I "%JAVA_VERSION%" GEQ "%required_version%" ( +set required_version=6 +if /I %JAVA_VERSION% GEQ %required_version% ( exit /B 0 ) echo. @@ -130,7 +131,7 @@ echo. exit /B 1 :copyrt -if /I "%JAVA_VERSION%" GEQ "9" ( +if /I %JAVA_VERSION% GEQ 9 ( set rtexport=!SBT_HOME!java9-rt-export.jar "%_JAVACMD%" %_JAVA_OPTS% %SBT_OPTS% -jar "!rtexport!" --rt-ext-dir > "%TEMP%.\rtext.txt" @@ -160,7 +161,7 @@ if "%INIT_SBT_VERSION%"=="" ( ) ) set PRELOAD_SBT_JAR="%UserProfile%\.sbt\preloaded\org.scala-sbt\sbt\%INIT_SBT_VERSION%\jars\sbt.jar" -if /I "%JAVA_VERSION%" GEQ "1.8" ( +if /I %JAVA_VERSION% GEQ 8 ( where robocopy >nul 2>nul if %ERRORLEVEL% equ 0 ( REM echo %PRELOAD_SBT_JAR%