gpt4 book ai didi

apache-felix - OSGi 和传递依赖

转载 作者:行者123 更新时间:2023-12-03 01:25:35 49 4
gpt4 key购买 nike

我正在为我的 OSGi 项目使用 Felix Framework,但我遇到了有关第三方依赖项的严重问题。

我正在使用 eclipse 和 maven-bundle-plugin 从源生成我的包,并从 POM.XML 文件生成 MANIFEST.MF。到目前为止,一切都很好。然而,当我的 bundle 中有一些第三方依赖项时,我发现自己正在寻找无限的 JAR 列表(通常不是 bundle ),并将它们放入我的/bundle Felix 目录中,直到不再缺少任何依赖项。

我将此过程称为“下载 Internet 以使我的 OSGi 应用程序正常工作”。

我做错了什么?当然,我一定做错了一些事情,因为我无法想象任何人有一个依赖于 B 的 bundle A,然后依赖于 C 和 D,然后这两个将依赖于其他几个等等......去寻找所有这些依赖项手动使用 google 或 Maven Central!这太疯狂了!

自动化此操作的正确方法是什么?我希望有两种解决方案之一:

1) 能够创建一个包含所有嵌入依赖项的大型 JAR 文件,但仅导出我想要的包,并且,当然,不导入任何包。

2)(我的首选解决方案)有一​​种方法可以将所有依赖项放入单独的 JAR 文件中,我可以将其简单地粘贴到/bundle 目录中。

3)(更优选)有一种方法可以使用第三方 JAR,而无需将 8GB 依赖项下载到我的项目中。

我找到了可以做到这一点的工具,但仅适用于直接(一级)依赖项,将传递依赖项留给我手动解决。

这个问题很严重。缺乏这样的工具阻碍了 OSGi 的使用。我已经搜索,搜索和搜索了,我遇到了所有101个解决方案,例如PAX,BNDTOOLS和 friend ,但似乎他们 解决了这个问题……

请帮助我。 如果可以的话,请提供一个活生生的例子,世界各地像我这样的人都将从这个问题的解决方案中受益。

谢谢!

-

-

编辑:我附加了一个示例项目,我在其中尝试使用 JScience,但生成的 JAR 包不断要求我进行新的导入,即它不是独立的。

示例链接:https://www.dropbox.com/s/svo3nu3vawvv2xn/RequireJscienceExample.zip?dl=0

我通常尝试使用 Eclipse 将第 3 方 JAR 转换为 bundle ,但它们总是必须导入我没有的包,因此正如您所说,这是一个无休止的情况。

我找不到任何有关 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。而且我之前拒绝过几个第 3 方库,这会节省我的开发时间,因为这些 OSGi 3 方集成困难。

最佳答案

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

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

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

关于apache-felix - OSGi 和传递依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26549625/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com