【问题标题】:Adding nested jars into the classpath将嵌套 jars 添加到类路径中
【发布时间】:2015-06-18 18:58:50
【问题描述】:

Java documentation 包含一个关于将嵌套 jars 添加到类路径中的注释。

要将 JAR 文件中的 JAR 文件中的类加载到类路径中, 您必须编写自定义代码来加载这些类。

有很多工具可以做到这一点,例如列出的herehere

  1. 这些工具是否可以简单地通过从嵌套 jar 中提取类并将提取路径添加到类路径中来工作?或者它不仅仅是解压缩档案?
  2. manifest.mf 类路径可以指向本地文件系统,但不能指向其自己的归档文件,是否存在技术原因?

【问题讨论】:

    标签: java jar classpath executable-jar manifest.mf


    【解决方案1】:

    如果您使用 Maven,另一个选项是 Shade Mojo。它将分解所有 JAR,允许它们的内容与您的代码一起打包。它还具有其他功能,例如将依赖项移动到自定义包中以避免冲突和合并 META-INF 中的文件。

    其中一个主要问题是 JAR 通常会在完全相同的位置公开工件。对于允许通过ServiceLoader 进行扩展的系统(通常是JDK)来说,这可能是个问题。这些文件需要智能合并/连接。

    ClassLoader.getResources(String) 是另一个可能以微妙的、可能导致错误的方式影响的 API。

    如果您使用的是SecrutiyManager,安全域会变得更加复杂。

    tl;dr 这是主要由 ClassLoading API 驱动的限制

    【讨论】:

    • 我不相信潜在的冲突是 manifest.mf 不支持嵌套 jar 的充分理由。无论任何依赖管理策略如何,都会出现冲突。例如,请参阅:stackoverflow.com/questions/30768120/…
    • 嗯,你有语义问题,嵌套 jar 意味着什么?所有嵌套的 jar 都对根类加载器可见吗?每个嵌套的 JAR 都有自己的类加载器吗?嵌套的罐子对它们上面的罐子是私有的吗?你完全有可能实现一个类加载器来完成所有这些,它只是不是标准的一部分。
    • IMO,依赖冲突完全是另一个问题,无论你是否扁平化都存在。如果有的话,如果您扁平化,则更有可能给您带来问题,因为如果两个 jar 定义相同的类,您将获得 CNF 异常。
    猜你喜欢
    • 2013-03-15
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 2016-02-25
    • 2012-03-14
    • 2011-06-15
    • 1970-01-01
    相关资源
    最近更新 更多