我需要使用存储在jar文件中的build.xml文件运行ANT构建。这个jar文件在类路径中可用。不打开jar文件并将build.xml保存到本地目录,有可能做到这一点吗?如果有,我该怎么做呢?
更新:
jar文件是一个ant构建项目,其中类路径中的build.xml通过使用ant库的java程序运行。前端是一个web应用程序,它将这个构建项目jar作为依赖项加载。用户将单击Build App按钮来运行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配置的源。为了向后兼容,helper必须至少支持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手册建议可以实现自己的ProjectHelper
,并通过系统属性org.apache.tools.ant.ProjectHelper
配置ant以使用它。
类org.apache.tools.ant.ProjectHelper是期望实现的API。所以通过扩展这个抽象类来编写你自己的ProjectHelper。
但是所有需要实现的方法似乎只适用于java.io.File
或java.net.URL
。
所以我认为你最好的选择是从jar中提取build.xml
(如我的评论所示)并对其运行ant。
可以使用jar的Java URL语法。如果您使用getResource()获得build.xml,则URL外部表单如下所示:
file:///some/local/path/to/my.jar!/path/inside/jar/to/build.xml
所以用URL调用应该没问题:
helper.parse(p, preBuildFileUrl);