【问题标题】:Running an ANT build.xml file inside a Jar file在 Jar 文件中运行 ANT build.xml 文件
【发布时间】:2014-06-24 06:55:17
【问题描述】:

我需要使用存储在 jar 文件中的 build.xml 文件运行 ANT 构建。这个 jar 文件在类路径中可用。是否可以做到这一点,而无需分解 jar 文件并将 build.xml 保存到本地目录?如果是这样,我该怎么做。

更新:

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

【问题讨论】:

  • 你能提供更多关于你想要做什么的信息吗? ANT 通常在文件系统上工作,从中编译源代码并在其中创建工件,因此很可能您最终会使用文件系统。为什么不想提取 build.xml 文件?
  • 更新了问题。
  • 您可以读取文件,将其存储在临时位置,运行 ant,然后删除临时文件。
  • 是的,我可以做到。但我只是在想我是否可以这样阅读。
  • 这个 SO 链接可能有用。 stackoverflow.com/questions/6733684/run-ant-from-java。可以使用 getResource() 找到 build.xml。

标签: java ant


【解决方案1】:

我认为这是不可能的。 ProjectHelper#parse 方法的 API 表明项目助手可以支持任何类型的源,包括 InputStream

source - XML 配置的来源。助手必须至少支持文件,以实现向后兼容性。 Helpers 可能支持 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 是在几行之后创建的:/

The apache ant manual 建议可以实现自己的ProjectHelper 并使用系统属性org.apache.tools.ant.ProjectHelper 配置ant 以使用它。

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

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

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

【讨论】:

  • 只是按照你的建议做了。提取 build.xml 文件并运行它。
【解决方案2】:

可以通过使用 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);

【讨论】:

    猜你喜欢
    • 2016-11-22
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 2012-02-16
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多