diff --git a/docs/manual/CoreTasks/javac.html b/docs/manual/CoreTasks/javac.html index 05bc9c0c2..7632c863b 100644 --- a/docs/manual/CoreTasks/javac.html +++ b/docs/manual/CoreTasks/javac.html @@ -191,8 +191,11 @@ files/directories from the CLASSPATH it passes to the compiler.
no.no. You can also give a
+ complete path to the javac executable to use instead of
+ yes, which would run the compiler of the Java
+ vesrion that is currently running Ant..class files in the ${build} directory.
The classpath used contains xyz.jar, and debug information is on.
+
+ <javac srcdir="${src}"
+ destdir="${build}"
+ fork="true"
+ />
+compiles all .java files under the ${src}
+directory, and stores the .class files in the
+${build} directory. This will fork off the javac
+compiler using the default javac executable.
<javac srcdir="${src}"
+ destdir="${build}"
+ fork="java$$javac.exe"
+ />
+compiles all .java files under the ${src}
+directory, and stores the .class files in the
+${build} directory. This will fork off the javac
+compiler using the executable named java$javac.exe. Note
+that the $ sign needs to be escaped by a second one.
<javac srcdir="${src}"
destdir="${build}"
includes="mypackage/p1/**,mypackage/p2/**"
diff --git a/src/main/org/apache/tools/ant/taskdefs/Javac.java b/src/main/org/apache/tools/ant/taskdefs/Javac.java
index d7d81bdb1..d12e1fd7c 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Javac.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Javac.java
@@ -63,6 +63,7 @@ import org.apache.tools.ant.util.GlobPatternMapper;
import org.apache.tools.ant.util.SourceFileScanner;
import org.apache.tools.ant.taskdefs.compilers.CompilerAdapter;
import org.apache.tools.ant.taskdefs.compilers.CompilerAdapterFactory;
+import org.apache.tools.ant.taskdefs.condition.Os;
import java.io.File;
@@ -118,7 +119,8 @@ public class Javac extends MatchingTask {
private Path extdirs;
private boolean includeAntRuntime = true;
private boolean includeJavaRuntime = false;
- private boolean fork = false;
+ private String fork = "false";
+ private String forkedExecutable = null;
private boolean nowarn = false;
private String memoryInitialSize;
private String memoryMaximumSize;
@@ -452,20 +454,40 @@ public class Javac extends MatchingTask {
/**
* Sets whether to fork the javac compiler.
- */
- public void setFork(boolean fork)
- {
- this.fork = fork;
+ *
+ * @param f "true|false|on|off|yes|no" or the name of the javac
+ * executable.
+ */
+ public void setFork(String f) {
+ if (f.equalsIgnoreCase("on")
+ || f.equalsIgnoreCase("true")
+ || f.equalsIgnoreCase("yes")) {
+ fork = "true";
+ forkedExecutable = getSystemJavac();
+ } else if (f.equalsIgnoreCase("off")
+ || f.equalsIgnoreCase("false")
+ || f.equalsIgnoreCase("no")) {
+ fork = "false";
+ } else {
+ fork = "true";
+ forkedExecutable = f;
+ }
}
/**
* Is this a forked invocation of JDK's javac?
*/
public boolean isForkedJavac() {
- return fork ||
+ return !"false".equals(fork) ||
"extJavac".equals(project.getProperty("build.compiler"));
}
+ /**
+ * The name of the javac executable to use in fork-mode.
+ */
+ public String getJavacExecutable() {
+ return forkedExecutable;
+ }
/**
* Sets whether the -nowarn option should be used.
@@ -519,7 +541,7 @@ public class Javac extends MatchingTask {
String compiler = project.getProperty("build.compiler");
- if (fork) {
+ if (!"false".equals(fork)) {
if (compiler != null) {
if (isJdkCompiler(compiler)) {
log("Since fork is true, ignoring build.compiler setting.",
@@ -611,4 +633,24 @@ public class Javac extends MatchingTask {
"javac1.4".equals(compiler);
}
+ protected String getSystemJavac() {
+ // This is the most common extension case - exe for windows and OS/2,
+ // nothing for *nix.
+ String extension = Os.isFamily("dos") ? ".exe" : "";
+
+ // Look for java in the java.home/../bin directory. Unfortunately
+ // on Windows java.home doesn't always refer to the correct location,
+ // so we need to fall back to assuming java is somewhere on the
+ // PATH.
+ java.io.File jExecutable =
+ new java.io.File(System.getProperty("java.home") +
+ "/../bin/javac" + extension );
+
+ if (jExecutable.exists() && !Os.isFamily("netware")) {
+ return jExecutable.getAbsolutePath();
+ } else {
+ return "javac";
+ }
+ }
+
}
diff --git a/src/main/org/apache/tools/ant/taskdefs/compilers/JavacExternal.java b/src/main/org/apache/tools/ant/taskdefs/compilers/JavacExternal.java
index 4b48563b7..49d8a5c36 100644
--- a/src/main/org/apache/tools/ant/taskdefs/compilers/JavacExternal.java
+++ b/src/main/org/apache/tools/ant/taskdefs/compilers/JavacExternal.java
@@ -56,7 +56,6 @@ package org.apache.tools.ant.taskdefs.compilers;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.condition.Os;
import org.apache.tools.ant.types.Commandline;
/**
@@ -73,7 +72,7 @@ public class JavacExternal extends DefaultCompilerAdapter {
attributes.log("Using external javac compiler", Project.MSG_VERBOSE);
Commandline cmd = new Commandline();
- cmd.setExecutable(getJavacExecutableName());
+ cmd.setExecutable(getJavac().getJavacExecutable());
setupModernJavacCommandlineSwitches(cmd);
int firstFileName = cmd.size();
logAndAddFilesToCompile(cmd);
@@ -81,25 +80,5 @@ public class JavacExternal extends DefaultCompilerAdapter {
return executeExternalCompile(cmd.getCommandline(), firstFileName) == 0;
}
- private String getJavacExecutableName() {
- // This is the most common extension case - exe for windows and OS/2,
- // nothing for *nix.
- String extension = Os.isFamily("dos") ? ".exe" : "";
-
- // Look for java in the java.home/../bin directory. Unfortunately
- // on Windows java.home doesn't always refer to the correct location,
- // so we need to fall back to assuming java is somewhere on the
- // PATH.
- java.io.File jExecutable =
- new java.io.File(System.getProperty("java.home") +
- "/../bin/javac" + extension );
-
- if (jExecutable.exists() && !Os.isFamily("netware")) {
- return jExecutable.getAbsolutePath();
- } else {
- return "javac";
- }
- }
-
}