https://bz.apache.org/bugzilla/show_bug.cgi?id=59863master
| @@ -9,6 +9,9 @@ Changes that could break older environments: | |||||
| same instance. This will now cause the build to fail. | same instance. This will now cause the build to fail. | ||||
| Bugzilla Report 59402 | Bugzilla Report 59402 | ||||
| * The ant.java.version property will now hold the value "9" rather | |||||
| than "1.9" if running on Java 9. | |||||
| Fixed bugs: | Fixed bugs: | ||||
| ----------- | ----------- | ||||
| @@ -79,7 +79,8 @@ attribute are:</a></p> | |||||
| <code>javac1.6</code> and | <code>javac1.6</code> and | ||||
| <code>javac1.7</code> (<em>since Ant 1.8.2</em>) and | <code>javac1.7</code> (<em>since Ant 1.8.2</em>) and | ||||
| <code>javac1.8</code> (<em>since Ant 1.8.3</em>) and</li> | <code>javac1.8</code> (<em>since Ant 1.8.3</em>) and</li> | ||||
| <code>javac1.9</code> (<em>since Ant 1.9.5</em>) can be used as aliases.</li> | |||||
| <code>javac1.9</code> (<em>since Ant 1.9.5</em>) and</li> | |||||
| <code>javac9</code> (<em>since Ant 1.9.8</em>) can be used as aliases.</li> | |||||
| <li><code>jikes</code> (the <a | <li><code>jikes</code> (the <a | ||||
| href="http://jikes.sourceforge.net/" target="_top">Jikes</a> | href="http://jikes.sourceforge.net/" target="_top">Jikes</a> | ||||
| compiler).</li> | compiler).</li> | ||||
| @@ -84,7 +84,7 @@ ant.project.invoked-targets | |||||
| will contain the project's default target in this | will contain the project's default target in this | ||||
| case for tasks nested into targets.. | case for tasks nested into targets.. | ||||
| ant.java.version the JVM version Ant detected; currently it can hold | ant.java.version the JVM version Ant detected; currently it can hold | ||||
| the values "1.9", "1.8", | |||||
| the values "9", "1.8", | |||||
| "1.7", "1.6", "1.5", | "1.7", "1.6", "1.5", | ||||
| "1.4", "1.3" and | "1.4", "1.3" and | ||||
| "1.2". | "1.2". | ||||
| @@ -85,6 +85,7 @@ public class Javac extends MatchingTask { | |||||
| private static final String FAIL_MSG | private static final String FAIL_MSG | ||||
| = "Compile failed; see the compiler error output for details."; | = "Compile failed; see the compiler error output for details."; | ||||
| private static final String JAVAC9 = "javac9"; | |||||
| private static final String JAVAC19 = "javac1.9"; | private static final String JAVAC19 = "javac1.9"; | ||||
| private static final String JAVAC18 = "javac1.8"; | private static final String JAVAC18 = "javac1.8"; | ||||
| private static final String JAVAC17 = "javac1.7"; | private static final String JAVAC17 = "javac1.7"; | ||||
| @@ -166,8 +167,8 @@ public class Javac extends MatchingTask { | |||||
| return JAVAC17; | return JAVAC17; | ||||
| } else if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_8)) { | } else if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_8)) { | ||||
| return JAVAC18; | return JAVAC18; | ||||
| } else if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_9)) { | |||||
| return JAVAC19; | |||||
| } else if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_9)) { | |||||
| return JAVAC9; | |||||
| } else { | } else { | ||||
| return CLASSIC; | return CLASSIC; | ||||
| } | } | ||||
| @@ -912,7 +913,8 @@ public class Javac extends MatchingTask { | |||||
| } | } | ||||
| private String getAltCompilerName(final String anImplementation) { | private String getAltCompilerName(final String anImplementation) { | ||||
| if (JAVAC19.equalsIgnoreCase(anImplementation) | |||||
| if (JAVAC9.equalsIgnoreCase(anImplementation) | |||||
| || JAVAC19.equalsIgnoreCase(anImplementation) | |||||
| || JAVAC18.equalsIgnoreCase(anImplementation) | || JAVAC18.equalsIgnoreCase(anImplementation) | ||||
| || JAVAC17.equalsIgnoreCase(anImplementation) | || JAVAC17.equalsIgnoreCase(anImplementation) | ||||
| || JAVAC16.equalsIgnoreCase(anImplementation) | || JAVAC16.equalsIgnoreCase(anImplementation) | ||||
| @@ -927,7 +929,7 @@ public class Javac extends MatchingTask { | |||||
| } | } | ||||
| if (MODERN.equalsIgnoreCase(anImplementation)) { | if (MODERN.equalsIgnoreCase(anImplementation)) { | ||||
| final String nextSelected = assumedJavaVersion(); | final String nextSelected = assumedJavaVersion(); | ||||
| if (JAVAC19.equalsIgnoreCase(nextSelected) | |||||
| if (JAVAC9.equalsIgnoreCase(nextSelected) | |||||
| || JAVAC18.equalsIgnoreCase(nextSelected) | || JAVAC18.equalsIgnoreCase(nextSelected) | ||||
| || JAVAC17.equalsIgnoreCase(nextSelected) | || JAVAC17.equalsIgnoreCase(nextSelected) | ||||
| || JAVAC16.equalsIgnoreCase(nextSelected) | || JAVAC16.equalsIgnoreCase(nextSelected) | ||||
| @@ -1194,12 +1196,12 @@ public class Javac extends MatchingTask { | |||||
| * @param compilerImpl the name of the compiler implementation | * @param compilerImpl the name of the compiler implementation | ||||
| * @return true if compilerImpl is "modern", "classic", | * @return true if compilerImpl is "modern", "classic", | ||||
| * "javac1.1", "javac1.2", "javac1.3", "javac1.4", "javac1.5", | * "javac1.1", "javac1.2", "javac1.3", "javac1.4", "javac1.5", | ||||
| * "javac1.6", "javac1.7", "javac1.8" or "javac1.9". | |||||
| * "javac1.6", "javac1.7", "javac1.8", "javac1.9" or "javac9". | |||||
| */ | */ | ||||
| protected boolean isJdkCompiler(final String compilerImpl) { | protected boolean isJdkCompiler(final String compilerImpl) { | ||||
| return MODERN.equals(compilerImpl) | return MODERN.equals(compilerImpl) | ||||
| || CLASSIC.equals(compilerImpl) | || CLASSIC.equals(compilerImpl) | ||||
| || JAVAC19.equals(compilerImpl) | |||||
| || JAVAC9.equals(compilerImpl) | |||||
| || JAVAC18.equals(compilerImpl) | || JAVAC18.equals(compilerImpl) | ||||
| || JAVAC17.equals(compilerImpl) | || JAVAC17.equals(compilerImpl) | ||||
| || JAVAC16.equals(compilerImpl) | || JAVAC16.equals(compilerImpl) | ||||
| @@ -122,7 +122,8 @@ public final class CompilerAdapterFactory { | |||||
| || compilerType.equalsIgnoreCase("javac1.6") | || compilerType.equalsIgnoreCase("javac1.6") | ||||
| || compilerType.equalsIgnoreCase("javac1.7") | || compilerType.equalsIgnoreCase("javac1.7") | ||||
| || compilerType.equalsIgnoreCase("javac1.8") | || compilerType.equalsIgnoreCase("javac1.8") | ||||
| || compilerType.equalsIgnoreCase("javac1.9")) { | |||||
| || compilerType.equalsIgnoreCase("javac1.9") | |||||
| || compilerType.equalsIgnoreCase("javac9")) { | |||||
| // does the modern compiler exist? | // does the modern compiler exist? | ||||
| if (doesModernCompilerExist()) { | if (doesModernCompilerExist()) { | ||||
| return new Javac13(); | return new Javac13(); | ||||
| @@ -672,12 +672,23 @@ public abstract class DefaultCompilerAdapter | |||||
| } | } | ||||
| /** | /** | ||||
| * Shall we assume JDK 1.9 command line switches? | |||||
| * @return true if JDK 1.9 | |||||
| * Shall we assume JDK 9 command line switches? | |||||
| * @return true if JDK 9 | |||||
| * @since Ant 1.9.4 | * @since Ant 1.9.4 | ||||
| * @deprecated use #assumeJava9 instead | |||||
| */ | */ | ||||
| protected boolean assumeJava19() { | protected boolean assumeJava19() { | ||||
| return assumeJavaXY("javac1.9", JavaEnvUtils.JAVA_1_9); | |||||
| return assumeJavaXY("javac1.9", JavaEnvUtils.JAVA_9) | |||||
| || assumeJavaXY("javac9", JavaEnvUtils.JAVA_9); | |||||
| } | |||||
| /** | |||||
| * Shall we assume JDK 9 command line switches? | |||||
| * @return true if JDK 9 | |||||
| * @since Ant 1.9.8 | |||||
| */ | |||||
| protected boolean assumeJava9() { | |||||
| return assumeJava19(); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -686,12 +697,10 @@ public abstract class DefaultCompilerAdapter | |||||
| */ | */ | ||||
| private boolean assumeJavaXY(final String javacXY, final String javaEnvVersionXY) { | private boolean assumeJavaXY(final String javacXY, final String javaEnvVersionXY) { | ||||
| return javacXY.equals(attributes.getCompilerVersion()) | return javacXY.equals(attributes.getCompilerVersion()) | ||||
| || ("classic".equals(attributes.getCompilerVersion()) | |||||
| && JavaEnvUtils.isJavaVersion(javaEnvVersionXY)) | |||||
| || ("modern".equals(attributes.getCompilerVersion()) | |||||
| && JavaEnvUtils.isJavaVersion(javaEnvVersionXY)) | |||||
| || ("extJavac".equals(attributes.getCompilerVersion()) | |||||
| && JavaEnvUtils.isJavaVersion(javaEnvVersionXY)); | |||||
| || (JavaEnvUtils.isJavaVersion(javaEnvVersionXY) && | |||||
| ("classic".equals(attributes.getCompilerVersion()) | |||||
| || "modern".equals(attributes.getCompilerVersion()) | |||||
| || "extJavac".equals(attributes.getCompilerVersion()))); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -755,8 +764,8 @@ public abstract class DefaultCompilerAdapter | |||||
| if (assumeJava18()) { | if (assumeJava18()) { | ||||
| return "1.8 in JDK 1.8"; | return "1.8 in JDK 1.8"; | ||||
| } | } | ||||
| if (assumeJava19()) { | |||||
| return "1.9 in JDK 1.9"; | |||||
| if (assumeJava9()) { | |||||
| return "9 in JDK 9"; | |||||
| } | } | ||||
| return ""; | return ""; | ||||
| } | } | ||||
| @@ -782,7 +791,7 @@ public abstract class DefaultCompilerAdapter | |||||
| && !assumeJava15() && !assumeJava16()) | && !assumeJava15() && !assumeJava16()) | ||||
| || (t.equals("7") && !assumeJava17()) | || (t.equals("7") && !assumeJava17()) | ||||
| || (t.equals("8") && !assumeJava18()) | || (t.equals("8") && !assumeJava18()) | ||||
| || (t.equals("9") && !assumeJava19()); | |||||
| || (t.equals("9") && !assumeJava9()); | |||||
| } | } | ||||
| @@ -55,6 +55,9 @@ public final class JavaEnvUtils { | |||||
| /** floating version of the JVM */ | /** floating version of the JVM */ | ||||
| private static int javaVersionNumber; | private static int javaVersionNumber; | ||||
| /** Version of currently running VM. */ | |||||
| private static final DeweyDecimal parsedJavaVersion; | |||||
| /** Version constant for Java 1.0 */ | /** Version constant for Java 1.0 */ | ||||
| public static final String JAVA_1_0 = "1.0"; | public static final String JAVA_1_0 = "1.0"; | ||||
| /** Number Version constant for Java 1.0 */ | /** Number Version constant for Java 1.0 */ | ||||
| @@ -100,11 +103,28 @@ public final class JavaEnvUtils { | |||||
| /** Number Version constant for Java 1.8 */ | /** Number Version constant for Java 1.8 */ | ||||
| public static final int VERSION_1_8 = 18; | public static final int VERSION_1_8 = 18; | ||||
| /** Version constant for Java 1.9 */ | |||||
| /** | |||||
| * Version constant for Java 1.9 | |||||
| * @deprecated use #JAVA_9 instead | |||||
| */ | |||||
| public static final String JAVA_1_9 = "1.9"; | public static final String JAVA_1_9 = "1.9"; | ||||
| /** Number Version constant for Java 1.9 */ | |||||
| /** | |||||
| * Number Version constant for Java 1.9 | |||||
| * @deprecated use #VERSION_9 instead | |||||
| */ | |||||
| public static final int VERSION_1_9 = 19; | public static final int VERSION_1_9 = 19; | ||||
| /** | |||||
| * Version constant for Java 9 | |||||
| * @since Ant 1.9.8 | |||||
| */ | |||||
| public static final String JAVA_9 = "9"; | |||||
| /** | |||||
| * Number Version constant for Java 9 | |||||
| * @since Ant 1.9.8 | |||||
| */ | |||||
| public static final int VERSION_9 = 90; | |||||
| /** Whether this is the Kaffe VM */ | /** Whether this is the Kaffe VM */ | ||||
| private static boolean kaffeDetected; | private static boolean kaffeDetected; | ||||
| @@ -158,13 +178,14 @@ public final class JavaEnvUtils { | |||||
| Class.forName("java.lang.reflect.Executable"); | Class.forName("java.lang.reflect.Executable"); | ||||
| javaVersion = JAVA_1_8; | javaVersion = JAVA_1_8; | ||||
| javaVersionNumber++; | javaVersionNumber++; | ||||
| checkForJava9(); | |||||
| javaVersion = JAVA_1_9; | |||||
| javaVersionNumber++; | |||||
| Class.forName("java.lang.module.ModuleDescriptor"); | |||||
| javaVersion = JAVA_9; | |||||
| javaVersionNumber = VERSION_9; | |||||
| } catch (Throwable t) { | } catch (Throwable t) { | ||||
| // swallow as we've hit the max class version that | // swallow as we've hit the max class version that | ||||
| // we have | // we have | ||||
| } | } | ||||
| parsedJavaVersion = new DeweyDecimal(javaVersion); | |||||
| kaffeDetected = false; | kaffeDetected = false; | ||||
| try { | try { | ||||
| Class.forName("kaffe.util.NotImplemented"); | Class.forName("kaffe.util.NotImplemented"); | ||||
| @@ -197,7 +218,11 @@ public final class JavaEnvUtils { | |||||
| /** | /** | ||||
| * Returns the version of Java this class is running under. | * Returns the version of Java this class is running under. | ||||
| * @return the version of Java as a String, e.g. "1.6" | |||||
| * | |||||
| * <p>Up until Java 8 Java version numbers were 1.VERSION - | |||||
| * e.g. 1.8.x for Java 8, starting with Java 9 it became 9.x.</p> | |||||
| * | |||||
| * @return the version of Java as a String, e.g. "1.6" or "9" | |||||
| */ | */ | ||||
| public static String getJavaVersion() { | public static String getJavaVersion() { | ||||
| return javaVersion; | return javaVersion; | ||||
| @@ -205,31 +230,28 @@ 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 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 | |||||
| * Returns the version of Java this class is running under. | |||||
| * <p>This number can be used for comparisons.</p> | |||||
| * @return the version of Java as a number 10x the major/minor, | |||||
| * e.g Java1.5 has a value of 15 and Java9 the value 90 - major | |||||
| * will be 1 for all versions of Java prior to Java 9, minor will | |||||
| * be 0 for all versions of Java starting with Java 9. | |||||
| * @deprecated use #getParsedJavaVersion instead | |||||
| */ | */ | ||||
| private static void checkForJava9() throws Exception { | |||||
| Class<?> clazz = Class.forName("javax.lang.model.SourceVersion"); | |||||
| clazz.getDeclaredField("RELEASE_9"); | |||||
| public static int getJavaVersionNumber() { | |||||
| return javaVersionNumber; | |||||
| } | } | ||||
| /** | /** | ||||
| * Returns the version of Java this class is running under. | * 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, | |||||
| * e.g Java1.5 has a value of 15 | |||||
| * <p>This number can be used for comparisons.</p> | |||||
| * @return the version of Java as major.minor, e.g Java1.5 has a | |||||
| * value of 1.5 and Java9 the value 9 - major will be 1 for all | |||||
| * versions of Java prior to Java 9, minor will be 0 for all | |||||
| * versions of Java starting with Java 9. | |||||
| */ | */ | ||||
| public static int getJavaVersionNumber() { | |||||
| return javaVersionNumber; | |||||
| public static DeweyDecimal getParsedJavaVersion() { | |||||
| return parsedJavaVersion; | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -243,7 +265,8 @@ public final class JavaEnvUtils { | |||||
| * @since Ant 1.5 | * @since Ant 1.5 | ||||
| */ | */ | ||||
| public static boolean isJavaVersion(String version) { | public static boolean isJavaVersion(String version) { | ||||
| return javaVersion.equals(version); | |||||
| return javaVersion.equals(version) | |||||
| || (javaVersion.equals(JAVA_9) && JAVA_1_9.equals(version)); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -258,7 +281,7 @@ public final class JavaEnvUtils { | |||||
| * @since Ant 1.7 | * @since Ant 1.7 | ||||
| */ | */ | ||||
| public static boolean isAtLeastJavaVersion(String version) { | public static boolean isAtLeastJavaVersion(String version) { | ||||
| return javaVersion.compareTo(version) >= 0; | |||||
| return parsedJavaVersion.compareTo(new DeweyDecimal(version)) >= 0; | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -385,7 +408,7 @@ public final class JavaEnvUtils { | |||||
| // fall back to JRE bin directory, also catches JDK 1.0 and 1.1 | // fall back to JRE bin directory, also catches JDK 1.0 and 1.1 | ||||
| // where java.home points to the root of the JDK and Mac OS X where | // where java.home points to the root of the JDK and Mac OS X where | ||||
| // the whole directory layout is different from Sun's | // the whole directory layout is different from Sun's | ||||
| // and also catches JDK 1.9 (and probably later) which | |||||
| // and also catches JDK 9 (and probably later) which | |||||
| // merged JDK and JRE dirs | // merged JDK and JRE dirs | ||||
| return getJreExecutable(command); | return getJreExecutable(command); | ||||
| } | } | ||||
| @@ -427,7 +450,7 @@ public final class JavaEnvUtils { | |||||
| private static void buildJrePackages() { | private static void buildJrePackages() { | ||||
| jrePackages = new Vector<String>(); | jrePackages = new Vector<String>(); | ||||
| switch(javaVersionNumber) { | switch(javaVersionNumber) { | ||||
| case VERSION_1_9: | |||||
| case VERSION_9: | |||||
| case VERSION_1_8: | case VERSION_1_8: | ||||
| case VERSION_1_7: | case VERSION_1_7: | ||||
| jrePackages.addElement("jdk"); | jrePackages.addElement("jdk"); | ||||
| @@ -482,7 +505,7 @@ public final class JavaEnvUtils { | |||||
| Vector<String> tests = new Vector<String>(); | Vector<String> tests = new Vector<String>(); | ||||
| tests.addElement("java.lang.Object"); | tests.addElement("java.lang.Object"); | ||||
| switch(javaVersionNumber) { | switch(javaVersionNumber) { | ||||
| case VERSION_1_9: | |||||
| case VERSION_9: | |||||
| case VERSION_1_8: | case VERSION_1_8: | ||||
| case VERSION_1_7: | case VERSION_1_7: | ||||
| tests.addElement("jdk.net.Sockets"); | tests.addElement("jdk.net.Sockets"); | ||||
| @@ -185,6 +185,37 @@ public class DefaultCompilerAdapterTest { | |||||
| testSource(null, "javac1.9", "", "9"); | testSource(null, "javac1.9", "", "9"); | ||||
| } | } | ||||
| @Test | |||||
| public void testImplicitSourceForJava9() { | |||||
| commonSourceDowngrades("javac9"); | |||||
| testSource("1.5", "javac9", | |||||
| "If you specify -target 1.5 you now must also specify" | |||||
| + " -source 1.5", "1.5"); | |||||
| testSource("1.6", "javac1.9", | |||||
| "If you specify -target 1.6 you now must also specify" | |||||
| + " -source 1.6", "1.6"); | |||||
| testSource("1.7", "javac9", | |||||
| "If you specify -target 1.7 you now must also specify" | |||||
| + " -source 1.7", "1.7"); | |||||
| testSource("1.8", "javac9", | |||||
| "If you specify -target 1.8 you now must also specify" | |||||
| + " -source 1.8", "1.8"); | |||||
| testSource("5", "javac9", | |||||
| "If you specify -target 5 you now must also specify" | |||||
| + " -source 5", "5"); | |||||
| testSource("6", "javac9", | |||||
| "If you specify -target 6 you now must also specify" | |||||
| + " -source 6", "6"); | |||||
| testSource("7", "javac9", | |||||
| "If you specify -target 7 you now must also specify" | |||||
| + " -source 7", "7"); | |||||
| testSource("8", "javac9", | |||||
| "If you specify -target 8 you now must also specify" | |||||
| + " -source 8", "8"); | |||||
| testSource(null, "javac9", "", "1.9"); | |||||
| testSource(null, "javac9", "", "9"); | |||||
| } | |||||
| @Test | @Test | ||||
| public void testSingleModuleCompilation() throws IOException { | public void testSingleModuleCompilation() throws IOException { | ||||
| final File workDir = createWorkDir("testSMC"); | final File workDir = createWorkDir("testSMC"); | ||||
| @@ -116,7 +116,7 @@ public class JavaEnvUtilsTest { | |||||
| j.startsWith(javaHomeParent)); | j.startsWith(javaHomeParent)); | ||||
| if ((Os.isFamily("mac") && JavaEnvUtils.getJavaVersionNumber() <= JavaEnvUtils.VERSION_1_6) | if ((Os.isFamily("mac") && JavaEnvUtils.getJavaVersionNumber() <= JavaEnvUtils.VERSION_1_6) | ||||
| || JavaEnvUtils.isAtLeastJavaVersion(JavaEnvUtils.JAVA_1_9)) { | |||||
| || JavaEnvUtils.isAtLeastJavaVersion(JavaEnvUtils.JAVA_9)) { | |||||
| assertTrue(j+" is normalized and in the JRE dir", | assertTrue(j+" is normalized and in the JRE dir", | ||||
| j.startsWith(javaHome)); | j.startsWith(javaHome)); | ||||
| } else { | } else { | ||||
| @@ -136,9 +136,6 @@ public class JavaEnvUtilsTest { | |||||
| assertTrue( | assertTrue( | ||||
| "Current java version is not at least the current java version...", | "Current java version is not at least the current java version...", | ||||
| JavaEnvUtils.isAtLeastJavaVersion(JavaEnvUtils.getJavaVersion())); | JavaEnvUtils.isAtLeastJavaVersion(JavaEnvUtils.getJavaVersion())); | ||||
| assertFalse( | |||||
| "In case the current java version is higher than 9.0 definitely a new algorithem will be needed", | |||||
| JavaEnvUtils.isAtLeastJavaVersion("9.0")); | |||||
| } | } | ||||
| } | } | ||||