带有嵌套 jar 的 RCP ClassNotFoundException

RCP ClassNotFoundException with nested jars

我有一个具有以下设置的 RCP 应用程序:

my.plugin.jar
|-->META-INF
|-----MANIFEST.MF
|-->A1.jar
|-->A2.jar
|-->A_Dependencies.jar (Jar of jars)
|----->X1.jar,X2.jar,...Xn.jar

当我 运行 它时,我得到与嵌套 jar 相关的 ClassNotFoundExceptions(X1.jar、X2.jar 等...)

我的清单包含(除其他外)以下条目:

my.plugin.jar
   Bundle-ClassPath: .,A1.jar,A2.jar,A_Dependencies.jar

A1.jar
   Bundle-ClassPath: .,A_Dependencies.jar

A2.jar
   Bundle-ClassPath: .,A1.jar

A_Dependencies.jar
    Bundle-ClassPath: X1.jar, X2.jar,...Xn.jar
    Export-Package: (All the appropriate packages)

如何正确设置清单来解决这些问题?示例错误如下所示:

Caused by: java.lang.ClassNotFoundException: some.package.some.classfile cannot be found by my.plugin
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:439)

嵌套在另一个包中的 OSGi 包被视为普通的 jar 文件。它们的清单将不会被拾取,因此 Bundle-ClassPath 将不起作用。如果你想将所有的 jar 部署在一个 bundle 中(为什么不单独部署所有的 bundle?),你需要展平结构,这样你所有的依赖 jar 都直接在你的 bundle 下,并添加到你的清单的 Bundle-ClassPath 中:

my.plugin.jar
   Bundle-ClassPath: .,A1.jar,A2.jar,X1.jar,...,Xn.jar

从错误消息来看,您似乎是运行 Equinox。我更熟悉 Felix 和 maven-bundle-plugin, which can be configured to embed dependencies 并将它们添加到类路径中。插件创建的包不绑定到 Felix,所以你可以看一下而不是手动编写包清单。