我对 jar
文件有疑问。
假设我有一个 a.jar
,它依赖于 b.jar
和 c.jar
。
我读到的许多文章都说,当我们想要导出a.jar
以供另一个项目使用时,a.jar
将不起作用,因为它的依赖项不会被引用,即这里的b.jar
和c.jar
。
但是,如果我们在另一个项目中不仅提供 a.jar
,而且还提供 b.jar
和 c.jar
呢?这能解决问题吗?
我的猜测是我错了 - 如果这么简单,很多人都会这样做,就不会有关于这个问题的文章。
所以,我想出了一个主意。如果听起来很有趣,请纠正我。
如果我将 a.jar
重新加工为多个 jar
(其中没有一个相互依赖),并将它们“压缩”为整个 jar
文件,会怎样?
另外,我在想为什么rt.jar
不会有依赖问题。
最佳答案
if it were so easy, a lot of people would be doing it and there would be no articles about this issue.
具有讽刺意味的是,这几乎如您所期望的那么简单。对于某些预定义的 J2EE 工件(WAR、EAR 等),这就是完成的方式:依赖项捆绑在存档中。
存在类似问题的原因是,普通Java应用程序没有标准的方法来执行这种捆绑,并且在不借助工具的情况下很难传递地找出依赖关系。简而言之,如果您可以将 a.jar、b.jar、c.jar
捆绑在 zip 中,并有一个脚本将 b.jar
和 c.jar
放入类路径中,然后执行 a.jar
,那么一切都会好起来的。
解决传递依赖的方法通常是通过构建工具。 Maven、Ant+Ivy、Gradle 等都擅长处理这个问题。
然后是捆绑。通常有两种处理方法。
首先是创建一个包含相应脚本的包。在 zip 文件中,它包含所有依赖项 JAR,还可能包含用于执行类路径设置 + 执行的脚本。 Maven AppAssembler 插件就是示例之一
第二种方法是创建一个 Uber JAR,其中包含单个 JAR 本身中所有依赖项的内容。它可能是最容易部署的。您可以通过 Maven Shade 插件或 Maven Assemly 插件轻松完成。
(还有其他方法,例如将依赖项引用放在 JAR list 中等,但我个人认为上述两种方法使用更广泛,更容易采用)
关于Java JAR 文件依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23713163/