gpt4 book ai didi

java - 管理OSGi依赖 hell

转载 作者:太空狗 更新时间:2023-10-29 22:35:20 26 4
gpt4 key购买 nike

UPDATE 2: Since my blog is a bit dead the links got degraded so you can view the articles here:

https://www.dropbox.com/s/xvobgzqnl43kcda/Managing_OSGi_Transitive_Dependencies__Part_1____CitizenRandom.pdf?dl=0

https://www.dropbox.com/s/0bdooux4yhrf8lf/Managing%20OSGi%20Transitive%20Dependencies%20%28...pdf?dl=0

https://www.dropbox.com/s/km3mxqah6oy23iq/Why%20using%20Require-Bundle%20is%20a%20bad%20pract...pdf?dl=0

https://www.dropbox.com/s/mtenchtjopcrmr8/How%20many%20ways%20can%20we%20import%20bundles%20in%20OSGi_%20_%20CitizenRandom.pdf?dl=0

https://www.dropbox.com/s/sldxynx3fl8vn61/Managing%20OSGi%20Transitive%20Dependencies%20%282...pdf?dl=0



我有一个maven项目,使用通过以下方式在POM.XML中配置的非常著名的felix maven软件包插件:
<packaging>bundle</packaging>

(...)

<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId};singleton:=true</Bundle-SymbolicName>
<Bundle-Version>${project.version}</Bundle-Version>
<Export-Package>jlifx.*</Export-Package>
<!-- <Embed-Dependency>*</Embed-Dependency> -->
</instructions>
</configuration>
</plugin>

然后,我的POM中也包含一些1级/级别的依存关系:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>5.0.0.Alpha1</version>
</dependency>
</dependencies>

现在,我的问题开始了...如果我执行 mvn install ,我将使用非常出色的MANIFEST.MF及其它所有工具来构建我的 bundle 包,但是我将不会获得其他依赖项 bundle 包,这意味着如果我捕获我的 bundle 包将文件打包并放到我的OSGi框架实例上,我将得到类似“无法解决1.0:缺少要求[1.0] osgi.wiring.package;(&(osgi.wiring.package =等...“

因此,我发现创建第一级依赖项 bundle 包的一种方法是通过在POM中创建如下配置文件:
<profiles>
<!-- http://www.lucamasini.net/Home/osgi-with-felix/creating-osgi-bundles-of-your-maven-dependencies -->
<!-- -Pcreate-osgi-bundles-from-dependencies bundle:wrap -->
<profile>
<id>create-osgi-bundles-from-dependencies</id>
<build>
<directory>${basedir}/bundles</directory>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.0.1</version>
<extensions>true</extensions>
<executions>
<execution>
<id>wrap-my-dependency</id>
<goals>
<goal>wrap</goal>
</goals>
<configuration>
<wrapImportPackage>;</wrapImportPackage>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>

这样,当我执行 mvn -Pcreate-osgi-bundles-from-dependencies bundle 包:包装时,我将得到 bundle 包,其结构良好且可以正常工作。但是,真正的交易来了。这些 bundle 包还具有独立的依赖关系,因此需要将其依赖关系打包为 bundle 包。根据众多网页,很久以前,我们就有了 mvn org.apache.felix:maven-bundle-plugin:bundleall 目标为我们做到这一点,但是我已经尝试过了,它有故障并且返回异常,并且将其标记为根据Stuart的建议,它将在maven 2.4.1及更高版本中被删除(引用: https://issues.apache.org/jira/browse/FELIX-4145)。

因此,我现在唯一的解决方案是手动 ,检查我的第一级依赖项的每个 list ,并在google中查找包含所需软件包的jar,将它们作为maven依赖项添加到我的POM.XML中,然后运行 mvn -Pcreate- osgi-bundles-from-dependencies bundle 包:包装以将它们包装为 bundle 包。

这就是所谓的依赖 hell ...

有什么方法可以自动化解决Maven-bundle osgi项目的第n级依赖项的任务?即让Maven研究我的第1级依赖项的 list 文件中的每一个,阅读导入包,在中央存储库中查找提供此类包的jar包,下载并打包为 bundle 包?

注意:请提供有关如何实现此目的的详细说明,而不仅仅是链接到此工具或可能解决此问题的工具。这些工具的主要问题是缺少示例和文档。例如 bundleall 已被弃用,但似乎没有工具来替换它,至少在其maven bundle plugin的官方文档中,该工具已被弃用。
我敢肯定,我可能已经使用了能够执行此操作的工具,但是缺少文档使新手用户无法了解...

谢谢!





编辑-1:

到目前为止,感谢您的答复:)
我想我没有以最适当的方式解释我的情况,仅凭纯文本我就感到有些困难。也许我不明白你的答案。我在OSGi方面是“新手”,而我唯一的知识来自书籍(《 OSGi in Action》等)和Google。

想象一下,我的 bundle 包进口了包裹A和B。但是包裹A进口了包裹C,包裹B也进口了C。但是现在C进口了包装D,E,F和G。另一方面,包装D进口了许多其他包装,E,F和G也是如此。

我计算机中仅有的 bundle 包是我自己的 bundle 包,并且提供 bundle 包A和B的 bundle 包是因为它们是我的第一级依赖关系。但是,我没有任何其他必需的 bundle 包,即使它们以jar的形式安装在我的JDK安装文件夹中,也没有 bundle 的形式,甚至我也不知道在哪里可以得到jar来包装它们(实际上我知道,但可以想象我不知道)。

我期望构建工具要做的是运行类似于以下内容的算法:

1)转到我的软件包MANIFEST.MF并阅读Import-Package字段。枚举所有必需的软件包及其响应。版本。

2)在Internet上的某个地方搜索我所需的库的jar或 bundle 包。

3)下载每个文件,并检查它们是否只是普通的jar或具有有效的osgi list 文件(即它们是 bundle 包)

3.1) (如果它们是 bundle 软件),请将其复制到我的bundles/文件夹中。

3.2) 否则使用任何工具将 jar 包装成束,然后将束复制到我的束/文件夹中。

4)现在,对于下载/创建的每个新 bundle 包,重复步骤1),2),3)和4)。

我想要的最终结果是:每个与我有直接或间接依赖关系的库的 bundle 软件,以便我可以在我的OSGi Framework实例中即时安装它们,例如felix或equinox。

我不想要的:

1)必须手动执行此操作,因为如果我尝试解决每种依赖关系,我可能会花费数小时或数天来收集和包装jar。

2)将所有依赖项嵌入到ubber/mega bundle 包中。根据我读过的几本书来看,这是一种不好的做法,很难单独维护每个依赖关系,而且还会破坏模块化。

注:我的问题不是关于将 jar 包装成 bundle 的特定任务,而是关于对每个 bundle 的导入进行递归处理,即使需要从诸如maven中心的在线存储库中下载它们。

有没有一种方法可以自动执行此操作,或者我缺少有关OSGi的重要信息?这么大,以至于我永远都不需要做我所要求的?

编辑2:

一些(如果不是全部)Import-Package依赖关系可以在运行时解决。想象一下OSGi框架试图启动一个 bundle 包,而不是显示错误消息“无法解析8.0:缺少要求[8.0] osgi.wiring.package;”。它将在线搜索该软件包,下载并即时安装。生活会容易得多。

最佳答案

使用maven-bundle-plugin中的Conditional-Package递归地内联JAR包中的所有必需包并激活标记true。

关于java - 管理OSGi依赖 hell ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23737169/

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