我有一个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)
答案 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无关,因此您可以查看它而不是手动编写捆绑包清单。