You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by bo...@apache.org on 2017/12/02 17:28:32 UTC

ant git commit: try to adapt to Java10+ rapidly changing major versions

Repository: ant
Updated Branches:
  refs/heads/1.9.x 572a24902 -> bd0759d94


try to adapt to Java10+ rapidly changing major versions


Project: http://git-wip-us.apache.org/repos/asf/ant/repo
Commit: http://git-wip-us.apache.org/repos/asf/ant/commit/bd0759d9
Tree: http://git-wip-us.apache.org/repos/asf/ant/tree/bd0759d9
Diff: http://git-wip-us.apache.org/repos/asf/ant/diff/bd0759d9

Branch: refs/heads/1.9.x
Commit: bd0759d943a7717e43d1d774afc4c3e1cb2bc04c
Parents: 572a249
Author: Stefan Bodewig <bo...@apache.org>
Authored: Wed Nov 29 16:17:34 2017 +0100
Committer: Stefan Bodewig <bo...@apache.org>
Committed: Sat Dec 2 18:28:20 2017 +0100

----------------------------------------------------------------------
 WHATSNEW                                        |   1 +
 build.xml                                       |   3 +
 manual/Tasks/conditions.html                    |  39 ++++
 manual/Tasks/javac.html                         |   9 +-
 src/main/org/apache/tools/ant/antlib.xml        |   2 +
 .../org/apache/tools/ant/taskdefs/Javac.java    |  16 +-
 .../compilers/CompilerAdapterFactory.java       |   3 +-
 .../compilers/DefaultCompilerAdapter.java       |  23 ++-
 .../ant/taskdefs/condition/JavaVersion.java     | 115 ++++++++++++
 .../tools/ant/types/conditions/antlib.xml       |   2 +
 .../org/apache/tools/ant/util/JavaEnvUtils.java | 178 +++++++++----------
 src/tests/antunit/antunit-base.xml              |   3 +
 .../taskdefs/condition/javaversion-test.xml     |  40 +++++
 src/tests/antunit/taskdefs/javac-test.xml       |   9 +-
 14 files changed, 337 insertions(+), 106 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ant/blob/bd0759d9/WHATSNEW
----------------------------------------------------------------------
diff --git a/WHATSNEW b/WHATSNEW
index e331033..79fb177 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -48,6 +48,7 @@ Other changes:
    upgraded to 0.1.54. Jsch is the library behind the sshexec 
    and scp Ant tasks.
 
+ * Added a new <javaversion> condition.
 
 Changes from Ant 1.9.8 TO Ant 1.9.9
 ===================================

http://git-wip-us.apache.org/repos/asf/ant/blob/bd0759d9/build.xml
----------------------------------------------------------------------
diff --git a/build.xml b/build.xml
index d20cdd3..ffa86f1 100644
--- a/build.xml
+++ b/build.xml
@@ -379,6 +379,9 @@
     <available property="jdk1.7+" classname="java.nio.file.FileSystem"/>
     <available property="jdk1.8+" classname="java.lang.reflect.Executable"/>
     <available property="jdk9+" classname="java.lang.module.ModuleDescriptor"/>
+    <condition property="jdk10+">
+      <javaversion atleast="10"/>
+    </condition>
     <available property="kaffe" classname="kaffe.util.NotImplemented"/>
     <available property="harmony"
                classname="org.apache.harmony.luni.util.Base64"/>

http://git-wip-us.apache.org/repos/asf/ant/blob/bd0759d9/manual/Tasks/conditions.html
----------------------------------------------------------------------
diff --git a/manual/Tasks/conditions.html b/manual/Tasks/conditions.html
index 08d0bcc..35216cd 100644
--- a/manual/Tasks/conditions.html
+++ b/manual/Tasks/conditions.html
@@ -1090,5 +1090,44 @@ is redundant and will be ignored.</p>
   &lt;file file="${file}"/&gt;
 &lt;/resourceexists&gt;
 </pre></blockquote>
+
+<h4><a name="javaversion">javaversion</a></h4>
+
+<p>Tests the version of the JVM executing Ant.  <em>Since Ant
+1.9.10</em></p>
+
+<table border="1" cellpadding="2" cellspacing="0">
+  <tr>
+    <td width="12%" valign="top"><b>Attribute</b></td>
+    <td width="78%" valign="top"><b>Description</b></td>
+    <td width="10%" valign="top"><b>Required</b></td>
+  </tr>
+  <tr>
+    <td valign="top">atleast</td>
+    <td valign="top">The version that this JVM is at least.
+      The format is major.minor.point. Starting with Java9 really
+      only the major number is determined.</td>
+    <td valign="top" align="center">No</td>
+    <td valign="top" rowspan="2" align="center">One of these.</td>
+  </tr>
+  <tr>
+    <td valign="top">exactly</td>
+    <td valign="top">The version that this JVM is exactly.
+      The format is <tt>major.minor.point</tt>. Starting with Java9 really
+      only the major number is determined.</td>
+    <td valign="top" align="center">No</td>
+  </tr>
+</table>
+
+  <p>
+    An example:
+  </p>
+
+<blockquote><pre>
+&lt;javaversion atleast=&quot;9&quot;/&gt;
+</pre></blockquote>
+
+<p>will evaluate to true if the current JVM is Java9 or above.</p>
+
 </body>
 </html>

http://git-wip-us.apache.org/repos/asf/ant/blob/bd0759d9/manual/Tasks/javac.html
----------------------------------------------------------------------
diff --git a/manual/Tasks/javac.html b/manual/Tasks/javac.html
index 68c6310..89ec054 100644
--- a/manual/Tasks/javac.html
+++ b/manual/Tasks/javac.html
@@ -78,9 +78,10 @@ attribute are:</a></p>
       <code>javac1.5</code> and
       <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>) and</li>
-      <code>javac9</code> (<em>since Ant 1.9.8</em>) can be used as aliases.</li>
+      <code>javac1.8</code> (<em>since Ant 1.8.3</em>) and
+      <code>javac1.9</code> (<em>since Ant 1.9.5</em>) and
+      <code>javac9</code> (<em>since Ant 1.9.8</em>) and
+      <code>javac10+</code> (<em>since Ant 1.9.10</em>) can be used as aliases.</li>
   <li><code>jikes</code> (the <a
     href="http://jikes.sourceforge.net/" target="_top">Jikes</a>
     compiler).</li>
@@ -525,7 +526,7 @@ invoking the compiler.</p>
   <tr>
     <td valign="top">release</td>
     <td valign="top">
-      Specify the value for the <code>--release</code> switch.Ignored
+      Specify the value for the <code>--release</code> switch. Ignored
       when running on JDK &lt; 9.<br>
       When set and running on JDK &gt;= 9 the source and target
       attributes as well as the bootclasspath will be ignored.

http://git-wip-us.apache.org/repos/asf/ant/blob/bd0759d9/src/main/org/apache/tools/ant/antlib.xml
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/antlib.xml b/src/main/org/apache/tools/ant/antlib.xml
index 6449807..8ec6714 100644
--- a/src/main/org/apache/tools/ant/antlib.xml
+++ b/src/main/org/apache/tools/ant/antlib.xml
@@ -63,6 +63,8 @@
        classname="org.apache.tools.ant.taskdefs.condition.IsSigned"/>
   <componentdef name="istrue" onerror="ignore"
        classname="org.apache.tools.ant.taskdefs.condition.IsTrue"/>
+  <componentdef name="javaversion" onerror="ignore"
+       classname="org.apache.tools.ant.taskdefs.condition.JavaVersion"/>
   <componentdef name="matches" onerror="ignore"
            classname="org.apache.tools.ant.taskdefs.condition.Matches"/>
   <componentdef name="not" onerror="ignore"

http://git-wip-us.apache.org/repos/asf/ant/blob/bd0759d9/src/main/org/apache/tools/ant/taskdefs/Javac.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/Javac.java b/src/main/org/apache/tools/ant/taskdefs/Javac.java
index d0af0a3..18e4941 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Javac.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Javac.java
@@ -86,6 +86,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 JAVAC10_PLUS = "javac10+";
     private static final String JAVAC9 = "javac9";
     private static final String JAVAC19 = "javac1.9";
     private static final String JAVAC18 = "javac1.8";
@@ -170,6 +171,8 @@ public class Javac extends MatchingTask {
             return JAVAC17;
         } else if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_8)) {
             return JAVAC18;
+        } else if (JavaEnvUtils.isAtLeastJavaVersion("10")) {
+            return JAVAC10_PLUS;
         } else if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_9)) {
             return JAVAC9;
         } else {
@@ -219,7 +222,7 @@ public class Javac extends MatchingTask {
      * must make sure that your version of jikes supports the -source
      * switch.</p>
      *
-     * <p>Legal values are 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, and 5, 6, 7, 8 and 9
+     * <p>Legal values are 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, and any integral number bigger than 4
      * - by default, no -source argument will be used at all.</p>
      *
      * @param v  Value to assign to source.
@@ -772,7 +775,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", "1.8", "1.9", "5", "6", "7", "8", "9".
+     * "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9" and any integral number bigger than 4
      * @param target the target VM
      */
     public void setTarget(final String target) {
@@ -962,7 +965,8 @@ public class Javac extends MatchingTask {
     }
 
     private String getAltCompilerName(final String anImplementation) {
-        if (JAVAC9.equalsIgnoreCase(anImplementation)
+        if (JAVAC10_PLUS.equalsIgnoreCase(anImplementation)
+                || JAVAC9.equalsIgnoreCase(anImplementation)
                 || JAVAC19.equalsIgnoreCase(anImplementation)
                 || JAVAC18.equalsIgnoreCase(anImplementation)
                 || JAVAC17.equalsIgnoreCase(anImplementation)
@@ -978,7 +982,8 @@ public class Javac extends MatchingTask {
         }
         if (MODERN.equalsIgnoreCase(anImplementation)) {
             final String nextSelected = assumedJavaVersion();
-            if (JAVAC9.equalsIgnoreCase(nextSelected)
+            if (JAVAC10_PLUS.equalsIgnoreCase(anImplementation)
+                    || JAVAC9.equalsIgnoreCase(nextSelected)
                     || JAVAC18.equalsIgnoreCase(nextSelected)
                     || JAVAC17.equalsIgnoreCase(nextSelected)
                     || JAVAC16.equalsIgnoreCase(nextSelected)
@@ -1245,11 +1250,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", "javac1.9" or "javac9".
+     * "javac1.6", "javac1.7", "javac1.8", "javac1.9", "javac9" or "javac10+".
      */
     protected boolean isJdkCompiler(final String compilerImpl) {
         return MODERN.equals(compilerImpl)
             || CLASSIC.equals(compilerImpl)
+            || JAVAC10_PLUS.equals(compilerImpl)
             || JAVAC9.equals(compilerImpl)
             || JAVAC18.equals(compilerImpl)
             || JAVAC17.equals(compilerImpl)

http://git-wip-us.apache.org/repos/asf/ant/blob/bd0759d9/src/main/org/apache/tools/ant/taskdefs/compilers/CompilerAdapterFactory.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/compilers/CompilerAdapterFactory.java b/src/main/org/apache/tools/ant/taskdefs/compilers/CompilerAdapterFactory.java
index 8712715..48d93ad 100644
--- a/src/main/org/apache/tools/ant/taskdefs/compilers/CompilerAdapterFactory.java
+++ b/src/main/org/apache/tools/ant/taskdefs/compilers/CompilerAdapterFactory.java
@@ -123,7 +123,8 @@ public final class CompilerAdapterFactory {
                 || compilerType.equalsIgnoreCase("javac1.7")
                 || compilerType.equalsIgnoreCase("javac1.8")
                 || compilerType.equalsIgnoreCase("javac1.9")
-                || compilerType.equalsIgnoreCase("javac9")) {
+                || compilerType.equalsIgnoreCase("javac9")
+                || compilerType.equalsIgnoreCase("javac10+")) {
                 // does the modern compiler exist?
                 if (doesModernCompilerExist()) {
                     return new Javac13();

http://git-wip-us.apache.org/repos/asf/ant/blob/bd0759d9/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java
----------------------------------------------------------------------
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 82373a9..350dbe5 100644
--- a/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java
+++ b/src/main/org/apache/tools/ant/taskdefs/compilers/DefaultCompilerAdapter.java
@@ -323,7 +323,7 @@ public abstract class DefaultCompilerAdapter
                 cmd.createArgument().setValue("-sourcepath");
                 cmd.createArgument().setPath(sourcepath);
             }
-            if (release == null || !assumeJava19()) {
+            if (release == null || !assumeJava9Plus()) {
                 if (target != null) {
                     cmd.createArgument().setValue("-target");
                     cmd.createArgument().setValue(target);
@@ -395,7 +395,7 @@ public abstract class DefaultCompilerAdapter
         if (!assumeJava13()) { // -source added with JDK 1.4
             final String t = attributes.getTarget();
             final String s = attributes.getSource();
-            if (release == null || !assumeJava19()) {
+            if (release == null || !assumeJava9Plus()) {
                 if (release != null) {
                     attributes.log("Support for javac --release has been added"
                                    + " in Java9 ignoring it");
@@ -720,6 +720,21 @@ public abstract class DefaultCompilerAdapter
     }
 
     /**
+     * Shall we assume JDK 9+ command line switches?
+     * @return true if JDK 9+
+     * @since Ant 1.9.10
+     */
+    protected boolean assumeJava9Plus() {
+        return "javac1.9".equals(attributes.getCompilerVersion())
+            || "javac9".equals(attributes.getCompilerVersion())
+            || "javac10+".equals(attributes.getCompilerVersion())
+            || (JavaEnvUtils.isAtLeastJavaVersion(JavaEnvUtils.JAVA_9) &&
+                ("classic".equals(attributes.getCompilerVersion())
+                 || "modern".equals(attributes.getCompilerVersion())
+                 || "extJavac".equals(attributes.getCompilerVersion())));
+    }
+
+    /**
      * Shall we assume command line switches for the given version of Java?
      * @since Ant 1.8.3
      */
@@ -792,7 +807,7 @@ public abstract class DefaultCompilerAdapter
         if (assumeJava18()) {
             return "1.8 in JDK 1.8";
         }
-        if (assumeJava9()) {
+        if (assumeJava9Plus()) {
             return "9 in JDK 9";
         }
         return "";
@@ -819,7 +834,7 @@ public abstract class DefaultCompilerAdapter
                 && !assumeJava15() && !assumeJava16())
             || (t.equals("7") && !assumeJava17())
             || (t.equals("8") && !assumeJava18())
-            || (t.equals("9") && !assumeJava9());
+            || (t.equals("9") && !assumeJava9Plus());
     }
 
 

http://git-wip-us.apache.org/repos/asf/ant/blob/bd0759d9/src/main/org/apache/tools/ant/taskdefs/condition/JavaVersion.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/condition/JavaVersion.java b/src/main/org/apache/tools/ant/taskdefs/condition/JavaVersion.java
new file mode 100644
index 0000000..69a9290
--- /dev/null
+++ b/src/main/org/apache/tools/ant/taskdefs/condition/JavaVersion.java
@@ -0,0 +1,115 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.tools.ant.taskdefs.condition;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.util.DeweyDecimal;
+import org.apache.tools.ant.util.JavaEnvUtils;
+
+/**
+ * An Java version condition.
+ * @since Java 1.9.10
+ */
+public class JavaVersion implements Condition {
+
+    private String atLeast = null;
+    private String exactly = null;
+
+    /**
+     * Evaluate the condition.
+     * @return true if the condition is true.
+     * @throws BuildException if an error occurs.
+     */
+    public boolean eval() throws BuildException {
+        validate();
+        DeweyDecimal actual = JavaEnvUtils.getParsedJavaVersion();
+        if (null != atLeast) {
+            return actual.isGreaterThanOrEqual(new DeweyDecimal(atLeast));
+        }
+        if (null != exactly) {
+            return actual.isEqual(new DeweyDecimal(exactly));
+        }
+        //default
+        return false;
+    }
+
+    private void validate() throws BuildException {
+        if (atLeast != null && exactly != null) {
+            throw new BuildException("Only one of atleast or exactly may be set.");
+        }
+        if (null == atLeast && null == exactly) {
+            throw new BuildException("One of atleast or exactly must be set.");
+        }
+        if (atLeast != null) {
+            try {
+                // only created for side effect
+                new DeweyDecimal(atLeast); //NOSONAR
+            } catch (NumberFormatException e) {
+                throw new BuildException(
+                    "The 'atleast' attribute is not a Dewey Decimal eg 1.1.0 : "
+                    + atLeast);
+            }
+        } else {
+            try {
+                // only created for side effect
+                new DeweyDecimal(exactly); //NOSONAR
+            } catch (NumberFormatException e) {
+                throw new BuildException(
+                    "The 'exactly' attribute is not a Dewey Decimal eg 1.1.0 : "
+                    + exactly);
+            }
+        }
+    }
+
+    /**
+     * Get the atleast attribute.
+     * @return the atleast attribute.
+     */
+    public String getAtLeast() {
+        return atLeast;
+    }
+
+    /**
+     * Set the atleast attribute.
+     * This is of the form major.minor.point.
+     * For example 1.7.0.
+     * @param atLeast the version to check against.
+     */
+    public void setAtLeast(String atLeast) {
+        this.atLeast = atLeast;
+    }
+
+    /**
+     * Get the exactly attribute.
+     * @return the exactly attribute.
+     */
+    public String getExactly() {
+        return exactly;
+    }
+
+    /**
+     * Set the exactly attribute.
+     * This is of the form major.minor.point.
+     * For example 1.7.0.
+     * @param exactly the version to check against.
+     */
+    public void setExactly(String exactly) {
+        this.exactly = exactly;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/ant/blob/bd0759d9/src/main/org/apache/tools/ant/types/conditions/antlib.xml
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/types/conditions/antlib.xml b/src/main/org/apache/tools/ant/types/conditions/antlib.xml
index ff407b2..5643a2e 100644
--- a/src/main/org/apache/tools/ant/types/conditions/antlib.xml
+++ b/src/main/org/apache/tools/ant/types/conditions/antlib.xml
@@ -66,6 +66,8 @@
            classname="org.apache.tools.ant.taskdefs.condition.IsSigned"/>
   <typedef name="istrue"  onerror="ignore"
            classname="org.apache.tools.ant.taskdefs.condition.IsTrue"/>
+  <typedef name="javaversion" onerror="ignore"
+           classname="org.apache.tools.ant.taskdefs.condition.JavaVersion"/>
   <typedef name="not" onerror="ignore"
            classname="org.apache.tools.ant.taskdefs.condition.Not"/>
   <typedef name="matches" onerror="ignore"

http://git-wip-us.apache.org/repos/asf/ant/blob/bd0759d9/src/main/org/apache/tools/ant/util/JavaEnvUtils.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/util/JavaEnvUtils.java b/src/main/org/apache/tools/ant/util/JavaEnvUtils.java
index 969621d..7c980c8 100644
--- a/src/main/org/apache/tools/ant/util/JavaEnvUtils.java
+++ b/src/main/org/apache/tools/ant/util/JavaEnvUtils.java
@@ -29,6 +29,10 @@ import org.apache.tools.ant.taskdefs.condition.Os;
  * A set of helper methods related to locating executables or checking
  * conditions of a given Java installation.
  *
+ * <p>Starting with Java 10 we've stopped adding <code>JAVA_</code>
+ * and <code>VERSION_</code> attributes for new major version numbers
+ * of the JVM.</p>
+ *
  * @since Ant 1.5
  */
 public final class JavaEnvUtils {
@@ -181,6 +185,10 @@ public final class JavaEnvUtils {
             Class.forName("java.lang.module.ModuleDescriptor");
             javaVersion = JAVA_9;
             javaVersionNumber = VERSION_9;
+            // at least Java9 and this should properly support the purely numeric version property
+            String v = System.getProperty("java.specification.version");
+            javaVersionNumber = Integer.parseInt(v) * 10;
+            javaVersion = v;
         } catch (Throwable t) {
             // swallow as we've hit the max class version that
             // we have
@@ -449,51 +457,45 @@ public final class JavaEnvUtils {
 
     private static void buildJrePackages() {
         jrePackages = new Vector<String>();
-        switch(javaVersionNumber) {
-            case VERSION_9:
-            case VERSION_1_8:
-            case VERSION_1_7:
-                jrePackages.addElement("jdk");
-                // fall through
-            case VERSION_1_6:
-            case VERSION_1_5:
-                //In Java1.5, the apache stuff moved.
-                jrePackages.addElement("com.sun.org.apache");
-                //fall through.
-            case VERSION_1_4:
-                if (javaVersionNumber == VERSION_1_4) {
-                    jrePackages.addElement("org.apache.crimson");
-                    jrePackages.addElement("org.apache.xalan");
-                    jrePackages.addElement("org.apache.xml");
-                    jrePackages.addElement("org.apache.xpath");
-                }
-                jrePackages.addElement("org.ietf.jgss");
-                jrePackages.addElement("org.w3c.dom");
-                jrePackages.addElement("org.xml.sax");
-                // fall through
-            case VERSION_1_3:
-                jrePackages.addElement("org.omg");
-                jrePackages.addElement("com.sun.corba");
-                jrePackages.addElement("com.sun.jndi");
-                jrePackages.addElement("com.sun.media");
-                jrePackages.addElement("com.sun.naming");
-                jrePackages.addElement("com.sun.org.omg");
-                jrePackages.addElement("com.sun.rmi");
-                jrePackages.addElement("sunw.io");
-                jrePackages.addElement("sunw.util");
-                // fall through
-            case VERSION_1_2:
-                jrePackages.addElement("com.sun.java");
-                jrePackages.addElement("com.sun.image");
-                // are there any here that we forgot?
-                // fall through
-            case VERSION_1_1:
-            default:
-                //things like sun.reflection, sun.misc, sun.net
-                jrePackages.addElement("sun");
-                jrePackages.addElement("java");
-                jrePackages.addElement("javax");
-                break;
+        if (isAtLeastJavaVersion(JAVA_1_1)) {
+            //things like sun.reflection, sun.misc, sun.net
+            jrePackages.addElement("sun");
+            jrePackages.addElement("java");
+            jrePackages.addElement("javax");
+        }
+        if (isAtLeastJavaVersion(JAVA_1_2)) {
+            jrePackages.addElement("com.sun.java");
+            jrePackages.addElement("com.sun.image");
+            // are there any here that we forgot?
+        }
+        if (isAtLeastJavaVersion(JAVA_1_3)) {
+            jrePackages.addElement("org.omg");
+            jrePackages.addElement("com.sun.corba");
+            jrePackages.addElement("com.sun.jndi");
+            jrePackages.addElement("com.sun.media");
+            jrePackages.addElement("com.sun.naming");
+            jrePackages.addElement("com.sun.org.omg");
+            jrePackages.addElement("com.sun.rmi");
+            jrePackages.addElement("sunw.io");
+            jrePackages.addElement("sunw.util");
+        }
+        if (isAtLeastJavaVersion(JAVA_1_4)) {
+            if (javaVersionNumber == VERSION_1_4) {
+                jrePackages.addElement("org.apache.crimson");
+                jrePackages.addElement("org.apache.xalan");
+                jrePackages.addElement("org.apache.xml");
+                jrePackages.addElement("org.apache.xpath");
+            }
+            jrePackages.addElement("org.ietf.jgss");
+            jrePackages.addElement("org.w3c.dom");
+            jrePackages.addElement("org.xml.sax");
+        }
+        if (isAtLeastJavaVersion(JAVA_1_5)) {
+            //In Java1.5, the apache stuff moved.
+            jrePackages.addElement("com.sun.org.apache");
+        }
+        if (isAtLeastJavaVersion(JAVA_1_7)) {
+            jrePackages.addElement("jdk");
         }
     }
 
@@ -504,52 +506,46 @@ public final class JavaEnvUtils {
     public static Vector<String> getJrePackageTestCases() {
         Vector<String> tests = new Vector<String>();
         tests.addElement("java.lang.Object");
-        switch(javaVersionNumber) {
-            case VERSION_9:
-            case VERSION_1_8:
-            case VERSION_1_7:
-                tests.addElement("jdk.net.Sockets");
-                // fall through
-            case VERSION_1_6:
-            case VERSION_1_5:
-                tests.addElement(
-                    "com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl ");
-                // 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");
-                    tests.addElement("org.apache.xpath.XPathFactory");
-                }
-                tests.addElement("org.ietf.jgss.Oid");
-                tests.addElement("org.w3c.dom.Attr");
-                tests.addElement("org.xml.sax.XMLReader");
-                // fall through
-            case VERSION_1_3:
-                tests.addElement("org.omg.CORBA.Any");
-                tests.addElement("com.sun.corba.se.internal.corba.AnyImpl");
-                tests.addElement("com.sun.jndi.ldap.LdapURL");
-                tests.addElement("com.sun.media.sound.Printer");
-                tests.addElement("com.sun.naming.internal.VersionHelper");
-                tests.addElement("com.sun.org.omg.CORBA.Initializer");
-                tests.addElement("sunw.io.Serializable");
-                tests.addElement("sunw.util.EventListener");
-                // fall through
-            case VERSION_1_2:
-                tests.addElement("javax.accessibility.Accessible");
-                tests.addElement("sun.misc.BASE64Encoder");
-                tests.addElement("com.sun.image.codec.jpeg.JPEGCodec");
-                // fall through
-            case VERSION_1_1:
-            default:
-                //things like sun.reflection, sun.misc, sun.net
-                tests.addElement("sun.reflect.SerializationConstructorAccessorImpl");
-                tests.addElement("sun.net.www.http.HttpClient");
-                tests.addElement("sun.audio.AudioPlayer");
-                break;
+        if (isAtLeastJavaVersion(JAVA_1_1)) {
+            //things like sun.reflection, sun.misc, sun.net
+            tests.addElement("sun.reflect.SerializationConstructorAccessorImpl");
+            tests.addElement("sun.net.www.http.HttpClient");
+            tests.addElement("sun.audio.AudioPlayer");
+        }
+        if (isAtLeastJavaVersion(JAVA_1_2)) {
+            tests.addElement("javax.accessibility.Accessible");
+            tests.addElement("sun.misc.BASE64Encoder");
+            tests.addElement("com.sun.image.codec.jpeg.JPEGCodec");
+        }
+        if (isAtLeastJavaVersion(JAVA_1_3)) {
+            tests.addElement("org.omg.CORBA.Any");
+            tests.addElement("com.sun.corba.se.internal.corba.AnyImpl");
+            tests.addElement("com.sun.jndi.ldap.LdapURL");
+            tests.addElement("com.sun.media.sound.Printer");
+            tests.addElement("com.sun.naming.internal.VersionHelper");
+            tests.addElement("com.sun.org.omg.CORBA.Initializer");
+            tests.addElement("sunw.io.Serializable");
+            tests.addElement("sunw.util.EventListener");
+        }
+        if (isAtLeastJavaVersion(JAVA_1_4)) {
+            tests.addElement("sun.audio.AudioPlayer");
+            if (javaVersionNumber == VERSION_1_4) {
+                // only for 1.4, not for higher versions
+                tests.addElement("org.apache.crimson.parser.ContentModel");
+                tests.addElement("org.apache.xalan.processor.ProcessorImport");
+                tests.addElement("org.apache.xml.utils.URI");
+                tests.addElement("org.apache.xpath.XPathFactory");
+            }
+            tests.addElement("org.ietf.jgss.Oid");
+            tests.addElement("org.w3c.dom.Attr");
+            tests.addElement("org.xml.sax.XMLReader");
+        }
+        if (isAtLeastJavaVersion(JAVA_1_5)) {
+            tests.addElement(
+                "com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl");
+        }
+        if (isAtLeastJavaVersion(JAVA_1_7)) {
+            tests.addElement("jdk.net.Sockets");
         }
         return tests;
     }

http://git-wip-us.apache.org/repos/asf/ant/blob/bd0759d9/src/tests/antunit/antunit-base.xml
----------------------------------------------------------------------
diff --git a/src/tests/antunit/antunit-base.xml b/src/tests/antunit/antunit-base.xml
index 9863f3f..4bd4643 100644
--- a/src/tests/antunit/antunit-base.xml
+++ b/src/tests/antunit/antunit-base.xml
@@ -27,6 +27,9 @@
   <property name="test3.jar" location="${antunit.tmpdir}/test3.jar"/>
   <property name="test4.jar" location="${antunit.tmpdir}/test4.jar"/>
   <property name="test5.jar" location="${antunit.tmpdir}/test5.jar"/>
+  <condition property="jdk10+">
+    <javaversion atleast="10"/>
+  </condition>
   <available property="jdk9+" classname="java.lang.module.ModuleDescriptor"/>
   <available property="jdk1.8+" classname="java.lang.reflect.Executable"/>
   <available property="jdk1.7+" classname="java.nio.file.FileSystem"/>

http://git-wip-us.apache.org/repos/asf/ant/blob/bd0759d9/src/tests/antunit/taskdefs/condition/javaversion-test.xml
----------------------------------------------------------------------
diff --git a/src/tests/antunit/taskdefs/condition/javaversion-test.xml b/src/tests/antunit/taskdefs/condition/javaversion-test.xml
new file mode 100644
index 0000000..5f15a1e
--- /dev/null
+++ b/src/tests/antunit/taskdefs/condition/javaversion-test.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<project name="javaversion-test" default="antunit" xmlns:au="antlib:org.apache.ant.antunit">
+  <import file="../../antunit-base.xml" />
+
+  <target name="test-atleast">
+    <au:assertTrue message="Expected javaversion of ${ant.version} to be at least 1.7.0">
+      <!-- Ant 1.9.x requires Java5 at runtime - so this must be true -->
+      <javaversion atleast="1.5" />
+    </au:assertTrue>
+  </target>
+
+  <target name="test-exactly">
+    <au:assertTrue message="Expected javaversion of ${ant.java.version}">
+      <javaversion exactly="${ant.java.version}" />
+    </au:assertTrue>
+  </target>
+
+  <target name="test-atleast-fail">
+    <au:assertFalse>
+      <javaversion atleast="1000.0" />
+    </au:assertFalse>
+  </target>
+
+</project>

http://git-wip-us.apache.org/repos/asf/ant/blob/bd0759d9/src/tests/antunit/taskdefs/javac-test.xml
----------------------------------------------------------------------
diff --git a/src/tests/antunit/taskdefs/javac-test.xml b/src/tests/antunit/taskdefs/javac-test.xml
index 05c3269..48ed15d 100644
--- a/src/tests/antunit/taskdefs/javac-test.xml
+++ b/src/tests/antunit/taskdefs/javac-test.xml
@@ -314,7 +314,14 @@ public class Adapter implements CompilerAdapter {
       <delete dir="${javac-dir}/classes"/>
       <mkdir dir="${javac-dir}/classes"/>
     </sequential>
-  </target> 
+
+    <sequential if:set="jdk10+">
+      <echo>JDK 10+</echo>
+      <testJavac source="10" target="10"/>
+      <delete dir="${javac-dir}/classes"/>
+      <mkdir dir="${javac-dir}/classes"/>
+    </sequential>
+  </target>
 
   <target name="testJavacWithNativeHeaderGeneration" if="jdk1.8+" depends="setup">
     <mkdir dir="${javac-dir}/src/org/example" />