From 4c0b73f72630fa7b07bc92dcf4855327265911f1 Mon Sep 17 00:00:00 2001 From: Jan Materne Date: Wed, 9 Apr 2014 14:18:00 +0000 Subject: [PATCH] detect Java9 git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@1585981 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/tools/ant/taskdefs/Javac.java | 16 ++++++-- .../apache/tools/ant/util/JavaEnvUtils.java | 40 ++++++++++++++++--- .../ant/util/facade/FacadeTaskHelper.java | 10 ++--- .../tools/ant/util/JavaEnvUtilsTest.java | 2 +- 4 files changed, 52 insertions(+), 16 deletions(-) diff --git a/src/main/org/apache/tools/ant/taskdefs/Javac.java b/src/main/org/apache/tools/ant/taskdefs/Javac.java index aa8445a6f..53dfdf175 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Javac.java +++ b/src/main/org/apache/tools/ant/taskdefs/Javac.java @@ -80,6 +80,7 @@ public class Javac extends MatchingTask { private static final String FAIL_MSG = "Compile failed; see the compiler error output for details."; + private static final String JAVAC19 = "javac1.9"; private static final String JAVAC18 = "javac1.8"; private static final String JAVAC17 = "javac1.7"; private static final String JAVAC16 = "javac1.6"; @@ -152,6 +153,8 @@ public class Javac extends MatchingTask { return JAVAC17; } else if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_8)) { return JAVAC18; + } else if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_9)) { + return JAVAC19; } else { return CLASSIC; } @@ -767,8 +770,9 @@ public class Javac extends MatchingTask { } private String getAltCompilerName(String anImplementation) { - if (JAVAC17.equalsIgnoreCase(anImplementation) + if (JAVAC19.equalsIgnoreCase(anImplementation) || JAVAC18.equalsIgnoreCase(anImplementation) + || JAVAC17.equalsIgnoreCase(anImplementation) || JAVAC16.equalsIgnoreCase(anImplementation) || JAVAC15.equalsIgnoreCase(anImplementation) || JAVAC14.equalsIgnoreCase(anImplementation) @@ -781,8 +785,9 @@ public class Javac extends MatchingTask { } if (MODERN.equalsIgnoreCase(anImplementation)) { String nextSelected = assumedJavaVersion(); - if (JAVAC17.equalsIgnoreCase(nextSelected) + if (JAVAC19.equalsIgnoreCase(nextSelected) || JAVAC18.equalsIgnoreCase(nextSelected) + || JAVAC17.equalsIgnoreCase(nextSelected) || JAVAC16.equalsIgnoreCase(nextSelected) || JAVAC15.equalsIgnoreCase(nextSelected) || JAVAC14.equalsIgnoreCase(nextSelected) @@ -1013,12 +1018,13 @@ public class Javac extends MatchingTask { * * @param compilerImpl the name of the compiler implementation * @return true if compilerImpl is "modern", "classic", - * "javac1.1", "javac1.2", "javac1.3", "javac1.4", "javac1.5" or - * "javac1.6". + * "javac1.1", "javac1.2", "javac1.3", "javac1.4", "javac1.5", + * "javac1.6", "javac1.7", "javac1.8" or "javac1.9". */ protected boolean isJdkCompiler(String compilerImpl) { return MODERN.equals(compilerImpl) || CLASSIC.equals(compilerImpl) + || JAVAC19.equals(compilerImpl) || JAVAC18.equals(compilerImpl) || JAVAC17.equals(compilerImpl) || JAVAC16.equals(compilerImpl) @@ -1243,6 +1249,7 @@ public class Javac extends MatchingTask { } } } + private static final byte[] PACKAGE_INFO_CLASS_HEADER = { (byte) 0xca, (byte) 0xfe, (byte) 0xba, (byte) 0xbe, 0x00, 0x00, 0x00, 0x31, 0x00, 0x07, 0x07, 0x00, 0x05, 0x07, 0x00, 0x06, 0x01, 0x00, 0x0a, @@ -1250,6 +1257,7 @@ public class Javac extends MatchingTask { 0x11, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x2e, 0x6a, 0x61, 0x76, 0x61, 0x01 }; + private static final byte[] PACKAGE_INFO_CLASS_FOOTER = { 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2d, 0x69, 0x6e, 0x66, 0x6f, 0x01, 0x00, 0x10, 0x6a, 0x61, 0x76, 0x61, 0x2f, 0x6c, 0x61, 0x6e, diff --git a/src/main/org/apache/tools/ant/util/JavaEnvUtils.java b/src/main/org/apache/tools/ant/util/JavaEnvUtils.java index 90d4cc886..a330d8947 100644 --- a/src/main/org/apache/tools/ant/util/JavaEnvUtils.java +++ b/src/main/org/apache/tools/ant/util/JavaEnvUtils.java @@ -17,11 +17,12 @@ */ package org.apache.tools.ant.util; +import java.io.BufferedWriter; import java.io.File; -import java.io.IOException; import java.io.FileWriter; -import java.io.BufferedWriter; +import java.io.IOException; import java.util.Vector; + import org.apache.tools.ant.taskdefs.condition.Os; /** @@ -99,6 +100,11 @@ public final class JavaEnvUtils { /** Number Version constant for Java 1.8 */ public static final int VERSION_1_8 = 18; + /** Version constant for Java 1.9 */ + public static final String JAVA_1_9 = "1.9"; + /** Number Version constant for Java 1.9 */ + public static final int VERSION_1_9 = 19; + /** Whether this is the Kaffe VM */ private static boolean kaffeDetected; @@ -152,6 +158,9 @@ public final class JavaEnvUtils { Class.forName("java.lang.reflect.Executable"); javaVersion = JAVA_1_8; javaVersionNumber++; + checkForJava9(); + javaVersion = JAVA_1_9; + javaVersionNumber++; } catch (Throwable t) { // swallow as we've hit the max class version that // we have @@ -196,6 +205,24 @@ public final class JavaEnvUtils { /** + * Checks for a give Java 9 runtime. + * At the time of writing the actual version of the JDK was 1.9.0_b06. + * Searching for new classes gave no hits, so we need another aproach. + * Searching for changes (grep -r -i -n "@since 1.9" .) in the sources gave + * only one hit: a new constant in the class SourceVersion. + * So we have to check that ... + * + * @throws An exception if we can't load the class or don't find the new constant. + * This is the behavior when searching for new features on older versions. + * @since Ant 1.9.4 + */ + private static void checkForJava9() throws Exception { + Class clazz = Class.forName("javax.lang.model.SourceVersion"); + clazz.getDeclaredField("RELEASE_9"); + } + + + /** * Returns the version of Java this class is running under. * This number can be used for comparisons; it will always be * @return the version of Java as a number 10x the major/minor, @@ -398,6 +425,7 @@ public final class JavaEnvUtils { private static void buildJrePackages() { jrePackages = new Vector(); switch(javaVersionNumber) { + case VERSION_1_9: case VERSION_1_8: case VERSION_1_7: case VERSION_1_6: @@ -446,20 +474,22 @@ public final class JavaEnvUtils { * Testing helper method; kept here for unification of changes. * @return a list of test classes depending on the java version. */ - public static Vector getJrePackageTestCases() { - Vector tests = new Vector(); + public static Vector getJrePackageTestCases() { + Vector tests = new Vector(); tests.addElement("java.lang.Object"); switch(javaVersionNumber) { + case VERSION_1_9: case VERSION_1_8: case VERSION_1_7: case VERSION_1_6: case VERSION_1_5: tests.addElement( "com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl "); - // Fall tru + // Fall through case VERSION_1_4: tests.addElement("sun.audio.AudioPlayer"); if (javaVersionNumber == VERSION_1_4) { + // only for 1.4, not for higher versions which fall through tests.addElement("org.apache.crimson.parser.ContentModel"); tests.addElement("org.apache.xalan.processor.ProcessorImport"); tests.addElement("org.apache.xml.utils.URI"); diff --git a/src/main/org/apache/tools/ant/util/facade/FacadeTaskHelper.java b/src/main/org/apache/tools/ant/util/facade/FacadeTaskHelper.java index 08d477d38..4fb4341be 100644 --- a/src/main/org/apache/tools/ant/util/facade/FacadeTaskHelper.java +++ b/src/main/org/apache/tools/ant/util/facade/FacadeTaskHelper.java @@ -19,8 +19,8 @@ package org.apache.tools.ant.util.facade; import java.util.ArrayList; -import java.util.Iterator; import java.util.List; + import org.apache.tools.ant.Project; import org.apache.tools.ant.types.Path; @@ -37,7 +37,7 @@ public class FacadeTaskHelper { /** * Command line arguments. */ - private List args = new ArrayList(); + private List args = new ArrayList(); /** * The explicitly chosen implementation. @@ -126,10 +126,8 @@ public class FacadeTaskHelper { * @return an array of command line arguments. */ public String[] getArgs() { - List tmp = new ArrayList(args.size()); - for (Iterator e = args.iterator(); e.hasNext();) { - ImplementationSpecificArgument arg = - ((ImplementationSpecificArgument) e.next()); + List tmp = new ArrayList(args.size()); + for (ImplementationSpecificArgument arg : args) { String[] curr = arg.getParts(getImplementation()); if (curr != null) { for (int i = 0; i < curr.length; i++) { diff --git a/src/tests/junit/org/apache/tools/ant/util/JavaEnvUtilsTest.java b/src/tests/junit/org/apache/tools/ant/util/JavaEnvUtilsTest.java index 8172bd991..9dd64e14b 100644 --- a/src/tests/junit/org/apache/tools/ant/util/JavaEnvUtilsTest.java +++ b/src/tests/junit/org/apache/tools/ant/util/JavaEnvUtilsTest.java @@ -136,5 +136,5 @@ public class JavaEnvUtilsTest extends TestCase { "In case the current java version is higher than 9.0 definitely a new algorithem will be needed", JavaEnvUtils.isAtLeastJavaVersion("9.0")); } - + }