3

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

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

这不是我想做的事情:)

4

2 回答 2

6

您将不得不编写一个能够处理“罐子中的罐子”的类加载器。这对我来说听起来是个很糟糕的主意。

不要合并 jar 文件 - 只需将它们分别放在磁盘上。我意识到您可能需要说服管理层拥有更多文件的必要性,但这确实会使一切变得更加简单。编写类加载器并非易事……

于 2009-08-11T06:19:58.560 回答
1

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

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

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

main.class.Name你的主类名在哪里args,你的所有命令行参数都在哪里。

你也可以像这样在你的中添加一个Main-ClassandClass-Path属性manifest.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 路径看起来像“ lib/B.jar”。这样您的主程序目录就不会充满许多微小的 JAR 文件。

于 2009-08-11T06:22:23.360 回答