带嵌套jar的RCP ClassNotFoundException

时间:2017-11-02 19:07:48

标签: java osgi rcp

我有一个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)

1 个答案:

答案 0 :(得分:3)

嵌套在另一个bundle中的OSGi bundle只被认为是普通的jar文件。它们的清单不会被拾取,因此Bundle-ClassPath将无法工作。如果要在一个bundle中部署所有jar(为什么不单独部署所有bundle?),你需要展平结构,以便所有依赖jar都直接在你的bundle下,并添加到你的manifest的Bundle-ClassPath中: / p>

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

从错误消息中,您似乎正在运行Equinox。我更熟悉Felix和maven-bundle-plugin,它可以配置为embed dependencies并将它们添加到类路径中。插件创建的捆绑包与Felix无关,因此您可以查看它而不是手动编写捆绑包清单。