From 132fb32522052091d672208e63b418926e297bb2 Mon Sep 17 00:00:00 2001 From: Stefan Bodewig Date: Fri, 27 Jan 2012 18:23:56 +0000 Subject: [PATCH] OpenJDK8 snaphot works, I have found a new class in java.lang.reflect and OpenJDK's javac defaults to -source 8. No, I don't like the code in DefaultCompilerAdapter either. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@1236803 13f79535-47bb-0310-9956-ffa450edef68 --- WHATSNEW | 2 ++ build.xml | 1 + manual/Tasks/javac.html | 5 ++-- .../org/apache/tools/ant/taskdefs/Javac.java | 8 ++++++- .../compilers/DefaultCompilerAdapter.java | 24 +++++++++++++++++-- .../apache/tools/ant/util/JavaEnvUtils.java | 10 ++++++++ src/tests/antunit/antunit-base.xml | 1 + 7 files changed, 46 insertions(+), 5 deletions(-) diff --git a/WHATSNEW b/WHATSNEW index 99fa30380..f17767af7 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -178,6 +178,8 @@ Other changes: algorithms. Bugzilla Report 52344. + * Initial support for Java 8. + Changes from Ant 1.8.1 TO Ant 1.8.2 =================================== diff --git a/build.xml b/build.xml index fd63bc669..aaad16d97 100644 --- a/build.xml +++ b/build.xml @@ -369,6 +369,7 @@ + diff --git a/manual/Tasks/javac.html b/manual/Tasks/javac.html index 40c4199fe..edada062c 100644 --- a/manual/Tasks/javac.html +++ b/manual/Tasks/javac.html @@ -72,12 +72,13 @@ attribute are:

  • classic (the standard compiler of JDK 1.1/1.2) – javac1.1 and javac1.2 can be used as aliases.
  • -
  • modern (the standard compiler of JDK 1.3/1.4/1.5/1.6/1.7) – +
  • modern (the standard compiler of JDK 1.3/1.4/1.5/1.6/1.7/1.8) – javac1.3 and javac1.4 and javac1.5 and javac1.6 and - javac1.7 (since Ant 1.8.2) can be used as aliases.
  • + javac1.7 (since Ant 1.8.2) and + javac1.8 (since Ant 1.8.3) can be used as aliases.
  • jikes (the Jikes compiler).
  • diff --git a/src/main/org/apache/tools/ant/taskdefs/Javac.java b/src/main/org/apache/tools/ant/taskdefs/Javac.java index 14f4a95cc..fb2fcbbad 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Javac.java +++ b/src/main/org/apache/tools/ant/taskdefs/Javac.java @@ -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 JAVAC18 = "javac1.8"; private static final String JAVAC17 = "javac1.7"; private static final String JAVAC16 = "javac1.6"; private static final String JAVAC15 = "javac1.5"; @@ -149,6 +150,8 @@ public class Javac extends MatchingTask { return JAVAC16; } else if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_7)) { return JAVAC17; + } else if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_8)) { + return JAVAC18; } else { return CLASSIC; } @@ -600,7 +603,7 @@ public class Javac extends MatchingTask { /** * Sets the target VM that the classes will be compiled for. Valid * values depend on the compiler, for jdk 1.4 the valid values are - * "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "5", "6" and "7". + * "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "5", "6", "7" and "8". * @param target the target VM */ public void setTarget(String target) { @@ -765,6 +768,7 @@ public class Javac extends MatchingTask { private String getAltCompilerName(String anImplementation) { if (JAVAC17.equalsIgnoreCase(anImplementation) + || JAVAC18.equalsIgnoreCase(anImplementation) || JAVAC16.equalsIgnoreCase(anImplementation) || JAVAC15.equalsIgnoreCase(anImplementation) || JAVAC14.equalsIgnoreCase(anImplementation) @@ -778,6 +782,7 @@ public class Javac extends MatchingTask { if (MODERN.equalsIgnoreCase(anImplementation)) { String nextSelected = assumedJavaVersion(); if (JAVAC17.equalsIgnoreCase(nextSelected) + || JAVAC18.equalsIgnoreCase(nextSelected) || JAVAC16.equalsIgnoreCase(nextSelected) || JAVAC15.equalsIgnoreCase(nextSelected) || JAVAC14.equalsIgnoreCase(nextSelected) @@ -1014,6 +1019,7 @@ public class Javac extends MatchingTask { protected boolean isJdkCompiler(String compilerImpl) { return MODERN.equals(compilerImpl) || CLASSIC.equals(compilerImpl) + || JAVAC18.equals(compilerImpl) || JAVAC17.equals(compilerImpl) || JAVAC16.equals(compilerImpl) || JAVAC15.equals(compilerImpl) diff --git a/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java b/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java index e129f02af..37e74913c 100644 --- a/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java +++ b/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java @@ -348,7 +348,7 @@ public abstract class DefaultCompilerAdapter } else { cmd.createArgument().setValue(source); } - } else if ((assumeJava15() || assumeJava16() || assumeJava17()) + } else if ((assumeJava15() || assumeJava16() || assumeJava17() || assumeJava18()) && attributes.getTarget() != null) { String t = attributes.getTarget(); if (t.equals("1.1") || t.equals("1.2") || t.equals("1.3") @@ -360,10 +360,15 @@ public abstract class DefaultCompilerAdapter } setImplicitSourceSwitch((assumeJava15() || assumeJava16()) ? "1.5 in JDK 1.5 and 1.6" - : "1.7 in JDK 1.7", + : (assumeJava17() + ? "1.7 in JDK 1.7" + : "1.8 in JDK 1.8"), cmd, t, s); } else if (assumeJava17() && (t.equals("1.5") || t.equals("1.6"))) { setImplicitSourceSwitch("1.7 in JDK 1.7", cmd, t, t); + } else if (assumeJava18() && + (t.equals("1.5") || t.equals("1.6") || t.equals("1.7"))) { + setImplicitSourceSwitch("1.8 in JDK 1.8", cmd, t, t); } } return cmd; @@ -637,6 +642,21 @@ public abstract class DefaultCompilerAdapter && JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_7)); } + /** + * Shall we assume JDK 1.8 command line switches? + * @return true if JDK 1.8 + * @since Ant 1.8.3 + */ + protected boolean assumeJava18() { + return "javac1.8".equals(attributes.getCompilerVersion()) + || ("classic".equals(attributes.getCompilerVersion()) + && JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_8)) + || ("modern".equals(attributes.getCompilerVersion()) + && JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_8)) + || ("extJavac".equals(attributes.getCompilerVersion()) + && JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_8)); + } + /** * Combines a user specified bootclasspath with the system * bootclasspath taking build.sysclasspath into account. diff --git a/src/main/org/apache/tools/ant/util/JavaEnvUtils.java b/src/main/org/apache/tools/ant/util/JavaEnvUtils.java index eb7662996..3f3b7d2ac 100644 --- a/src/main/org/apache/tools/ant/util/JavaEnvUtils.java +++ b/src/main/org/apache/tools/ant/util/JavaEnvUtils.java @@ -94,6 +94,11 @@ public final class JavaEnvUtils { /** Number Version constant for Java 1.7 */ public static final int VERSION_1_7 = 17; + /** Version constant for Java 1.8 */ + public static final String JAVA_1_8 = "1.8"; + /** Number Version constant for Java 1.8 */ + public static final int VERSION_1_8 = 18; + /** Whether this is the Kaffe VM */ private static boolean kaffeDetected; /** Whether this is the GNU VM (gcj/gij) */ @@ -140,6 +145,9 @@ public final class JavaEnvUtils { Class.forName("java.nio.file.FileSystem"); javaVersion = JAVA_1_7; javaVersionNumber++; + Class.forName("java.lang.reflect.Executable"); + javaVersion = JAVA_1_8; + javaVersionNumber++; } catch (Throwable t) { // swallow as we've hit the max class version that // we have @@ -370,6 +378,7 @@ public final class JavaEnvUtils { private static void buildJrePackages() { jrePackages = new Vector(); switch(javaVersionNumber) { + case VERSION_1_8: case VERSION_1_7: case VERSION_1_6: case VERSION_1_5: @@ -421,6 +430,7 @@ public final class JavaEnvUtils { Vector tests = new Vector(); tests.addElement("java.lang.Object"); switch(javaVersionNumber) { + case VERSION_1_8: case VERSION_1_7: case VERSION_1_6: case VERSION_1_5: diff --git a/src/tests/antunit/antunit-base.xml b/src/tests/antunit/antunit-base.xml index 8aee85673..ca4e23a72 100644 --- a/src/tests/antunit/antunit-base.xml +++ b/src/tests/antunit/antunit-base.xml @@ -26,6 +26,7 @@ +