我对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
不会有依赖性问题。
答案 0 :(得分:1)
如果这么容易,很多人都会这么做,而且没有关于这个问题的文章。
具有讽刺意味的是,这几乎和你预期的一样容易。对于某些预定义的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清单中添加依赖项引用等,但我个人认为上面的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.MyClass
和com.b.ThirdPartyClass
。< / p>
当然可以手动执行此操作,但这有点单调乏味。但是,我建议使用Maven的Shade插件或UberJar插件。这些工具将重命名不同罐子中的类,这些罐子碰巧有可能导致冲突的名称,例如a.jar和b.jar都有类util.StringUtils
。
还有非Maven解决方案。搜索“超级罐子”或“罐子或罐子”(即使这不是你真正想要的东西)应该会找到一些工具。
Re rt.jar
,与JRE一起提供,因此您不必在发布中包含该内容。
答案 3 :(得分:0)
所有这些jar依赖关系都可以通过简单的maven或gradle依赖关系管理系统来处理。 试一试