我能否调用位于另一个jar文件中的jar库内的类文件?

3

我正在尝试访问打包为库的类文件,但不幸的是,JAR库应该打包在另一个JAR文件中。

举个例子,假设我有一个包含一些类库的a.jar文件。我可以从我的外部Java应用程序中调用(导入)JAR文件中的类。现在,我需要将这个a.jar放在另一个JAR文件b.jar中,并且需要从b.jar的外部访问(导入)a.jar中的类。

这不是我想做的事情 :)


你的意思是说你有一个包含其他 jar 包的 jar 包吗?还是你想在你的 jar 包中包含依赖的 jar 包?具体问题是什么? - djna
2个回答

6

您需要编写一个能够处理“嵌套JAR包”的类加载器。对我来说,这听起来像一个非常糟糕的想法。

不要合并JAR文件-只需将它们分别存储在磁盘上即可。我知道您可能需要说服管理层有更多文件的必要性,但这确实会使一切变得更加简单。编写类加载器并不是一件简单的事情...


1
也许我没有理解清楚,但我认为您想要的是在类路径上执行程序和其他JAR文件一起。

假设您有A.jar中的一些核心内容和B.jar中的一些库。您可以像这样执行程序(在Windows上用;替换:):

java -cp A.jar:B.jar main.class.Name args

main.class.Name 是你的主类名,args 则是你所有命令行参数的位置。

你也可以在你的 manifest.mf 中添加 Main-ClassClass-Path 属性,像这样:

Class-Path: B.jar
Main-Class: main.class.Name

然后你可以像这样执行程序:

java -jar A.jar args

说实话,我曾经认为将我的应用程序作为单个JAR文件分发,提取所有依赖项并包装在一个巨大的JAR文件中是很棒的。问题是,有些应用程序最终会有相当多的依赖项,每次我对我的代码进行更改时,也意味着我必须分发所有依赖代码,即使依赖项中没有任何更改。这意味着即使只有微小的更改,也要分发巨大的JAR文件。
通过使用Class-Path清单属性,我可以分发可以像单个JAR文件一样执行的应用程序(在某些系统上双击或简单的"java -jar"命令),但通过不传输所有重复库来节省大量时间和带宽,以后的软件发布。
还可以将任何依赖的JAR放入它们自己的目录中(现在称之为lib),并修改Class-Path,使所有JAR路径看起来像"lib/B.jar"。然后您不会让主程序目录充满许多小型JAR文件。

问题是OP在一个jar文件内部有另一个jar文件。 - Jon Skeet
我想通过重新阅读问题的标题来澄清这一点,但绝对不能从问题本身的文本中得出答案。 - Adam Batkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接