我正在为我的OSGi项目使用Felix Framework,但是我遇到了一个严重的问题,涉及第三方依赖。
我使用eclipse和maven-bundle-plugin从源代码和POM.XML文件中生成我的bundles的MANIFEST.MF。到目前为止一切都很好。然而,当我的bundle中有一些第三方依赖时,我发现自己在寻找一个无限的JAR列表,这些JAR通常不是bundles,并将它们放在我的/bundle Felix目录中,直到没有更多的依赖项缺失。
我称这个过程为“为我的OSGi应用程序下载互联网以使其工作”。
我做错了什么?我肯定做错了一些事情,因为我无法想象有人会有一个依赖于B的bundle A,然后依次依赖于C和D,然后那些依赖于其他几个依赖项等等......需要手动使用google或maven central查找所有这些依赖关系!那太疯狂了!
正确的自动化方式是什么?我希望有以下两种解决方案之一:
1)能够创建一个包含所有其依赖项的大型JAR文件,但仅导出我想要的软件包,并且当然不导入任何软件包。
2)(我更喜欢的解决方案)有一种方法可以将所有依赖项放入单独的JAR文件中,我只需将其粘贴到/bundle目录中即可。
3)(更喜欢)有一种使用第三方JAR而不必将8GB的依赖项下载到我的项目中的方法。
我找到了一些工具可以为我执行此操作,但仅用于直接(1级)依赖项,留下传递性依赖项需要我手动解决。
这个问题是关键性的。缺乏这样的工具会妨碍OSGi的使用。我搜索了又搜索,遇到了所有101种解决方案,例如PAX、bndtools和朋友们,但似乎它们都没有解决这个问题......
请帮帮我。如果可以,请提供一个现成的例子,全世界像我这样的人将从解决这个问题中受益。
谢谢!
-
-
编辑:我附上了一个示例项目,其中我尝试使用JScience,但生成的JAR bundle仍在要求我新导入包,即它不是自包含的。
示例链接:https://www.dropbox.com/s/svo3nu3vawvv2xn/RequireJscienceExample.zip?dl=0
我通常尝试使用Eclipse将第三方JAR转换为bundles,但它们总是需要导入我没有的包,所以正如你所说的,这是一个无休止的情况。
我找不到关于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。以前我拒绝了几个第三方库,虽然它们可以节省我的开发时间,但因为这些 OSGi 第三方集成问题而放弃了它们。