我有以下情况。我依赖一个名为foo.jar的第三方jar。那个jar有许多非osgi依赖项。我创建了一个新项目“来自现有JAR档案的插件”,选择了所有foo.jars非osgi依赖项,并将其导出为名为foo.libs.jar的“可部署插件和片段”。
我的RCP4项目是一个基于功能的产品。在我的主RCP项目中,我转到目标文件,导航到Content选项卡并勾选foo.jar和foo.libs.jar。然后我转到我的项目文件并选择“验证”并收到消息“未检测到任何问题”。
任何线索我做错了什么或者需要做些什么才能让它发挥作用?我是否必须将foo.libs.jar显式设置为foo.jar的依赖项?我试图在我的主项目清单 - >依赖选项卡和runConfigurations->插件中执行此操作,并将foo.libs.jar添加到feature.xmls->包含的插件选项卡但它没有似乎工作。
谢谢!
=== UPDATE ===
我认为我的问题可能属于捆绑片段和嵌入式依赖项。举个例子:
- I create foo.libs.jar. One of the jars inside it is activemq.jar
I need access to javax.jms.ExceptionListener
- The manifest for foo.libs.jar contains activemq.jar in the
Bundle-ClassPath, and javax.jms in the Export-Package sections
- foo.jar contains foo.libs.jar in its Class-Path. It contains
javax.jms in its Import-Package and Export-Package sections
- I created a "Plug-in from existing JAR archives" project which has
foo.jar and foo.libs.jar in it.
- The manifest for the project has foo.jar and foo.libs.jar in the
Bundle-Classpath section. The Import-Package section contains
javax.jms
- If I export this bundle to my project, and run validate I get
errors saying javax.jms cannot be found.
- If I omit the javax.jms from the bundles Import-Package there
are no validation errors but I will get a ClassNotFoundException
我觉得这可能是嵌入式jar和Bundle-ClassPaths的问题......
我的包已
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: my.name
Bundle-SymbolicName: my.name
Bundle-Version: 1.0.0
Bundle-ClassPath: foo.jar
Export-Package: list_of_my_packages
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
foo.jar有
Manifest-Version: 1.0
Bnd-LastModified: 1489769501680
Bundle-ManifestVersion: 2
Bundle-Name: foo
Bundle-SymbolicName: foo
Bundle-Version: 1.0.0
Class-Path: foo.libs.jar
Created-By: 1.8.0_71 (Oracle Corporation)
Export-Package: javax.jms (and other stuff, omitted)
Import-Package: javax.jms;resolution:=optional (and other stuff, omitted)
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"
Tool: Bnd-2.4.0.201411031536
foo.libs.jar有
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Foo libs
Bundle-SymbolicName: foo.libs
Bundle-Version: 1.1.0
Bundle-ClassPath: activemq-all.jar, (and others which I ommitted)
Export-Package: javax.jms, (and others which I ommitted)
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
答案 0 :(得分:1)
这个问题缺乏细节,但问题是"没有找到课程"是OSGI的典型代表。
检查两个捆绑包的MANIFEST.MF。 foo.libs.jar必须为你的"丢失"课程'出口 - 包装'指令,而foo.jar必须在' Import-Package'中具有相同的包。由于您在获得异常时设法达到了这一点,因此您似乎缺少some.class.in.a.jar.in.foo.libs.jar的包声明,其中包含了“导入 - 包”。 of foo.jar。
主要规则如下:bundle只能访问自身内的类+通过manifest导入的类。有像bundle片段和嵌入式依赖项这样的例外,但我相信我们可以在这种情况下省略它们。
一般情况下,当您正确设置“导入” - '和' Export-Package'捆绑包清单中的指令。如果您需要更详细的帮助,请提供有关如何制作foo.jar和foo.lib.jar的更多详细信息(通过手工,maven插件,gradle,您使用的设置等)。