我正在为我的 OSGi 项目使用 Felix 框架,但我遇到了一个关于第三方依赖项的严重问题。
我正在使用 eclipse 和 maven-bundle-plugin 从源代码和 POM.XML 文件中的 MANIFEST.MF 生成我的包。到目前为止,一切都很好。但是,当我的包中有一些第三方依赖项时,我发现自己正在寻找一个无限的 JAR 列表,这些 JAR 通常不是包,并将它们放在我的 /bundle Felix 目录中,直到不再缺少依赖项。
我将此过程称为“下载 Internet 以使我的 OSGi 应用程序正常工作”。
我究竟做错了什么?当然我一定做错了什么,因为我无法想象任何人拥有一个依赖于 B 的捆绑 A,然后依赖于 C 和 D,然后这两个将依赖于其他几个等等......去寻找所有这些依赖项都使用 google 或 maven Central 手动完成!这太疯狂了!
自动化的正确方法是什么?我很想拥有以下两种解决方案之一:
1) 能够创建一个嵌入了所有依赖项的大型 JAR 文件,但只导出我想要的包,而且,更确切地说,不导入任何包。
2)(我的首选解决方案)有一种方法可以将我的所有依赖项放入单独的 JAR 文件中,我可以简单地将其粘贴到 /bundle 目录中。
3)(甚至更受欢迎)有一种方法可以使用第三方 JAR,而无需将 8GB 的依赖项下载到我的项目中。
我找到了可以做到这一点的工具,但仅适用于直接(一级)依赖项,而传递依赖项则由我手动解决。
这个问题很关键。缺乏这样的工具阻碍了 OSGi 的使用。搜了搜搜了搜,PAX、bndtools、朋友之类的101个解决方案都遇到过,但是好像都没有解决这个问题……</p>
请帮我。如果可以的话,请提供一个活生生的例子,世界各地像我这样的人将从这个问题的解决方案中受益。
谢谢!
-
-
编辑:我附上了一个示例项目,我在其中尝试使用 JScience,但生成的 JAR 包一直要求我提供新的 Imports,即它不是独立的。
示例链接:https ://www.dropbox.com/s/svo3nu3vawvv2xn/RequireJscienceExample.zip?dl=0
我通常尝试使用 Eclipse 将 3rd 方 JAR 转换为包,但他们总是必须导入我没有的包,所以正如你所说,这是一个无穷无尽的情况。
我找不到任何关于 maven-bundle-plugin 的标签 Conditional_Package 的文档。然而,相关搜索向我展示了我之前尝试过但没有成功的内联选项。
我创建了一个基本项目,其中我有一个使用 JScience 库的类,在它的 POM.XML 中我有以下内容:
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.3.7</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId};singleton:=true
</Bundle-SymbolicName>
<Bundle-Version>${project.version}</Bundle-Version>
<Export-Package>shared.properties.api, shared.properties.base
</Export-Package>
<Embed-Dependency>!org.osgi.*;scope=compile|runtime;inline=true</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>
</instructions>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
</plugin>
</plugins>
我是说 maven 内联所有不是来自 osgi 框架本身的包。看看生成的 JAR,它看起来相当不错,我现在只嵌入了包而不是整个 JAR(但是在我看来,我不需要所有这些内联包,因为我只使用了其中两个)。此外,如果我打开 MANIFEST.MF 文件,我可以看到这个有问题的行:
Manifest-Version: 1.0
Bnd-LastModified: 1414164534170
Build-Jdk: 1.6.0_65
Built-By: Pedro
Bundle-ManifestVersion: 2
Bundle-Name: RequireJscienceExample
Bundle-SymbolicName: RequireJscienceExample;singleton:=true
Bundle-Version: 0.0.1.SNAPSHOT
Created-By: Apache Maven Bundle Plugin
Embed-Dependency: !org.osgi.*;scope=compile|runtime;inline=true
Embed-Transitive: true
Import-Package: org.joda.convert,org.xml.sax <------ Problem...
Tool: Bnd-1.50.0
说我缺少 org.joda.convert 和 org.xml.sax。
令我惊讶的是,我们正在谈论一个声明与 OSGi 兼容的库(JScience):http: //jscience.org/
我错过了什么?我真的不能不使用 JScience。而且我之前拒绝了几个 3rd 方库,因为这些 OSGi 3rd 方集成困难,这可以节省我的开发时间。