我需要使用存储在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());
答案 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
实现仅支持
即使稍后创建InputStream
几行:/
The apache ant manual表示可以实现自己的ProjectHelper
并配置ant以使用系统属性org.apache.tools.ant.ProjectHelper
来使用它。
类org.apache.tools.ant.ProjectHelper是期望实现的API。因此,通过扩展该抽象类来编写自己的ProjectHelper。
但是,所有需要实施的方法似乎只适用于java.io.File
或java.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);