14

我正在为我的 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 方集成困难,这可以节省我的开发时间。

4

1 回答 1

1

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

一旦将它们添加到 pom.xml 中,像 Eclipse(实际上是 m2e 插件)这样的 IDE 就已经可以解析、下载和显示生成的 jar。(您也可以mvn dependency:tree从命令行使用)
然后查看exclude不需要的,例如可选的或已由其他捆绑包导出的包。
是的,使用provided范围,例如org.osgi.*

<Embed-Dependency>*;scope=compile|runtime;inline=true</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>
于 2016-04-21T13:42:23.263 回答