diff --git a/docs/manual/CoreTasks/java.html b/docs/manual/CoreTasks/java.html index 2f68b6158..860a6e0f6 100644 --- a/docs/manual/CoreTasks/java.html +++ b/docs/manual/CoreTasks/java.html @@ -88,7 +88,7 @@ JVM. failonerror Stop the buildprocess if the command exits with a - returncode other than 0. Default is "false" + returncode other than 0. Default is "false"(see note) No @@ -220,6 +220,11 @@ see permissions

When the permission RuntimePermission exitVM has not been granted (or has been revoked) the System.exit() call will be intercepted and treated like indicated in failonerror.

+

+If you specify failonerror="true" and you do not specify permissions, +a set of default permissions will be added to your java invocation making sure that +a non zero return code will lead to a BuildException. +

Settings will be ignored if fork is enabled.

diff --git a/src/etc/testcases/taskdefs/java.xml b/src/etc/testcases/taskdefs/java.xml index 768974209..363dbeb81 100644 --- a/src/etc/testcases/taskdefs/java.xml +++ b/src/etc/testcases/taskdefs/java.xml @@ -139,7 +139,23 @@ + + + + + + + + + + diff --git a/src/main/org/apache/tools/ant/taskdefs/Java.java b/src/main/org/apache/tools/ant/taskdefs/Java.java index bc1e5786b..25e45c5ea 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Java.java +++ b/src/main/org/apache/tools/ant/taskdefs/Java.java @@ -97,7 +97,7 @@ public class Java extends Task { private Long timeout = null; private Redirector redirector = new Redirector(this); private String resultProperty; - private Permissions perm; + private Permissions perm = null; private boolean spawn = false; private boolean incompatibleWithSpawn = false; @@ -108,6 +108,7 @@ public class Java extends Task { */ public void execute() throws BuildException { File savedDir = dir; + Permissions savedPermissions = perm; int err = -1; try { @@ -122,6 +123,7 @@ public class Java extends Task { maybeSetResultPropertyValue(err); } finally { dir = savedDir; + perm = savedPermissions; } } @@ -179,6 +181,11 @@ public class Java extends Task { Project.MSG_WARN); } + if (perm == null && failOnError == true) { + perm = new Permissions(); + log("running " + this.cmdl.getClassname() + + " with default permissions (exit forbidden)", Project.MSG_VERBOSE); + } log("Running in same VM " + cmdl.describeJavaCommand(), Project.MSG_VERBOSE); } diff --git a/src/testcases/org/apache/tools/ant/taskdefs/JavaTest.java b/src/testcases/org/apache/tools/ant/taskdefs/JavaTest.java index d7d75e36d..9bf28c5a5 100644 --- a/src/testcases/org/apache/tools/ant/taskdefs/JavaTest.java +++ b/src/testcases/org/apache/tools/ant/taskdefs/JavaTest.java @@ -196,6 +196,15 @@ public class JavaTest extends BuildFileTest { assertEquals("-1",project.getProperty("exitcode")); } + public void testRunFailWithFailOnError() { + expectBuildExceptionContaining("testRunFailWithFailOnError", + "non zero return code", + "Java returned:"); + } + + public void testRunSuccessWithFailOnError() { + executeTarget("testRunSuccessWithFailOnError"); + } public void testSpawn() { FileUtils fileutils = FileUtils.newFileUtils(); File logFile = fileutils.createTempFile("spawn","log", project.getBaseDir());