我在我的OSGi项目中使用了Felix Framework,但是我遇到了一个关于第三方依赖的严重问题。
我正在使用eclipse和maven-bundle-plugin从源代码生成我的bundle,从POM.XML文件生成MANIFEST.MF。到现在为止还挺好。但是当我在我的bundle中有一些第三方依赖时,我发现自己正在寻找一个无限的JAR列表,这些JAR通常不是捆绑包,并将它们放在我的/ bundle Felix目录中,直到不再缺少依赖项为止。
我将此过程称为“下载Internet以使我的OSGi应用程序正常工作”。
我做错了什么?当然,我必须做一些非常错误的事情,因为我无法想象任何人有一个依赖于B的捆绑A,然后依赖于C和D,然后这两个将取决于其他几个等等......去寻找所有这些依赖关系手动使用谷歌或maven中央!那太疯狂了!
自动执行此操作的正确方法是什么?我很想拥有两种解决方案中的一种:
1)能够创建一个包含所有依赖项的大型JAR文件,但只导出我想要的包,而且只导出corse,而不是导入任何包。
2)(我的首选解决方案)有办法将我的所有依赖项放入单独的JAR文件中,我可以将其简单地粘贴到/ bundle目录中。
3)(甚至更优选)有一种方法可以使用第三方JAR而无需将8GB的依赖项下载到我的项目中。
我找到了这样的工具,,但只是针对直接(第一级)依赖,为我提供了传递依赖,以便我手动解决。
这个问题至关重要。缺少这样的工具会妨碍OSGi的使用。我搜索,搜索和搜索,我遇到了所有101个解决方案,如PAX,bndtools和朋友,但似乎他们不解决了这个问题......
请帮帮我。 如果可以的话,请提供一个活生生的例子,世界各地的人都会从这个问题的解决方案中受益。
谢谢!
编辑:我正在附加一个示例项目,我正在尝试使用JScience但是生成的JAR包不断向我询问新的Imports,即它不是自包含的。
链接到示例:https://www.dropbox.com/s/svo3nu3vawvv2xn/RequireJscienceExample.zip?dl=0
我通常尝试使用Eclipse将第三方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。之前我拒绝了几个第三方库,这样可以节省开发时间,因为这些OSGi第三方集成困难。
答案 0 :(得分:1)
为什么不让Maven解决传递依赖并为您下载。
将它们添加到pom.xml后,像Eclipse(实际上是m2e插件)这样的IDE已经可以解析,下载并显示结果罐子了。 (您也可以从命令行使用mvn dependency:tree
)
然后审核,并exclude
不需要的,例如可选或已经由其他包导出的包。
是的,使用provided
范围,例如org.osgi.*
<Embed-Dependency>*;scope=compile|runtime;inline=true</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>