OSGi和传递依赖

时间:2014-10-24 14:09:56

标签: apache-felix apache-karaf maven-bundle-plugin bndtools pax-runner

我在我的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第三方集成困难。

1 个答案:

答案 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>