【问题标题】:RCP ClassNotFoundException with nested jars带有嵌套 jar 的 RCP ClassNotFoundException
【发布时间】:2018-04-15 10:13:13
【问题描述】:

我有一个具有以下设置的 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(X1.jar、X2.jar 等)相关的 ClassNotFoundExceptions

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

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)

【问题讨论】:

    标签: java osgi rcp


    【解决方案1】:

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

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

    从错误消息看来,您正在运行 Equinox。我比较熟悉Felix,还有maven-bundle-plugin,可以配置成embed dependencies,添加到classpath。插件创建的包不绑定到 Felix,因此您可以查看它而不是手动编写包清单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2011-12-12
      • 2016-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多