Skip to content

Commit

Permalink
try to adapt to Java10+ rapidly changing major versions
Browse files Browse the repository at this point in the history
  • Loading branch information
bodewig committed Nov 29, 2017
1 parent ecb6acf commit 68b846a
Show file tree
Hide file tree
Showing 14 changed files with 337 additions and 107 deletions.
1 change: 1 addition & 0 deletions WHATSNEW
Expand Up @@ -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
===================================
Expand Down
3 changes: 3 additions & 0 deletions build.xml
Expand Up @@ -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"/>
Expand Down
39 changes: 39 additions & 0 deletions manual/Tasks/conditions.html
Expand Up @@ -1090,5 +1090,44 @@ <h4><a name="resourceexists">resourceexists</a></h4>
&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>
9 changes: 5 additions & 4 deletions manual/Tasks/javac.html
Expand Up @@ -78,9 +78,10 @@ <h3>Description</h3>
<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>
Expand Down Expand Up @@ -525,7 +526,7 @@ <h3>Parameters</h3>
<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.
Expand Down
2 changes: 2 additions & 0 deletions src/main/org/apache/tools/ant/antlib.xml
Expand Up @@ -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"
Expand Down
16 changes: 11 additions & 5 deletions src/main/org/apache/tools/ant/taskdefs/Javac.java
Expand Up @@ -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";
Expand Down Expand Up @@ -170,6 +171,8 @@ private String assumedJavaVersion() {
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 {
Expand Down Expand Up @@ -219,7 +222,7 @@ public String getSource() {
* 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.
Expand Down Expand Up @@ -772,7 +775,7 @@ public boolean getVerbose() {
/**
* 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

This comment has been minimized.

Copy link
@twogee

twogee Nov 29, 2017

Contributor

For jdk 1.4? 😄

This comment has been minimized.

Copy link
@bodewig

bodewig Nov 29, 2017

Author Member

bigger not bigger or equal :-)

TBH it first read bigger than 5 until I stiopped and had second thoughts.

* @param target the target VM
*/
public void setTarget(final String target) {
Expand Down Expand Up @@ -962,7 +965,8 @@ public String[] getCurrentCompilerArgs() {
}

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)
Expand All @@ -978,7 +982,8 @@ private String getAltCompilerName(final String anImplementation) {
}
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)
Expand Down Expand Up @@ -1245,11 +1250,12 @@ public File[] getFileList() {
* @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)
Expand Down
Expand Up @@ -123,7 +123,8 @@ public static CompilerAdapter getCompiler(String compilerType, Task task,
|| 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();
Expand Down
Expand Up @@ -323,7 +323,7 @@ protected Commandline setupJavacCommandlineSwitches(final Commandline cmd,
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);
Expand Down Expand Up @@ -395,7 +395,7 @@ protected Commandline setupModernJavacCommandlineSwitches(final Commandline cmd)
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");
Expand Down Expand Up @@ -719,6 +719,21 @@ protected boolean assumeJava9() {
return assumeJava19();
}

/**
* 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
Expand Down Expand Up @@ -792,7 +807,7 @@ private String getDefaultSource() {
if (assumeJava18()) {
return "1.8 in JDK 1.8";
}
if (assumeJava9()) {
if (assumeJava9Plus()) {
return "9 in JDK 9";
}
return "";
Expand All @@ -819,7 +834,7 @@ private boolean mustSetSourceForTarget(String t) {
&& !assumeJava15() && !assumeJava16())
|| (t.equals("7") && !assumeJava17())
|| (t.equals("8") && !assumeJava18())
|| (t.equals("9") && !assumeJava9());
|| (t.equals("9") && !assumeJava9Plus());
}


Expand Down
115 changes: 115 additions & 0 deletions 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;
}

}
2 changes: 2 additions & 0 deletions src/main/org/apache/tools/ant/types/conditions/antlib.xml
Expand Up @@ -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"
Expand Down

0 comments on commit 68b846a

Please sign in to comment.