Java JAR 文件依赖关系

标签 java eclipse jar

我对 jar 文件有疑问。

假设我有一个 a.jar,它依赖于 b.jarc.jar

我读到的许多文章都说,当我们想要导出a.jar以供另一个项目使用时,a.jar将不起作用,因为它的依赖项不会被引用,即这里的b.jarc.jar

但是,如果我们在另一个项目中不仅提供 a.jar,而且还提供 b.jarc.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.jarc.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/

相关文章:

Java AWT 或 Swing 用于 GUI 构建?

java - 有没有办法获取 DOM 中节点的索引?

eclipse - stm32l0 : Failed to execute MI command. 使用 vFlashErase 数据包删除闪存时出错

eclipse - 在 Eclipse 中重构 : how to add field, getter,setter 到接口(interface)的所有实现?

spring-boot - 从Gradle创建可执行jar文件并在Maven中导入jar

java - 如何在 UNIX 上找到正在运行的 jar 文件路径?

java - 使用 Java 发送斜杠和反斜杠

java - SQLiteBlobTooBigException - 华为设备、Android 9 和 10

eclipse - 如何在安装前验证升级

linux - 如何打开JAR文件中文件名长度大于255的文件?