diff --git a/WHATSNEW b/WHATSNEW index 869c80483..019b8a452 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -64,6 +64,9 @@ Other changes: magic. Bugzilla Report 59860 + * a new implementation "forking" has been added to and is + used as default when running on JDK9. + Changes from Ant 1.9.6 TO Ant 1.9.7 =================================== diff --git a/manual/Tasks/javah.html b/manual/Tasks/javah.html index 34a7b875a..0fdc88561 100644 --- a/manual/Tasks/javah.html +++ b/manual/Tasks/javah.html @@ -37,12 +37,16 @@ systems are used.

with the implementation attribute or a nested element. Here are the choices of the attribute:

Note: if you are using this task to work on multiple files diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/javah/ForkingJavah.java b/src/main/org/apache/tools/ant/taskdefs/optional/javah/ForkingJavah.java new file mode 100644 index 000000000..c12f5940b --- /dev/null +++ b/src/main/org/apache/tools/ant/taskdefs/optional/javah/ForkingJavah.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ +package org.apache.tools.ant.taskdefs.optional.javah; + +import java.io.IOException; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.taskdefs.Execute; +import org.apache.tools.ant.taskdefs.LogStreamHandler; +import org.apache.tools.ant.taskdefs.optional.Javah; +import org.apache.tools.ant.types.Commandline; +import org.apache.tools.ant.util.JavaEnvUtils; + +/** + * This implementation runs the javah executable in a separate process. + * + * @since Ant 1.9.8 + */ +public class ForkingJavah implements JavahAdapter { + + /** + * the name of this adapter for users to select + */ + public static final String IMPLEMENTATION_NAME = "forking"; + + /** + * Performs the actual compilation. + * @param javah the calling javah task. + * @return true if the compilation was successful. + * @throws BuildException if there is an error. + */ + public boolean compile(Javah javah) throws BuildException { + Commandline cmd = SunJavah.setupJavahCommand(javah); + Project project = javah.getProject(); + String executable = JavaEnvUtils.getJdkExecutable("javah"); + javah.log("Running " + executable, Project.MSG_VERBOSE); + cmd.setExecutable(executable); + + //set up the args + String[] args = cmd.getCommandline(); + + try { + Execute exe = new Execute(new LogStreamHandler(javah, + Project.MSG_INFO, + Project.MSG_WARN)); + exe.setAntRun(project); + exe.setWorkingDirectory(project.getBaseDir()); + exe.setCommandline(args); + exe.execute(); + return !exe.isFailure(); + } catch (IOException exception) { + throw new BuildException("Error running " + executable + + " -maybe it is not on the path", exception); + } + } +} diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/javah/JavahAdapterFactory.java b/src/main/org/apache/tools/ant/taskdefs/optional/javah/JavahAdapterFactory.java index d98b42763..cc4419cfd 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/javah/JavahAdapterFactory.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/javah/JavahAdapterFactory.java @@ -44,6 +44,8 @@ public class JavahAdapterFactory { return Kaffeh.IMPLEMENTATION_NAME; } else if (JavaEnvUtils.isGij()) { return Gcjh.IMPLEMENTATION_NAME; + } else if (JavaEnvUtils.isAtLeastJavaVersion(JavaEnvUtils.JAVA_9)) { + return ForkingJavah.IMPLEMENTATION_NAME; } return SunJavah.IMPLEMENTATION_NAME; } @@ -87,6 +89,10 @@ public class JavahAdapterFactory { } else if ((JavaEnvUtils.isGij() && choice == null) || Gcjh.IMPLEMENTATION_NAME.equals(choice)) { return new Gcjh(); + } else if ((JavaEnvUtils.isAtLeastJavaVersion(JavaEnvUtils.JAVA_9) + && choice == null) + || ForkingJavah.IMPLEMENTATION_NAME.equals(choice)) { + return new ForkingJavah(); } else if (SunJavah.IMPLEMENTATION_NAME.equals(choice)) { return new SunJavah(); } else if (choice != null) { diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/javah/SunJavah.java b/src/main/org/apache/tools/ant/taskdefs/optional/javah/SunJavah.java index 0b1655ad8..7911b1773 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/javah/SunJavah.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/javah/SunJavah.java @@ -69,7 +69,7 @@ public class SunJavah implements JavahAdapter { return ej.fork(javah) == 0; } - private Commandline setupJavahCommand(Javah javah) { + static Commandline setupJavahCommand(Javah javah) { Commandline cmd = new Commandline(); if (javah.getDestdir() != null) { diff --git a/src/tests/antunit/taskdefs/optional/javah-test.xml b/src/tests/antunit/taskdefs/optional/javah-test.xml index a51eae39a..884523d9f 100644 --- a/src/tests/antunit/taskdefs/optional/javah-test.xml +++ b/src/tests/antunit/taskdefs/optional/javah-test.xml @@ -110,4 +110,26 @@ public class Foo { + + + + + + + + + + + + + + + + + + + +