我正在尝试访问打包为库的类文件,但不幸的是,jar库应该打包在另一个jar文件中。
作为一个例子,我说a.jar包含一些类库。我可以从外部java应用程序调用(导入)jar文件中的类。现在我需要把这个a.jar放在另一个jar说b.jar中,并且需要从b.jar外部访问(导入)a.jar中的类。
答案 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-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路径看起来像“{{1} }”。然后你不会得到充满许多小JAR文件的主程序目录。