【发布时间】:2012-09-21 15:22:35
【问题描述】:
我想这是一个由两部分组成的问题。我正在尝试编写我自己的 Ant 任务 (MyFirstTask),它可以在其他项目的 build.xml 构建文件中使用。为此,我需要将我的 Ant 任务编译并打包到它自己的 JAR 中。因为我写的这个 Ant 任务相当复杂,它有大约 20 个依赖项(其他 JAR 文件),例如使用 XStream 进行 OX-mapping,Guice 进行 DI 等。
我目前正在 MyFirstTask 项目内的build.xml 文件中编写package 任务(将打包myfirsttask.jar 的构建文件,这是可重用的Ant 任务)。
我突然意识到我并不完全理解 Java JAR 的意图。 JAR 是否应该不包含依赖项,并将其留给运行时配置(应用程序容器、运行时环境等)来为其提供所需的依赖项?我会假设如果是这种情况,可执行 JAR 是规则的例外,是吗?
或者,Java JAR 是否意图也包含它们的依赖项?
无论哪种方式,我都不想强迫我的用户将 25 个以上的 JAR 复制粘贴到他们的 Ant 库中;这太残忍了。我喜欢 WAR 文件的设置方式,其中依赖项的类路径定义在 classes/ 目录下。
我想,最终,我希望我的 JAR 结构看起来像:
myfirsttask.jar/
com/ --> the root package of my compiled binaries
config/ --> config files, XML, XSD, etc.
classes/ --> all dependencies, guice-3.0.jar, xstream-1.4.3.jar, etc.
META-INF/
MANIFEST.MF
我假设为了完成这个(并让运行时类路径也查看classes/ 目录),我需要以某种方式修改 MANIFEST.MF(我知道有我相信一个名为ClassPath 的清单属性?)。我只是很难将所有东西放在一起,并且对 JAR 的最初意图有一个迫在眉睫/挥之不去的问题。
有人可以确认 Oracle 是否打算让 JAR 包含它们的依赖项吗?而且,无论哪种方式,我必须在清单(或其他任何地方)中做什么,以确保在运行时,类路径可以找到存储在 classes/ 目录下的依赖项?提前致谢!
【问题讨论】:
-
您可能在这里遗漏的一个细节是这是针对 EE 容器还是独立应用程序。对此没有正确答案,但在容器中肯定有错误的答案。罐子可以包含依赖项,所以是的,这是有意的。是好的设计吗?并非总是如此。
-
使用 ivy 满足依赖关系的完整示例可能会有所帮助。请参阅this answer,它适用于
script任务。
标签: java ant jar classpath manifest.mf