【问题标题】:Can I call class files that are within a jar library located in another jar file?我可以调用位于另一个 jar 文件中的 jar 库中的类文件吗?
【发布时间】:2010-11-18 12:33:35
【问题描述】:

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

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

This is not the thing I want to do :)

【问题讨论】:

  • 您的意思是您的jar 包含其他jar 吗?或者你想在你的 jar 中包含依赖的 jar?究竟是什么问题?

标签: java jar manifest packaging manifest.mf


【解决方案1】:

您必须编写一个能够处理“jars within jars”的类加载器。对我来说,这听起来是个很糟糕的主意。

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

【讨论】:

    【解决方案2】:

    也许我没有正确理解,但我相信您想要的是使用您的类路径上的其他 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 文件中是很巧妙的。问题是一些应用程序最终会产生相当多的依赖项,每次我对 my 代码进行更改时,这也意味着我必须分发所有依赖项代码,即使在依赖关系发生了变化。这意味着分发巨大的 JAR 文件,即使可能只有很小的更改。

    通过使用Class-Path 清单属性,我可以分发应用程序,这些应用程序的执行方式与单个 JAR 文件完全相同(双击某些系统,或简单的“java -jar”咒语)但保存无需将所有重复的库与后续软件版本一起传输,从而节省大量时间和带宽。

    也可以将任何依赖的 JAR 放到它们自己的目录中(我们暂时称它为 lib)并修改 Class-Path 使所有 JAR 路径看起来像“lib/B.jar”。这样你的主程序目录就不会充满许多微小的 JAR 文件。

    【讨论】:

    • 问题是OP有一个jar文件inside另一个jar文件。
    • 我想通过重新阅读问题的标题会变得更清楚,但绝对不是从问题文本本身
    猜你喜欢
    • 2011-07-02
    • 2018-08-08
    • 1970-01-01
    • 2012-10-07
    • 2013-08-13
    • 1970-01-01
    • 2010-10-06
    • 2011-04-30
    • 1970-01-01
    相关资源
    最近更新 更多