Browse Source

nobody is going to call Java 9 1.9 anymore

https://bz.apache.org/bugzilla/show_bug.cgi?id=59863
master
Stefan Bodewig 8 years ago
parent
commit
625d3d371f
9 changed files with 122 additions and 55 deletions
  1. +3
    -0
      WHATSNEW
  2. +2
    -1
      manual/Tasks/javac.html
  3. +1
    -1
      manual/properties.html
  4. +8
    -6
      src/main/org/apache/tools/ant/taskdefs/Javac.java
  5. +2
    -1
      src/main/org/apache/tools/ant/taskdefs/compilers/CompilerAdapterFactory.java
  6. +21
    -12
      src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java
  7. +53
    -30
      src/main/org/apache/tools/ant/util/JavaEnvUtils.java
  8. +31
    -0
      src/tests/junit/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapterTest.java
  9. +1
    -4
      src/tests/junit/org/apache/tools/ant/util/JavaEnvUtilsTest.java

+ 3
- 0
WHATSNEW View File

@@ -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:
----------- -----------




+ 2
- 1
manual/Tasks/javac.html View File

@@ -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>


+ 1
- 1
manual/properties.html View File

@@ -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 &quot;1.9&quot;, &quot;1.8&quot;,
the values &quot;9&quot;, &quot;1.8&quot;,
&quot;1.7&quot;, &quot;1.6&quot;, &quot;1.5&quot;, &quot;1.7&quot;, &quot;1.6&quot;, &quot;1.5&quot;,
&quot;1.4&quot;, &quot;1.3&quot; and &quot;1.4&quot;, &quot;1.3&quot; and
&quot;1.2&quot;. &quot;1.2&quot;.


+ 8
- 6
src/main/org/apache/tools/ant/taskdefs/Javac.java View File

@@ -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)


+ 2
- 1
src/main/org/apache/tools/ant/taskdefs/compilers/CompilerAdapterFactory.java View File

@@ -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();


+ 21
- 12
src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java View File

@@ -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());
} }






+ 53
- 30
src/main/org/apache/tools/ant/util/JavaEnvUtils.java View File

@@ -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");


+ 31
- 0
src/tests/junit/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapterTest.java View File

@@ -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");


+ 1
- 4
src/tests/junit/org/apache/tools/ant/util/JavaEnvUtilsTest.java View File

@@ -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"));
} }
} }

Loading…
Cancel
Save