【问题标题】:Where are the custom class loader generated by Eclipse when using a jar inside a jar?在jar 中使用jar 时,Eclipse 生成的自定义类加载器在哪里?
【发布时间】:2019-12-30 17:21:57
【问题描述】:

使用 Eclpise(和其他工具),可以在另一个 jar 中包含一个依赖 jar(参见 this answer)。当 Eclipse 这样做时,它会生成一个自定义类加载器,因为“经典”类加载器无法在另一个 jar 中的 jar 中找到一个类。

要创建我的 jar (package.final.jar),我:
- 导入 jar 以将 (dep.jar) 包含在我项目的 libs/ 文件夹中;
- 在 MANIFEST.MF -> 运行时 -> 类路径中添加了 dep.jar(因此它在我的清单中添加了 Bundle-ClassPath: libs/dep.jar,. 行);
- 将我的项目导出为可部署的插件和片段

package.final.jar 只包含这个结构:

-META-INF/MANIFEST.MF
-package/-class1.class
         -class2.class
         .
         .
         .
-libs/dep.jar

所以我想知道,Eclipse 创建的自定义类加载器在哪里?

【问题讨论】:

  • '可部署插件和片段'用于 Eclipse 插件(或片段)。这些与普通的罐子非常不同。 Eclipse / OSGi 插件类加载器处理这些。
  • @greg-449 好的,但是到底有什么不同呢?我可以看到清单是不同的,但是罐子里还有其他区别吗?
  • MANIFEST.MF 的区别是关键。 Bundle-Classpath 告诉 Eclipse / OSGi 插件系统如何处理包含的 jar - 没有其他东西可以理解清单中的这个条目。它仅在作为 Eclipse 插件(或另一个 OSGi 容器)安装时才有效。
  • @greg-449,好的,就这么简单!所以如果我手动创建一个jar(使用命令行),并用Bundle-Classpath放一个MANIFEST.MF,插件系统也会知道如何处理包含的jar?
  • 只要 MANIFEST.MF 正确,您可以随意构建它。如今,大多数 Eclipse 插件都是使用 maven + tycho 构建的。以后如果您询问 Eclipse 插件,请说出来并使用eclipse-plugin 标签。

标签: java eclipse jar eclipse-plugin


【解决方案1】:

您的 jar 中应该有以下文件夹: org/eclipse/jdt/internal/jarinjarloader

包含类加载器等:

  • JIJConstants.class
  • JarRsrcLoader$ManifestInfo.class
  • JarRsrcLoader.class
  • RsrcURLConnection.class
  • RsrcURLStreamHandler.class
  • RsrcURLStreamHandlerFactory.class

您也可以查看 META-INF/MANIFEST.MF-File 以查看 Main-Class 设置了什么

【讨论】:

  • 我没有这个文件夹。也许我的问题不够具体。我更新了。
  • 我的解决方案只有在您将其导出为“可运行的 Jar 文件”时才“有效”。当您的 main-class-Manifest-Entry 中没有特定项目时,我建议您运行 jar 文件的平台包含 ClassLoader。
【解决方案2】:

对于 Eclipse 插件,插件的 MANIFEST.MF 中的 Bundle-ClassPath 条目告诉 Eclipse / OSGi 系统主插件 jar 中的哪些类和 jar 是类路径的一部分。

插件 jar 中没有添加额外的代码,Eclipse 类加载器会处理包含的 jar。

因此,只要 MANIFEST.MF 正确,您就可以随意构建 jar。现在使用 maven + Eclipse tycho 很常见。

【讨论】:

    猜你喜欢
    • 2017-03-07
    • 2015-09-07
    • 1970-01-01
    • 2016-08-26
    • 2017-05-11
    • 2017-09-02
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多