| @@ -122,6 +122,10 @@ Other changes: | |||||
| if when a SecurityManager is active. | if when a SecurityManager is active. | ||||
| Bugzilla Report 60060 | Bugzilla Report 60060 | ||||
| * support for javac's --release switch introduced with Java9 has been | |||||
| added. | |||||
| Bugzilla Report 60172 | |||||
| Changes from Ant 1.9.6 TO Ant 1.9.7 | Changes from Ant 1.9.6 TO Ant 1.9.7 | ||||
| =================================== | =================================== | ||||
| @@ -522,6 +522,16 @@ invoking the compiler.</p> | |||||
| <em>Since Ant 1.9.8</em>. | <em>Since Ant 1.9.8</em>. | ||||
| <td align="center" valign="top">No</td> | <td align="center" valign="top">No</td> | ||||
| </tr> | </tr> | ||||
| <tr> | |||||
| <td valign="top">release</td> | |||||
| <td valign="top"> | |||||
| Specify the value for the <code>--release</code> switch.Ignored | |||||
| when running on JDK < 9.<br> | |||||
| When set and running on JDK >= 9 the source and target | |||||
| attributes as well as the bootclasspath will be ignored. | |||||
| <em>Since Ant 1.9.8</em>. | |||||
| <td align="center" valign="top">No</td> | |||||
| </tr> | |||||
| </table> | </table> | ||||
| <h3>Parameters specified as nested elements</h3> | <h3>Parameters specified as nested elements</h3> | ||||
| @@ -67,6 +67,7 @@ import org.apache.tools.ant.util.facade.FacadeTaskHelper; | |||||
| * <li>includejavaruntime | * <li>includejavaruntime | ||||
| * <li>source | * <li>source | ||||
| * <li>compiler | * <li>compiler | ||||
| * <li>release | |||||
| * </ul> | * </ul> | ||||
| * Of these arguments, the <b>sourcedir</b> and <b>destdir</b> are required. | * Of these arguments, the <b>sourcedir</b> and <b>destdir</b> are required. | ||||
| * <p> | * <p> | ||||
| @@ -121,6 +122,7 @@ public class Javac extends MatchingTask { | |||||
| private boolean depend = false; | private boolean depend = false; | ||||
| private boolean verbose = false; | private boolean verbose = false; | ||||
| private String targetAttribute; | private String targetAttribute; | ||||
| private String release; | |||||
| private Path bootclasspath; | private Path bootclasspath; | ||||
| private Path extdirs; | private Path extdirs; | ||||
| private Boolean includeAntRuntime; | private Boolean includeAntRuntime; | ||||
| @@ -787,6 +789,32 @@ public class Javac extends MatchingTask { | |||||
| : getProject().getProperty(MagicNames.BUILD_JAVAC_TARGET); | : getProject().getProperty(MagicNames.BUILD_JAVAC_TARGET); | ||||
| } | } | ||||
| /** | |||||
| * Sets the version to use for the {@code --release} switch that | |||||
| * combines {@code source}, {@code target} and setting the | |||||
| * bootclasspath. | |||||
| * | |||||
| * Values depend on the compiler, for jdk 9 the valid values are | |||||
| * "6", "7", "8", "9". | |||||
| * @param release the value of the release attribute | |||||
| * @since Ant 1.9.8 | |||||
| */ | |||||
| public void setRelease(final String release) { | |||||
| this.release = release; | |||||
| } | |||||
| /** | |||||
| * Gets the version to use for the {@code --release} switch that | |||||
| * combines {@code source}, {@code target} and setting the | |||||
| * bootclasspath. | |||||
| * | |||||
| * @return the value of the release attribute | |||||
| * @since Ant 1.9.8 | |||||
| */ | |||||
| public String getRelease() { | |||||
| return release; | |||||
| } | |||||
| /** | /** | ||||
| * If true, includes Ant's own classpath in the classpath. | * If true, includes Ant's own classpath in the classpath. | ||||
| * @param include if true, includes Ant's own classpath in the classpath | * @param include if true, includes Ant's own classpath in the classpath | ||||
| @@ -70,6 +70,7 @@ public abstract class DefaultCompilerAdapter | |||||
| protected boolean depend = false; | protected boolean depend = false; | ||||
| protected boolean verbose = false; | protected boolean verbose = false; | ||||
| protected String target; | protected String target; | ||||
| protected String release; | |||||
| protected Path bootclasspath; | protected Path bootclasspath; | ||||
| protected Path extdirs; | protected Path extdirs; | ||||
| protected Path compileClasspath; | protected Path compileClasspath; | ||||
| @@ -111,6 +112,7 @@ public abstract class DefaultCompilerAdapter | |||||
| depend = attributes.getDepend(); | depend = attributes.getDepend(); | ||||
| verbose = attributes.getVerbose(); | verbose = attributes.getVerbose(); | ||||
| target = attributes.getTarget(); | target = attributes.getTarget(); | ||||
| release = attributes.getRelease(); | |||||
| bootclasspath = attributes.getBootclasspath(); | bootclasspath = attributes.getBootclasspath(); | ||||
| extdirs = attributes.getExtdirs(); | extdirs = attributes.getExtdirs(); | ||||
| compileList = attributes.getFileList(); | compileList = attributes.getFileList(); | ||||
| @@ -321,15 +323,17 @@ public abstract class DefaultCompilerAdapter | |||||
| cmd.createArgument().setValue("-sourcepath"); | cmd.createArgument().setValue("-sourcepath"); | ||||
| cmd.createArgument().setPath(sourcepath); | cmd.createArgument().setPath(sourcepath); | ||||
| } | } | ||||
| if (target != null) { | |||||
| cmd.createArgument().setValue("-target"); | |||||
| cmd.createArgument().setValue(target); | |||||
| } | |||||
| if (release == null || !assumeJava19()) { | |||||
| if (target != null) { | |||||
| cmd.createArgument().setValue("-target"); | |||||
| cmd.createArgument().setValue(target); | |||||
| } | |||||
| final Path bp = getBootClassPath(); | |||||
| if (bp.size() > 0) { | |||||
| cmd.createArgument().setValue("-bootclasspath"); | |||||
| cmd.createArgument().setPath(bp); | |||||
| final Path bp = getBootClassPath(); | |||||
| if (bp.size() > 0) { | |||||
| cmd.createArgument().setValue("-bootclasspath"); | |||||
| cmd.createArgument().setPath(bp); | |||||
| } | |||||
| } | } | ||||
| if (extdirs != null && extdirs.size() > 0) { | if (extdirs != null && extdirs.size() > 0) { | ||||
| @@ -390,13 +394,27 @@ public abstract class DefaultCompilerAdapter | |||||
| setupJavacCommandlineSwitches(cmd, true); | setupJavacCommandlineSwitches(cmd, true); | ||||
| if (!assumeJava13()) { // -source added with JDK 1.4 | if (!assumeJava13()) { // -source added with JDK 1.4 | ||||
| final String t = attributes.getTarget(); | final String t = attributes.getTarget(); | ||||
| if (attributes.getSource() != null) { | |||||
| cmd.createArgument().setValue("-source"); | |||||
| cmd.createArgument() | |||||
| .setValue(adjustSourceValue(attributes.getSource())); | |||||
| final String s = attributes.getSource(); | |||||
| if (release == null || !assumeJava19()) { | |||||
| if (release != null) { | |||||
| attributes.log("Support for javac --release has been added" | |||||
| + " in Java9 ignoring it"); | |||||
| } | |||||
| if (s != null) { | |||||
| cmd.createArgument().setValue("-source"); | |||||
| cmd.createArgument().setValue(adjustSourceValue(s)); | |||||
| } else if (t != null && mustSetSourceForTarget(t)) { | |||||
| setImplicitSourceSwitch(cmd, t, adjustSourceValue(t)); | |||||
| } else if (t != null && mustSetSourceForTarget(t)) { | |||||
| setImplicitSourceSwitch(cmd, t, adjustSourceValue(t)); | |||||
| } | |||||
| } else { // Java 9+ and release has been set | |||||
| if (t != null || s != null || getBootClassPath().size() > 0) { | |||||
| attributes.log("Ignoring source, target and bootclasspath" | |||||
| + " as release has been set", | |||||
| Project.MSG_WARN); | |||||
| } | |||||
| cmd.createArgument().setValue("--release"); | |||||
| cmd.createArgument().setValue(release); | |||||
| } | } | ||||
| } | } | ||||
| final Path msp = getModulesourcepath(); | final Path msp = getModulesourcepath(); | ||||
| @@ -68,6 +68,18 @@ public class DefaultCompilerAdapterTest { | |||||
| } | } | ||||
| } | } | ||||
| private static class SourceTargetHelperNoOverride extends DefaultCompilerAdapter { | |||||
| public boolean execute() { return false; } | |||||
| /** | |||||
| * public to avoid classloader issues. | |||||
| */ | |||||
| public Commandline setupModernJavacCommandlineSwitches(Commandline cmd) { | |||||
| return super.setupModernJavacCommandlineSwitches(cmd); | |||||
| } | |||||
| } | |||||
| @Test | @Test | ||||
| public void testSourceIsIgnoredForJavac13() { | public void testSourceIsIgnoredForJavac13() { | ||||
| testSource(null, "javac1.3", "", null, "1.1"); | testSource(null, "javac1.3", "", null, "1.1"); | ||||
| @@ -387,6 +399,56 @@ public class DefaultCompilerAdapterTest { | |||||
| } | } | ||||
| } | } | ||||
| @Test | |||||
| public void releaseIsIgnoredForJava8() { | |||||
| LogCapturingJavac javac = new LogCapturingJavac(); | |||||
| Project p = new Project(); | |||||
| javac.setProject(p); | |||||
| javac.setCompiler("javac8"); | |||||
| javac.setSource("6"); | |||||
| javac.setTarget("6"); | |||||
| javac.setRelease("6"); | |||||
| javac.setSourcepath(new Path(p)); | |||||
| SourceTargetHelperNoOverride sth = new SourceTargetHelperNoOverride(); | |||||
| sth.setJavac(javac); | |||||
| Commandline cmd = new Commandline(); | |||||
| sth.setupModernJavacCommandlineSwitches(cmd); | |||||
| assertContains("Support for javac --release has been added in " | |||||
| + "Java9 ignoring it", javac.getLog()); | |||||
| String[] args = cmd.getCommandline(); | |||||
| assertEquals(7, args.length); | |||||
| assertEquals("-classpath", args[0]); | |||||
| assertEquals("-target", args[2]); | |||||
| assertEquals("6", args[3]); | |||||
| assertEquals("-g:none", args[4]); | |||||
| assertEquals("-source", args[5]); | |||||
| assertEquals("6", args[6]); | |||||
| } | |||||
| @Test | |||||
| public void releaseIsUsedForJava9() { | |||||
| LogCapturingJavac javac = new LogCapturingJavac(); | |||||
| Project p = new Project(); | |||||
| javac.setProject(p); | |||||
| javac.setCompiler("javac9"); | |||||
| javac.setSource("6"); | |||||
| javac.setTarget("6"); | |||||
| javac.setRelease("6"); | |||||
| javac.setSourcepath(new Path(p)); | |||||
| SourceTargetHelperNoOverride sth = new SourceTargetHelperNoOverride(); | |||||
| sth.setJavac(javac); | |||||
| Commandline cmd = new Commandline(); | |||||
| sth.setupModernJavacCommandlineSwitches(cmd); | |||||
| assertContains("Ignoring source, target and bootclasspath as " | |||||
| + "release has been set", javac.getLog()); | |||||
| String[] args = cmd.getCommandline(); | |||||
| assertEquals(5, args.length); | |||||
| assertEquals("-classpath", args[0]); | |||||
| assertEquals("-g:none", args[2]); | |||||
| assertEquals("--release", args[3]); | |||||
| assertEquals("6", args[4]); | |||||
| } | |||||
| private void commonSourceDowngrades(String javaVersion) { | private void commonSourceDowngrades(String javaVersion) { | ||||
| testSource("1.3", javaVersion, | testSource("1.3", javaVersion, | ||||
| "If you specify -target 1.1 you now must also specify" | "If you specify -target 1.1 you now must also specify" | ||||