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

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

更新:

jar文件是一个ant构建项目,其中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()); 

我认为这是不可能的。 ProjectHelper #parse方法的API表明Project Helper可以支持任何类型的源,包括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 :/

apache ant手册表明,可以使用系统属性org.apache.tools.ant.ProjectHelper自己的ProjectHelper并配置ant以使用它。

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

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

所以我认为你最好的办法就是从jar中提取build.xml (如我的评论中所示)并对它运行ant。

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

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

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

 helper.parse(p, preBuildFileUrl);