diff --git a/.gitignore b/.gitignore index 0e957ded..ea1c5492 100755 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ _site/ /Gemfile.lock /push_docs.sh /copy_blog.sh +*/out/* \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index bd0d9c30..2beab436 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,8 @@ language: java sudo: false -install: gradle -q assemble -script: gradle -i check +install: ./gradlew -q assemble +script: ./gradlew -i check jdk: - - oraclejdk7 - oraclejdk8 branches: @@ -13,12 +12,9 @@ branches: env: global: - TERM=dumb - - secure: "XzCjWbN5BM2ioZy+1GVcFuHVUwX8YHjuved7gZ0CAHp1pMyhPudzZqlLZ2ZWKv44sVS/ZM4ylwbO4JFGyJcobd5/CeP+iJpYPRGas4EYWIuA882K3NgBEn8smnaxy/PcrQwl9QVhnMrsVu8KrmB/dHwBphMyfAT65+2eiQbQWRk=" after_success: - - gradle jacocoRootReport coveralls -# - bash <(curl -s https://codecov.io/bash) + - ./gradlew jacocoRootReport coveralls + - bash <(curl -s https://codecov.io/bash) -notifications: - slack: puniverse:OsnbakHrYeTcLyalVgtUeI4F diff --git a/capsule-util/src/main/java/co/paralleluniverse/capsule/Jar.java b/capsule-util/src/main/java/co/paralleluniverse/capsule/Jar.java index d957e41d..f4e27c94 100644 --- a/capsule-util/src/main/java/co/paralleluniverse/capsule/Jar.java +++ b/capsule-util/src/main/java/co/paralleluniverse/capsule/Jar.java @@ -37,7 +37,7 @@ import java.util.jar.JarInputStream; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; -import java.util.jar.Pack200; +//import java.util.jar.Pack200; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import static java.nio.charset.StandardCharsets.UTF_8; @@ -56,7 +56,7 @@ public class Jar { private final Manifest manifest; private final JarInputStream jis; private JarOutputStream jos; - private Pack200.Packer packer; + //private Pack200.Packer packer; private String jarPrefixStr; private Path jarPrefixFile; private boolean sealed; @@ -567,10 +567,10 @@ private static void addEntry(JarOutputStream jarOut, String path, byte[] data) t * @param packer * @return {@code this} */ - public Jar setPacker(Pack200.Packer packer) { + /*public Jar setPacker(Pack200.Packer packer) { this.packer = packer; return this; - } + }*/ /** * If set to true true, a header will be added to the JAR file when written, that will make the JAR an executable file in POSIX environments. @@ -706,9 +706,9 @@ public T write(T os) throws IOException { throw new IllegalStateException("Cannot write to another target if setOutputStream has been called"); final byte[] content = ((ByteArrayOutputStream) this.os).toByteArray(); - if (packer != null) + /*if (packer != null) packer.pack(new JarInputStream(new ByteArrayInputStream(content)), os); - else + else*/ os.write(content); os.close(); diff --git a/capsule-util/src/main/java/co/paralleluniverse/common/PathClassLoader.java b/capsule-util/src/main/java/co/paralleluniverse/common/PathClassLoader.java index b14fa04b..d93e199d 100644 --- a/capsule-util/src/main/java/co/paralleluniverse/common/PathClassLoader.java +++ b/capsule-util/src/main/java/co/paralleluniverse/common/PathClassLoader.java @@ -54,7 +54,7 @@ private static Object[] process(Path[] paths) throws IOException { final Path p = paths[i]; final Object o; if (Files.isRegularFile(p)) - o = FileSystems.newFileSystem(p, null); + o = FileSystems.newFileSystem(p.toUri(), null, null); else o = p; os[i] = o; diff --git a/capsule/src/main/java/Capsule.java b/capsule/src/main/java/Capsule.java index b40cfbea..e359ec62 100644 --- a/capsule/src/main/java/Capsule.java +++ b/capsule/src/main/java/Capsule.java @@ -4160,17 +4160,19 @@ private static Path getJavaExecutable0(Path javaHome) { return javaHome.resolve("bin").resolve(exec + (isWindows() ? ".exe" : "")); } - private static final Pattern PAT_JAVA_VERSION_LINE = Pattern.compile(".*?\"(.+?)\""); + private static final Pattern PAT_JAVA_VERSION_LINE = Pattern.compile(".*?\"(.+?)\".*"); + + static String parseJavaVersionLine(String versionLine) { + final Matcher m = PAT_JAVA_VERSION_LINE.matcher(versionLine); + if (!m.matches()) + throw new IllegalArgumentException("Could not parse version line: " + versionLine); + return m.group(1); + } private static String getActualJavaVersion(Path javaHome) { try { final String versionLine = first(exec(1, true, new ProcessBuilder(asList(getJavaExecutable0(javaHome).toString(), "-version")))); - final Matcher m = PAT_JAVA_VERSION_LINE.matcher(versionLine); - if (!m.matches()) - throw new IllegalArgumentException("Could not parse version line: " + versionLine); - final String version = m.group(1); - - return version; + return parseJavaVersionLine(versionLine); } catch (Exception e) { throw rethrow(e); } @@ -4250,7 +4252,7 @@ private static boolean equals(int[] a, int[] b, int n) { return true; } - private static final Pattern PAT_JAVA_VERSION = Pattern.compile("(?\\d+)(\\.(?\\d+))?(?:\\.(?\\d+))?(_(?\\d+))?(-(?
[^-]+))?(-(?.+))?");
+    private static final Pattern PAT_JAVA_VERSION = Pattern.compile("(?\\d+)(\\.(?\\d+))?(?:\\.(?\\d+))?[0-9.]*(_(?\\d+))?(-(?
[^-]+))?(-(?.+))?");
 
     // visible for testing
     static int[] parseJavaVersion(String v) {
diff --git a/capsule/src/test/java/CapsuleTest.java b/capsule/src/test/java/CapsuleTest.java
index ca73a42d..487930f6 100644
--- a/capsule/src/test/java/CapsuleTest.java
+++ b/capsule/src/test/java/CapsuleTest.java
@@ -1292,6 +1292,10 @@ public void testParseJavaVersion() {
         ver = Capsule.parseJavaVersion("1.8.0_30-ea");
         assertArrayEquals(ver, ints(1, 8, 0, 30, -3));
         assertEquals("1.8.0_30-ea", Capsule.toJavaVersionString(ver));
+
+        ver = Capsule.parseJavaVersion("11.0.14.1");
+        assertArrayEquals(ver, ints(1, 11, 14, 0, 0));
+        assertEquals("1.11.14", Capsule.toJavaVersionString(ver));
     }
 
     @Test
@@ -1571,6 +1575,15 @@ public void testPathingJar() throws Exception {
     }
     //
 
+    @Test
+    public void testParseJavaVersionLine() {
+        assertEquals("1.8.0_161",   Capsule.parseJavaVersionLine("java version \"1.8.0_161\""));
+        assertEquals("9.0.4",       Capsule.parseJavaVersionLine("java version \"9.0.4\""));
+        assertEquals("10",          Capsule.parseJavaVersionLine("java version \"10\" 2018-03-20"));
+        assertEquals("11",          Capsule.parseJavaVersionLine("java version \"11\" 2018-09-25"));
+        assertEquals("10.0.2",      Capsule.parseJavaVersionLine("openjdk version \"10.0.2\" 2018-07-17"));
+    }
+
     //
     /////////// Utilities ///////////////////////////////////
     // may be called once per test (always writes jar into /capsule.jar)
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 00000000..28861d27
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..115e6ac0
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-bin.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
new file mode 100755
index 00000000..cccdd3d5
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+    echo "$*"
+}
+
+die () {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Escape application args
+save () {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+  cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"