在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.File
或java.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);