diff --git a/src/main/org/apache/tools/ant/ExitException.java b/src/main/org/apache/tools/ant/ExitException.java
index 620c17107..2dc45f447 100644
--- a/src/main/org/apache/tools/ant/ExitException.java
+++ b/src/main/org/apache/tools/ant/ExitException.java
@@ -56,6 +56,8 @@ package org.apache.tools.ant;
/**
* Used to report exit status of classes which call System.exit()
*
+ * @see NoExitSecurityManager
+ *
* @author Conor MacNeill
*/
public class ExitException extends SecurityException {
@@ -64,12 +66,16 @@ public class ExitException extends SecurityException {
/**
* Constructs an exit exception.
+ * @param status the status code returned via System.exit()
*/
public ExitException(int status) {
super("ExitException: status " + status);
this.status = status;
}
+ /**
+ * @return the status code return via System.exit()
+ */
public int getStatus() {
return status;
}
diff --git a/src/main/org/apache/tools/ant/Main.java b/src/main/org/apache/tools/ant/Main.java
index 182f2b3d1..61c73bd3d 100644
--- a/src/main/org/apache/tools/ant/Main.java
+++ b/src/main/org/apache/tools/ant/Main.java
@@ -417,8 +417,15 @@ public class Main {
PrintStream err = System.err;
PrintStream out = System.out;
- SecurityManager oldsm = System.getSecurityManager();
+ // use a system manager that prevents from System.exit()
+ // only in JDK > 1.1
+ SecurityManager oldsm = null;
+ if ( !Project.JAVA_1_0.equals(Project.getJavaVersion()) &&
+ !Project.JAVA_1_1.equals(Project.getJavaVersion()) ){
+ oldsm = System.getSecurityManager();
+ System.setSecurityManager(new NoExitSecurityManager());
+ }
try {
System.setOut(new PrintStream(new DemuxOutputStream(project, false)));
System.setErr(new PrintStream(new DemuxOutputStream(project, true)));
@@ -468,6 +475,10 @@ public class Main {
project.executeTargets(targets);
}
finally {
+ // put back the original security manager
+ if (oldsm != null){
+ System.setSecurityManager(oldsm);
+ }
System.setOut(out);
System.setErr(err);
}
diff --git a/src/main/org/apache/tools/ant/NoExitSecurityManager.java b/src/main/org/apache/tools/ant/NoExitSecurityManager.java
new file mode 100644
index 000000000..618e596f5
--- /dev/null
+++ b/src/main/org/apache/tools/ant/NoExitSecurityManager.java
@@ -0,0 +1,76 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2001 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Ant", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * .
+ */
+package org.apache.tools.ant;
+
+import java.security.Permission;
+
+/**
+ * This is intended as a replacement for the default system manager.
+ * The goal is to intercept System.exit calls and make it throw an
+ * exception instead so that a System.exit in a task does not
+ * fully terminate Ant.
+ *
+ * @see ExitException
+ * @author Stephane Bailliez
+ */
+public class NoExitSecurityManager extends SecurityManager {
+
+ public void checkExit(int status) {
+ throw new ExitException(status);
+ }
+
+ public void checkPermission(Permission perm) {
+ // no permission here
+ }
+}