You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by an...@apache.org on 2003/07/30 15:56:06 UTC
cvs commit: ant/docs/manual/CoreTasks java.html
antoine 2003/07/30 06:56:06
Modified: src/etc/testcases/taskdefs java.xml
src/testcases/org/apache/tools/ant/taskdefs JavaTest.java
src/main/org/apache/tools/ant/taskdefs Java.java
. WHATSNEW
docs/manual/CoreTasks java.html
Log:
Add spawn attribute to java task as well
PR: 5907
Revision Changes Path
1.6 +25 -15 ant/src/etc/testcases/taskdefs/java.xml
Index: java.xml
===================================================================
RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/java.xml,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- java.xml 22 Apr 2003 22:12:53 -0000 1.5
+++ java.xml 30 Jul 2003 13:56:06 -0000 1.6
@@ -2,41 +2,44 @@
<project name="java-test" basedir="." default="foo">
- <property name="app"
+ <property name="app"
value="org.apache.tools.ant.taskdefs.JavaTest$$EntryPoint" />
- <property name="app2"
+ <property name="app2"
value="org.apache.tools.ant.taskdefs.JavaTest$$ExceptingEntryPoint" />
-
+
+ <property name="spawnapp"
+ value="org.apache.tools.ant.taskdefs.JavaTest$$SpawnEntryPoint" />
+
<path id="test.classpath">
<pathelement location="${build.tests}"/>
</path>
-
+
<target name="testNoJarNoClassname">
<java/>
</target>
<target name="testJarNoFork">
<java jar="test.jar" fork="false"/>
- </target>
-
-
+ </target>
+
+
<target name="testJarAndClassName">
<java jar="test.jar" classname="${app}" />
</target>
-
+
<target name="testClassnameAndJar">
<java classname="${app}" jar="test.jar" />
- </target>
-
+ </target>
+
<target name="testRun">
- <fail unless="tests-classpath.value" />
+ <fail unless="tests-classpath.value" />
<java classname="${app}"
classpath="${tests-classpath.value}"/>
</target>
<target name="testRunFail">
- <java classname="${app}"
+ <java classname="${app}"
classpath="${tests-classpath.value}"
>
<arg value="-1"/>
@@ -88,7 +91,7 @@
fork="true">
</java>
</target>
-
+
<target name="testResultPropertyZero">
<java classname="${app}"
classpath="${tests-classpath.value}"
@@ -97,7 +100,7 @@
</java>
<echo message="exitcode = ${exitcode}"/>
</target>
-
+
<target name="testResultPropertyNonZero">
<java classname="${app}"
classpath="${tests-classpath.value}"
@@ -109,6 +112,13 @@
</java>
<echo message="exitcode = ${exitcode}"/>
</target>
-
+
+ <target name="testSpawn">
+ <java classname="${spawnapp}" fork="true" spawn="true" classpath="${tests-classpath.value}">
+ <arg value="${timeToWait}"/>
+ <arg value="${logFile}" />
+ </java>
+ </target>
+
<target name="foo" />
</project>
1.11 +52 -2 ant/src/testcases/org/apache/tools/ant/taskdefs/JavaTest.java
Index: JavaTest.java
===================================================================
RCS file: /home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/JavaTest.java,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- JavaTest.java 22 Apr 2003 22:12:53 -0000 1.10
+++ JavaTest.java 30 Jul 2003 13:56:06 -0000 1.11
@@ -57,6 +57,7 @@
import junit.framework.*;
import java.io.*;
import org.apache.tools.ant.*;
+import org.apache.tools.ant.util.FileUtils;
/**
* stress out java task
@@ -65,7 +66,8 @@
* @author <a href="mailto:donal@savvion.com">Donal Quinlan</a>
* */
public class JavaTest extends BuildFileTest {
-
+
+ private static final int TIME_TO_WAIT = 4;
private boolean runFatalTests=false;
public JavaTest(String name) {
@@ -176,7 +178,23 @@
executeTarget("testResultPropertyNonZero");
assertEquals("-1",project.getProperty("exitcode"));
}
-
+
+ public void testSpawn() {
+ FileUtils fileutils = FileUtils.newFileUtils();
+ File logFile = fileutils.createTempFile("spawn","log", project.getBaseDir());
+ // this is guaranteed by FileUtils#createTempFile
+ assertTrue("log file not existing", !logFile.exists());
+ project.setProperty("logFile", logFile.getAbsolutePath());
+ project.setProperty("timeToWait", Long.toString(TIME_TO_WAIT));
+ project.executeTarget("testSpawn");
+ try {
+ Thread.sleep(TIME_TO_WAIT * 1000 + 400);
+ } catch (Exception ex) {
+ System.out.println("my sleep was interrupted");
+ }
+ assertTrue("log file exists", logFile.exists());
+ }
+
/**
* entry point class with no dependencies other
* than normal JRE runtime
@@ -223,6 +241,38 @@
*/
public static void main(String[] argv) {
throw new NullPointerException("Exception raised inside called program");
+ }
+ }
+ /**
+ * test class for spawn
+ */
+ public static class SpawnEntryPoint {
+ public static void main(String [] argv) {
+ int sleepTime = 10;
+ String logFile = "spawn.log";
+ if (argv.length >= 1) {
+ sleepTime = Integer.parseInt(argv[0]);
+ }
+ if (argv.length >= 2)
+ {
+ logFile = argv[1];
+ }
+ OutputStreamWriter out = null;
+ try {
+ Thread.sleep(sleepTime * 1000);
+ } catch (InterruptedException ex) {
+ System.out.println("my sleep was interrupted");
+ }
+
+ try {
+ File dest = new File(logFile);
+ FileOutputStream fos = new FileOutputStream(dest);
+ out = new OutputStreamWriter(fos);
+ out.write("bye bye\n");
+ } catch (Exception ex) {}
+ finally {
+ try {out.close();} catch (IOException ioe) {}}
+
}
}
}
1.67 +75 -2 ant/src/main/org/apache/tools/ant/taskdefs/Java.java
Index: Java.java
===================================================================
RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Java.java,v
retrieving revision 1.66
retrieving revision 1.67
diff -u -r1.66 -r1.67
--- Java.java 28 Jul 2003 17:59:28 -0000 1.66
+++ Java.java 30 Jul 2003 13:56:06 -0000 1.67
@@ -94,6 +94,8 @@
private Long timeout = null;
private Redirector redirector = new Redirector(this);
private String resultProperty;
+ private boolean spawn = false;
+ private boolean incompatibleWithSpawn = false;
/**
* Do the execution.
* @throws BuildException if failOnError is set to true and the application
@@ -136,7 +138,17 @@
throw new BuildException("Cannot execute a jar in non-forked mode."
+ " Please set fork='true'. ");
}
-
+ if (spawn && !fork) {
+ throw new BuildException("Cannot spawn a java process in non-forked mode."
+ + " Please set fork='true'. ");
+ }
+ if (spawn && incompatibleWithSpawn) {
+ getProject().log("spawn does not allow attributes related to input, "
+ + "output, error, result", Project.MSG_ERR);
+ getProject().log("spawn does not also not allow timeout", Project.MSG_ERR);
+ throw new BuildException("You have used an attribute which is "
+ + "not compatible with spawn");
+ }
if (fork) {
log(cmdl.describeCommand(), Project.MSG_VERBOSE);
} else {
@@ -165,7 +177,12 @@
try {
if (fork) {
- return run(cmdl.getCommandline());
+ if (!spawn) {
+ return run(cmdl.getCommandline());
+ } else {
+ spawn(cmdl.getCommandline());
+ return 0;
+ }
} else {
try {
run(cmdl);
@@ -192,6 +209,16 @@
}
/**
+ * set whether or not you want the process to be spawned
+ * default is not spawned
+ * @param spawn if true you do not want ant to wait for the end of the process
+ * @since ant 1.6
+ */
+ public void setSpawn(boolean spawn) {
+ this.spawn = spawn;
+ }
+
+ /**
* Set the classpath to be used when running the Java class
*
* @param s an Ant Path object containing the classpath.
@@ -373,6 +400,7 @@
*/
public void setFailonerror(boolean fail) {
failOnError = fail;
+ incompatibleWithSpawn = true;
}
/**
@@ -392,6 +420,7 @@
*/
public void setOutput(File out) {
redirector.setOutput(out);
+ incompatibleWithSpawn = true;
}
/**
@@ -401,6 +430,7 @@
*/
public void setInput(File input) {
redirector.setInput(input);
+ incompatibleWithSpawn = true;
}
/**
@@ -410,6 +440,7 @@
*/
public void setInputString(String inputString) {
redirector.setInputString(inputString);
+ incompatibleWithSpawn = true;
}
/**
@@ -422,6 +453,7 @@
*/
public void setLogError(boolean logError) {
redirector.setLogError(logError);
+ incompatibleWithSpawn = true;
}
/**
@@ -433,6 +465,7 @@
*/
public void setError(File error) {
redirector.setError(error);
+ incompatibleWithSpawn = true;
}
/**
@@ -444,6 +477,7 @@
*/
public void setOutputproperty(String outputProp) {
redirector.setOutputProperty(outputProp);
+ incompatibleWithSpawn = true;
}
/**
@@ -456,6 +490,7 @@
*/
public void setErrorProperty(String errorProperty) {
redirector.setErrorProperty(errorProperty);
+ incompatibleWithSpawn = true;
}
/**
@@ -510,6 +545,7 @@
*/
public void setAppend(boolean append) {
this.append = append;
+ incompatibleWithSpawn = true;
}
/**
@@ -521,6 +557,7 @@
*/
public void setTimeout(Long value) {
timeout = value;
+ incompatibleWithSpawn = true;
}
/**
@@ -665,6 +702,42 @@
}
}
+ /**
+ * Executes the given classname with the given arguments in a separate VM.
+ */
+ private void spawn(String[] command) throws BuildException {
+
+ Execute exe
+ = new Execute();
+ exe.setAntRun(getProject());
+
+ if (dir == null) {
+ dir = getProject().getBaseDir();
+ } else if (!dir.exists() || !dir.isDirectory()) {
+ throw new BuildException(dir.getAbsolutePath()
+ + " is not a valid directory",
+ getLocation());
+ }
+
+ exe.setWorkingDirectory(dir);
+
+ String[] environment = env.getVariables();
+ if (environment != null) {
+ for (int i = 0; i < environment.length; i++) {
+ log("Setting environment variable: " + environment[i],
+ Project.MSG_VERBOSE);
+ }
+ }
+ exe.setNewenvironment(newEnvironment);
+ exe.setEnvironment(environment);
+
+ exe.setCommandline(command);
+ try {
+ exe.spawn();
+ } catch (IOException e) {
+ throw new BuildException(e, getLocation());
+ }
+ }
/**
* Executes the given classname with the given arguments as it
* was a command line application.
1.473 +3 -0 ant/WHATSNEW
Index: WHATSNEW
===================================================================
RCS file: /home/cvs/ant/WHATSNEW,v
retrieving revision 1.472
retrieving revision 1.473
diff -u -r1.472 -r1.473
--- WHATSNEW 29 Jul 2003 11:24:48 -0000 1.472
+++ WHATSNEW 30 Jul 2003 13:56:06 -0000 1.473
@@ -530,6 +530,9 @@
* <exec> will now have a new attribute spawn (default false).
If set to true, the process will be spawned. Bugzilla Report 5907.
+* <java> will now have a new attribute spawn (default false).
+If set to true, the process will be spawned. Bugzilla Report 5907.
+
* <parallel> now supports a timeout which can be used to recover
from deadlocks, etc in the parallel threads. <parallel> also
now supports a <daemons> nested element. This can be used to
1.20 +8 -0 ant/docs/manual/CoreTasks/java.html
Index: java.html
===================================================================
RCS file: /home/cvs/ant/docs/manual/CoreTasks/java.html,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- java.html 27 May 2003 08:49:41 -0000 1.19
+++ java.html 30 Jul 2003 13:56:06 -0000 1.20
@@ -57,6 +57,14 @@
<td align="center" valign="top">No</td>
</tr>
<tr>
+ <td valign="top">spawn</td>
+ <td valign="top">if enabled allows to start a process which will outlive ant.<br/>
+ Requires fork=true, and not compatible
+ with timeout, input, output, error, result attributes.<br/>
+ (disabled by default)</td>
+ <td align="center" valign="top">No</td>
+ </tr>
+ <tr>
<td valign="top">jvm</td>
<td valign="top">the command used to invoke the Java Virtual Machine,
default is 'java'. The command is resolved by java.lang.Runtime.exec().
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org
Re: cvs commit: ant/docs/manual/CoreTasks java.html
Posted by Antoine Levy-Lambert <an...@antbuild.com>.
Re : Java with spawn :
The test case runs OK on Windows 2000.
But not on Solaris.
I am investigating why.
Cheers,
Antoine
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org