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



我需要使用存储在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.Filejava.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);

相关内容

  • 没有找到相关文章

最新更新