我正在尝试访问打包为库的类文件,但不幸的是,jar 库应该打包在另一个 jar 文件中。
例如说我有一个包含一些类库的.jar。我可以从我的外部 java 应用程序调用(导入)jar 文件中的类。现在我需要把这个 a.jar 放在另一个 jar 中,比如 b.jar,并且需要从 b.jar 外部访问(导入)a.jar 中的类。
我正在尝试访问打包为库的类文件,但不幸的是,jar 库应该打包在另一个 jar 文件中。
例如说我有一个包含一些类库的.jar。我可以从我的外部 java 应用程序调用(导入)jar 文件中的类。现在我需要把这个 a.jar 放在另一个 jar 中,比如 b.jar,并且需要从 b.jar 外部访问(导入)a.jar 中的类。
您将不得不编写一个能够处理“罐子中的罐子”的类加载器。这对我来说听起来是个很糟糕的主意。
不要合并 jar 文件 - 只需将它们分别放在磁盘上。我意识到您可能需要说服管理层拥有更多文件的必要性,但这确实会使一切变得更加简单。编写类加载器并非易事……
也许我没有正确理解,但我相信您想要的是使用您的类路径上的其他 JAR 文件(也)执行您的程序。
因此,假设您在 A.jar 中有一些核心,在 B.jar 中有一些库。您可以像这样执行您的程序(在 Windows 上将 : 替换为 ; ):
java -cp A.jar:B.jar main.class.Name args
main.class.Name
你的主类名在哪里args
,你的所有命令行参数都在哪里。
你也可以像这样在你的中添加一个Main-Class
andClass-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 文件。