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. | |||
| 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: | |||
| ----------- | |||
| @@ -79,7 +79,8 @@ attribute are:</a></p> | |||
| <code>javac1.6</code> 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.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 | |||
| href="http://jikes.sourceforge.net/" target="_top">Jikes</a> | |||
| compiler).</li> | |||
| @@ -84,7 +84,7 @@ ant.project.invoked-targets | |||
| will contain the project's default target in this | |||
| case for tasks nested into targets.. | |||
| 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.4", "1.3" and | |||
| "1.2". | |||
| @@ -85,6 +85,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 JAVAC9 = "javac9"; | |||
| private static final String JAVAC19 = "javac1.9"; | |||
| private static final String JAVAC18 = "javac1.8"; | |||
| private static final String JAVAC17 = "javac1.7"; | |||
| @@ -166,8 +167,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 if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_9)) { | |||
| return JAVAC9; | |||
| } else { | |||
| return CLASSIC; | |||
| } | |||
| @@ -912,7 +913,8 @@ public class Javac extends MatchingTask { | |||
| } | |||
| private String getAltCompilerName(final String anImplementation) { | |||
| if (JAVAC19.equalsIgnoreCase(anImplementation) | |||
| if (JAVAC9.equalsIgnoreCase(anImplementation) | |||
| || JAVAC19.equalsIgnoreCase(anImplementation) | |||
| || JAVAC18.equalsIgnoreCase(anImplementation) | |||
| || JAVAC17.equalsIgnoreCase(anImplementation) | |||
| || JAVAC16.equalsIgnoreCase(anImplementation) | |||
| @@ -927,7 +929,7 @@ public class Javac extends MatchingTask { | |||
| } | |||
| if (MODERN.equalsIgnoreCase(anImplementation)) { | |||
| final String nextSelected = assumedJavaVersion(); | |||
| if (JAVAC19.equalsIgnoreCase(nextSelected) | |||
| if (JAVAC9.equalsIgnoreCase(nextSelected) | |||
| || JAVAC18.equalsIgnoreCase(nextSelected) | |||
| || JAVAC17.equalsIgnoreCase(nextSelected) | |||
| || JAVAC16.equalsIgnoreCase(nextSelected) | |||
| @@ -1194,12 +1196,12 @@ 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", | |||
| * "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) { | |||
| return MODERN.equals(compilerImpl) | |||
| || CLASSIC.equals(compilerImpl) | |||
| || JAVAC19.equals(compilerImpl) | |||
| || JAVAC9.equals(compilerImpl) | |||
| || JAVAC18.equals(compilerImpl) | |||
| || JAVAC17.equals(compilerImpl) | |||
| || JAVAC16.equals(compilerImpl) | |||
| @@ -122,7 +122,8 @@ public final class CompilerAdapterFactory { | |||
| || compilerType.equalsIgnoreCase("javac1.6") | |||
| || compilerType.equalsIgnoreCase("javac1.7") | |||
| || compilerType.equalsIgnoreCase("javac1.8") | |||
| || compilerType.equalsIgnoreCase("javac1.9")) { | |||
| || compilerType.equalsIgnoreCase("javac1.9") | |||
| || compilerType.equalsIgnoreCase("javac9")) { | |||
| // does the modern compiler exist? | |||
| if (doesModernCompilerExist()) { | |||
| 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 | |||
| * @deprecated use #assumeJava9 instead | |||
| */ | |||
| 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) { | |||
| 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()) { | |||
| return "1.8 in JDK 1.8"; | |||
| } | |||
| if (assumeJava19()) { | |||
| return "1.9 in JDK 1.9"; | |||
| if (assumeJava9()) { | |||
| return "9 in JDK 9"; | |||
| } | |||
| return ""; | |||
| } | |||
| @@ -782,7 +791,7 @@ public abstract class DefaultCompilerAdapter | |||
| && !assumeJava15() && !assumeJava16()) | |||
| || (t.equals("7") && !assumeJava17()) | |||
| || (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 */ | |||
| private static int javaVersionNumber; | |||
| /** Version of currently running VM. */ | |||
| private static final DeweyDecimal parsedJavaVersion; | |||
| /** Version constant for Java 1.0 */ | |||
| public static final String JAVA_1_0 = "1.0"; | |||
| /** Number Version constant for Java 1.0 */ | |||
| @@ -100,11 +103,28 @@ 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 */ | |||
| /** | |||
| * Version constant for Java 1.9 | |||
| * @deprecated use #JAVA_9 instead | |||
| */ | |||
| 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; | |||
| /** | |||
| * 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 */ | |||
| private static boolean kaffeDetected; | |||
| @@ -158,13 +178,14 @@ public final class JavaEnvUtils { | |||
| Class.forName("java.lang.reflect.Executable"); | |||
| javaVersion = JAVA_1_8; | |||
| javaVersionNumber++; | |||
| checkForJava9(); | |||
| javaVersion = JAVA_1_9; | |||
| javaVersionNumber++; | |||
| Class.forName("java.lang.module.ModuleDescriptor"); | |||
| javaVersion = JAVA_9; | |||
| javaVersionNumber = VERSION_9; | |||
| } catch (Throwable t) { | |||
| // swallow as we've hit the max class version that | |||
| // we have | |||
| } | |||
| parsedJavaVersion = new DeweyDecimal(javaVersion); | |||
| kaffeDetected = false; | |||
| try { | |||
| Class.forName("kaffe.util.NotImplemented"); | |||
| @@ -197,7 +218,11 @@ public final class JavaEnvUtils { | |||
| /** | |||
| * 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() { | |||
| 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. | |||
| * 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 | |||
| */ | |||
| 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 | |||
| */ | |||
| 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 | |||
| // where java.home points to the root of the JDK and Mac OS X where | |||
| // 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 | |||
| return getJreExecutable(command); | |||
| } | |||
| @@ -427,7 +450,7 @@ public final class JavaEnvUtils { | |||
| private static void buildJrePackages() { | |||
| jrePackages = new Vector<String>(); | |||
| switch(javaVersionNumber) { | |||
| case VERSION_1_9: | |||
| case VERSION_9: | |||
| case VERSION_1_8: | |||
| case VERSION_1_7: | |||
| jrePackages.addElement("jdk"); | |||
| @@ -482,7 +505,7 @@ public final class JavaEnvUtils { | |||
| Vector<String> tests = new Vector<String>(); | |||
| tests.addElement("java.lang.Object"); | |||
| switch(javaVersionNumber) { | |||
| case VERSION_1_9: | |||
| case VERSION_9: | |||
| case VERSION_1_8: | |||
| case VERSION_1_7: | |||
| tests.addElement("jdk.net.Sockets"); | |||
| @@ -185,6 +185,37 @@ public class DefaultCompilerAdapterTest { | |||
| 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 | |||
| public void testSingleModuleCompilation() throws IOException { | |||
| final File workDir = createWorkDir("testSMC"); | |||
| @@ -116,7 +116,7 @@ public class JavaEnvUtilsTest { | |||
| j.startsWith(javaHomeParent)); | |||
| 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", | |||
| j.startsWith(javaHome)); | |||
| } else { | |||
| @@ -136,9 +136,6 @@ public class JavaEnvUtilsTest { | |||
| assertTrue( | |||
| "Current java version is not at least the current java version...", | |||
| 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")); | |||
| } | |||
| } | |||