在Jar文件中运行ANT build.xml文件

时间:2014-05-07 10:35:12

标签: java ant

我需要使用存储在jar文件中的build.xml文件来运行ANT构建。此jar文件在类路径中可用。是否可以这样做,而不会爆炸jar文件并将build.xml保存到本地目录?如果是这样我怎么能这样做。

更新

jar文件是一个ant build项目,其中classpath中的build.xml是使用ANT库通过java程序运行的。前端是一个Web应用程序,它将此构建项目jar作为依赖项加载。用户将单击“构建应用程序”按钮以​​运行ANT构建。因此,当用户单击Build App时,我需要在jar中运行build.xml文件。

读取build.xml文件的代码

URL preBuildFileUrl = getClass().getClassLoader().getResource("build.xml");
Project p = new Project();
p.setUserProperty("ant.file", preBuildFileUrl.toURI().getPath());
p.init();
ProjectHelper helper = ProjectHelper.getProjectHelper();
p.addReference("ant.projectHelper", helper);
helper.parse(p, new File(preBuildFileUrl.toURI().getPath()));
p.executeTarget(p.getDefaultTarget());

2 个答案:

答案 0 :(得分:3)

我认为这是不可能的。 ProjectHelper#parse方法的API表明,项目助手可以支持任何类型的来源,包括InputStream

  

source - XML配置的源代码。为了向后兼容,帮助程序必须至少支持File。帮助者可能支持URL, InputStream 等或特殊类型。

运行代码的修改样本

String buildXml = "build.xml";
Project p = new Project();
p.setUserProperty("ant.file", buildXml);
p.init();
ProjectHelper helper = ProjectHelper.getProjectHelper();
p.addReference("ant.projectHelper", helper);
InputStream inputStream = new FileInputStream(buildXml);
helper.parse(p, inputStream);
p.executeTarget(p.getDefaultTarget());

给出以下例外:

Exception in thread "main" 
Source java.io.FileInputStream not supported by this plugin
at org.apache.tools.ant.helper.ProjectHelper2.parse(ProjectHelper2.java:233)
at org.apache.tools.ant.helper.ProjectHelper2.parse(ProjectHelper2.java:177)
at ant.test.App.main(App.java:28)

在查看最新apache ant版本的源代码(发布时间为1.9.4)后,内置ProjectHelper实现仅支持

  • 的java.io.File
  • 的java.net.URL
  • org.apache.tools.ant.types.Resource

即使稍后创建InputStream几行:/

The apache ant manual表示可以实现自己的ProjectHelper并配置ant以使用系统属性org.apache.tools.ant.ProjectHelper来使用它。

  

类org.apache.tools.ant.ProjectHelper是期望实现的API。因此,通过扩展该抽象类来编写自己的ProjectHelper。

但是,所有需要实施的方法似乎只适用于java.io.Filejava.net.URL

所以我认为你最好的选择是从jar中提取build.xml(如我的评论中所示)并对其进行反对。

答案 1 :(得分:0)

可以使用jars的Java URL语法。如果您使用getResource()获取了build.xml,则URL外部表单如下所示:

file:///some/local/path/to/my.jar!/path/inside/jar/to/build.xml

所以使用URL调用应该没问题:

helper.parse(p, preBuildFileUrl);