首页 文章

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

提问于
浏览
3

我需要使用存储在jar文件中的build.xml文件来运行ANT构建 . 此jar文件在类路径中可用 . 是否可以这样做,而不会爆炸jar文件并将build.xml保存到本地目录?如果是这样我怎么能这样做 .

Update:

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());

2 回答

  • 3

    我认为这是不可能的 . 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 后来创建了几行:/

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

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

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

    所以我认为你最好的选择是从jar中提取 build.xml (如我的评论所示)并对其进行反对 .

  • 0

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

相关问题