ANT:如何从 Java 调用 ANT build.xml 文件

Posted

技术标签:

【中文标题】ANT:如何从 Java 调用 ANT build.xml 文件【英文标题】:ANT :How to call ANT build.xml file from Java 【发布时间】:2013-02-04 06:17:36 【问题描述】:

我有一个 build.xml 来为我的应用程序生成 Jar 文件。

我正在尝试直接调用build.xml,如下所示

import java.io.IOException;

public class RunBuild 

    public static void main(String args[]) throws IOException 
        Runtime rt = Runtime.getRuntime();
        Process proc = rt.exec("/home/sai/Jan5WS/AntTest/build.xml");
    


它没有抛出任何异常,但它没有生成 jar 文件。

我目前使用的是 ubuntu 12 和 ant 8.1 版本

谁能告诉我有什么问题吗??

谢谢

编辑部分

我试过这样运行

public static void main(String args[]) throws IOException

File buildFile = new File("build.xml", "/home/sai/Jan5WS/AntTest");
Project p = new Project();
p.setUserProperty("ant.file", buildFile.getAbsolutePath());
p.init();
ProjectHelper helper = ProjectHelper.getProjectHelper();
p.addReference("ant.projectHelper", helper);
helper.parse(p, buildFile);
p.executeTarget(p.getDefaultTarget());

但它的投掷

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/tools/ant/launch/AntMain
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$100(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at org.apache.tools.ant.Project.initProperties(Project.java:313)
    at org.apache.tools.ant.Project.init(Project.java:300)
    at RunBuild.main(RunBuild.java:15)

【问题讨论】:

你是如何运行代码的?您的类路径可能没有所有库。日志中有 ClassNotFoundException 吗? 【参考方案1】:

假设正常的ant,你不能执行build.xml。

您需要运行 ant 并将 build.xml 作为参数传递。

(可以使用其库运行 ant 项目:请参阅此问题 Is it possible to call Ant or NSIS scripts from Java code?)

【讨论】:

【参考方案2】:

你有两个选择:

    使用 System.execute("ant", "-f", "/home/nitesh/Projects/ANT_DEMO/RPM_ANT/SIS/build.xml") 在新的 JVM 中执行 ant 使用 ProjectHelper 在同一 JVM 中执行构建, 代码示例:

        File buildFile = new File("/home/sai/Jan5WS/AntTest", "build.xml");
        Project p = new Project();
        p.setUserProperty("ant.file", buildFile.getAbsolutePath());
        p.init();
        ProjectHelper helper = ProjectHelper.getProjectHelper();
        p.addReference("ant.projectHelper", helper);
        helper.parse(p, buildFile);
        p.executeTarget(p.getDefaultTarget());

在这种情况下,ant.jar 和 ant-launcher.jar 必须在类路径中。

【讨论】:

【参考方案3】:

build.xml 不是可执行文件。它只是一个普通的 xml 文件。您需要执行“ant”并通过代码中的“-f”标志提供此 build.xml 文件的路径。

【讨论】:

【参考方案4】:

试试它对我有用....

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class CreateJar 

        public static void main(String[] args) 

                Process process;
                try 
                        process = new ProcessBuilder("ant","-f" ,"/home/nitesh/Projects/ANT_DEMO/RPM_ANT/SIS/build.xml").start();
                        process.waitFor();
                        InputStream is = process.getInputStream();
                    InputStreamReader isr = new InputStreamReader(is);
                    BufferedReader br = new BufferedReader(isr);
                    String line;
                    while ((line = br.readLine()) != null) 
                      System.out.println(line);
                    

                 catch (Exception e) 
                        e.printStackTrace();
                



        


这里是 build.xml

<project name="rpmextract" default="jar" basedir=".">
<property name="build" location="build"/>
<target name="jar">
<jar destfile="app.jar" basedir="$build/classes"/> 
</target>
</project>

【讨论】:

【参考方案5】:

我遇到了同样的问题,我通过以下步骤解决了:

1.- 为您的 ant 版本下载 ant-launcher.jar

2.- 将其添加到您的库中

【讨论】:

以上是关于ANT:如何从 Java 调用 ANT build.xml 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖ant.core.lib位置

Java Ant Build详解

如何修改Java 9的ANT build.xml中的xjc块?

Ant—使用Ant构建简单Java项目

如何在eclipse中进行ant?

Java:如何使用自定义 Ant build.xml 将 ProGuard 集成到 Jar 项目中