Browse Source

detect Java9

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@1585981 13f79535-47bb-0310-9956-ffa450edef68
master
Jan Materne 11 years ago
parent
commit
4c0b73f726
4 changed files with 52 additions and 16 deletions
  1. +12
    -4
      src/main/org/apache/tools/ant/taskdefs/Javac.java
  2. +35
    -5
      src/main/org/apache/tools/ant/util/JavaEnvUtils.java
  3. +4
    -6
      src/main/org/apache/tools/ant/util/facade/FacadeTaskHelper.java
  4. +1
    -1
      src/tests/junit/org/apache/tools/ant/util/JavaEnvUtilsTest.java

+ 12
- 4
src/main/org/apache/tools/ant/taskdefs/Javac.java View File

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


+ 35
- 5
src/main/org/apache/tools/ant/util/JavaEnvUtils.java View File

@@ -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<String>();
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<String> getJrePackageTestCases() {
Vector<String> tests = new Vector<String>();
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");


+ 4
- 6
src/main/org/apache/tools/ant/util/facade/FacadeTaskHelper.java View File

@@ -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<ImplementationSpecificArgument> args = new ArrayList<ImplementationSpecificArgument>();

/**
* 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<String> tmp = new ArrayList<String>(args.size());
for (ImplementationSpecificArgument arg : args) {
String[] curr = arg.getParts(getImplementation());
if (curr != null) {
for (int i = 0; i < curr.length; i++) {


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

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

Loading…
Cancel
Save