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