我可以调用位于另一个jar文件中的jar库中的类文件吗?

时间:2009-08-11 06:13:13

标签: java jar manifest packaging manifest.mf

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

作为一个例子,我说a.jar包含一些类库。我可以从外部java应用程序调用(导入)jar文件中的类。现在我需要把这个a.jar放在另一个jar说b.jar中,并且需要从b.jar外部访问(导入)a.jar中的类。

This is not the thing I want to do :)

2 个答案:

答案 0 :(得分:6)

您必须编写一个能够处理“罐子里的罐子”的类加载器。这听起来对我来说是一个非常糟糕的主意。

不要合并jar文件 - 只需将它们分别放在磁盘上。我意识到你可能需要说服管理有更多文件的必要性,但它确实会使一切很多更简单。编写类加载器非常重要......

答案 1 :(得分:1)

也许我没有正确理解,但我相信你想要的是用你的类路径上的另一个JAR文件(也)执行你的程序。

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

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

其中main.class.Name是您的主要类名,args是所有命令行参数的所在位置。

您还可以在Main-Class中添加Class-Pathmanifest.mf属性,如下所示:

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路径看起来像“{{1} }”。然后你不会得到充满许多小JAR文件的主程序目录。