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



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

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


+ 1
- 1
manual/properties.html View File

@@ -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 &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.4&quot;, &quot;1.3&quot; and
&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
= "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)


+ 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.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();


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




+ 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 */
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");


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

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


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

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

Loading…
Cancel
Save