在 jar 中使用 jar 时,Eclipse 生成的自定义 class 加载程序在哪里?

Where are the custom class loader generated by Eclipse when using a jar inside a jar?

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

为了创建我的 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 创建的自定义 class 加载程序在哪里?

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

包含Classloader等:

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

如果您查看 META-INF/MANIFEST.MF 文件以查看 Main-Class 设置的内容,您也可以检查它

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

插件 jar 中没有添加额外的代码,Eclipse class 加载程序处理包含的 jar。

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