OSGi和传递依赖

15

我正在为我的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 第三方集成问题而放弃了它们。


1
嘿!这已经一年了,甚至没有尝试回答!@PedroD 你最终做了什么? - tishma
1个回答

1

为什么不让Maven解决传递依赖并为您下载它们。

一旦您将它们添加到pom.xml中,像Eclipse这样的IDE(实际上是m2e插件)就可以解析、下载并显示结果JAR文件。(您也可以从命令行使用mvn dependency:tree
然后进行审核,并排除不需要的内容,例如可选内容或已由其他包导出的包。
是的,对于org.osgi.*等,使用provided范围。

<Embed-Dependency>*;scope=compile|runtime;inline=true</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>

1
问题在于Maven只能在依赖深度方面做到一定程度。大多数依赖项都不是捆绑包,并且没有清单告诉它们依赖于谁。此外,几个捆绑包只是巨大库的单体,您只需要使用其中一个或两个类,但最终您会解决根本不需要的类的传递依赖关系(或者您打开该捆绑包并取出所需的类)。例如,尝试使用Quartz(http://www.quartz-scheduler.org/downloads/)创建OSGi项目,而无需处理传递依赖项。 - PedroD
对于Quartz来说,<Embed-Transitive>false</Embed-Transitive>是否足够? - Paul Verest
1
对我来说,那并不是很远的事。 - PedroD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接