在 Jar 文件内部运行 ANT build.xml 文件

4
我需要使用存储在JAR文件中的build.xml文件来运行ANT构建。该JAR文件位于类路径上。是否可以在不展开JAR文件并将build.xml保存到本地目录的情况下执行此操作?如果可以,我该如何做。
更新:
该JAR文件是一个ANT构建项目,其中通过使用ANT库从类路径中运行build.xml的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());

你能提供更多关于你正在尝试做什么的信息吗?ANT通常在文件系统上工作,从中编译源代码并在其中创建构件,因此你最有可能会使用文件系统。为什么你不想提取build.xml文件呢? - A4L
更新了问题。 - Dhanush Gopinath
你可以读取文件,将其存储在临时位置,运行Ant并删除临时文件。 - atoMerz
是的,我可以这样做。但我在想是否可以这样阅读它。 - Dhanush Gopinath
这个SO链接可能会有用。https://dev59.com/r2w15IYBdhLWcg3wQpbS。可以使用`getResource()`找到build.xml。 - Priyesh
显示剩余2条评论
2个回答

4
我认为这是不可能的。根据ProjectHelper#parse方法的API,一个Project helper可以支持任何类型的源,包括InputStream

source - XML配置的源。为了向后兼容,helper必须至少支持File。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 :/ Apache Ant手册建议可以通过系统属性org.apache.tools.ant.ProjectHelper来实现自己的ProjectHelper并配置Ant来使用它。

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

但需要实现的所有方法似乎只能使用java.io.Filejava.net.URL工作。
因此,我认为你最好从jar包中提取build.xml文件(如我的评论中所示),然后运行Ant。

1
刚刚按照你的建议做了。提取了 build.xml 文件并运行它。 - Dhanush Gopinath

0
可以使用Java URL语法来处理Jars。如果您是通过getResource()获取您的build.xml,则URL外部形式如下:
file:///some/local/path/to/my.jar!/path/inside/jar/to/build.xml

因此,通过URL调用应该没问题:

helper.parse(p, preBuildFileUrl);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接