java - 将非 osgi jar 添加到 RCP4 项目

标签 java eclipse osgi rcp

我有以下情况。我依赖于一个名为 foo.jar 的第三方 jar。该 jar 有许多非 osgi 依赖项。我创建了一个新项目“来自现有 JAR 文件的插件”,选择了所有 foo.jars 非 osgi 依赖项,并将其导出为名为 foo.libs.jar 的“可部署插件和片段”。

我的 RCP4 项目是一个基于功能的产品。在我的主 RCP 项目中,我转到目标文件,导航到“内容”选项卡并选中 foo.jar 和 foo.libs.jar。然后,我转到项目文件并选择“验证”并收到消息“未检测到问题”。

知道我做错了什么或者需要做什么才能让它发挥作用吗?我是否必须显式地将 foo.libs.jar 设置为 foo.jar 的依赖项?我尝试在我的主项目 list ->依赖项选项卡和运行配置 ->插件中执行此操作,并将 foo.libs.jar 添加到 feature.xmls ->包含的插件选项卡中,但似乎没有去工作。

谢谢!

===更新===

我认为我的问题可能属于捆绑片段和嵌入式依赖项的情况。举个例子:

- 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 的问题...

我的 bundle 有

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

最佳答案

该问题缺乏细节,但“未找到类”的问题对于 OSGI 来说非常典型。

检查两个包的 MANIFEST.MF。 foo.libs.jar 必须在“Export-Package”指令中为“丢失”的类声明一个包,而 foo.jar 必须在“Import-Package”中具有相同的包。由于您设法达到了出现异常的程度,因此似乎您在 foo.jar 的“Import-Package”中缺少 some.class.in.a.jar.in.foo.libs.jar 的包声明。

主要规则如下:包只能访问其自身内部的类以及通过 list 导入的类。有一些异常(exception),例如捆绑片段和嵌入式依赖项,但我相信我们可以在这种情况下忽略它们。

通常,当您在 bundle list 中正确设置“Import-”和“Export-Package”指令时,问题就可以解决。如果您需要更详细的帮助,请提供有关如何制作 foo.jar 和 foo.lib.jar 的更多详细信息(通过手工、通过 maven 插件、通过 gradle、您使用哪些设置等)

关于java - 将非 osgi jar 添加到 RCP4 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43007518/

相关文章:

java - 模块化/可插入的 Java Web 应用程序

java - 如何使用 Spring boot 将缓冲读取器注入(inject)到以文件读取器作为参数的类中?

java - 将不同的源目录映射到不同的测试子目录

java - 如何停止多线程聊天客户端

eclipse - 使用 Eclipse 的 Postgres 的基本独立 JPA 示例

java - Android:如何更改操作栏背景颜色?

java - 使用 Maven 构建 OSGI 声明式服务

event-handling - 何时使用 OSGi EventAdmin,何时不使用?

java - 为什么 SOPLN 中的输出转换为浮点型?

java - java的BSON库?