Java JAR文件依赖项

时间:2014-05-17 15:38:09

标签: 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不会有依赖性问题。

4 个答案:

答案 0 :(得分:1)

  

如果这么容易,很多人都会这么做,而且没有关于这个问题的文章。

具有讽刺意味的是,这几乎和你预期的一样容易。对于某些预定义的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清单中添加依赖项引用等,但我个人认为上面的2更广泛使用并且更容易采用)

答案 1 :(得分:0)

看看

将类添加到JAR文件的类路径

http://docs.oracle.com/javase/tutorial/deployment/jar/downman.html

以下是摘录:

You may need to reference classes in other JAR files from within a JAR file.

For example, in a typical situation an applet is bundled in a JAR file whose 
manifest references a different JAR file (or several different JAR files) that 
serves as utilities for the purposes of that applet.

You specify classes to include in the Class-Path header field in the manifest 
file of an applet or application. The Class-Path header takes the following form:

Class-Path: jar1-name jar2-name directory-name/jar3-name


By using the Class-Path header in the manifest, you can avoid having to 
specify a long -classpath flag when invoking Java to run the your application.

答案 2 :(得分:0)

一个解决方案是创建一个“超级jar”,它在同一级别的单个jar中包含您的类和依赖项。例如,如果a.jar包含com.foo.MyClass且取决于com.b.ThirdPartyClass中的b.jar,那么优步jar将同时包含com.foo.MyClasscom.b.ThirdPartyClass。< / p>

当然可以手动执行此操作,但这有点单调乏味。但是,我建议使用Maven的Shade插件或UberJar插件。这些工具将重命名不同罐子中的类,这些罐子碰巧有可能导致冲突的名称,例如a.jar和b.jar都有类util.StringUtils

还有非Maven解决方案。搜索“超级罐子”或“罐子或罐子”(即使这不是你真正想要的东西)应该会找到一些工具。

Re rt.jar,与JRE一起提供,因此您不必在发布中包含该内容。

答案 3 :(得分:0)

所有这些jar依赖关系都可以通过简单的maven或gradle依赖关系管理系统来处理。 试一试