我有一个maven项目,它使用在我的POM.XML中配置的非常著名的Felixmaven包插件,方式如下:
<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中也包含了一些一级/级别的依赖关系:
<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安装我将使用非常好的MANIFEST.MF和所有的工具构建我的包,但是我不会得到其他的依赖捆绑包,这意味着如果我抓取包文件并将它放到我的OSGi框架实例中,我将得到以下内容“无法解决1.0:缺少需求1.0(&(osgi.wiring.Package=等.)“
因此,我发现创建第1级依赖项包的一种方法是在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-bundle-from-依赖性包:包我会把捆好的,做得很好,还能工作。但是,真正的交易来了。这些捆绑包本身也有依赖关系,因此它们需要将它们的依赖关系包装成包。
所以我现在唯一的解决办法就是,手动,检查我的第一级依赖项的每个清单,然后搜索包含所需包的JAR,将它们作为maven依赖项添加到我的POM.XML中,然后运行mvn-pcreate-oSGi-bundle-from-依赖性包:包把它们包成捆。
这就是所谓的依赖地狱.。
有什么方法可以自动解决这个问题吗?nthMaven-bundle OSGi项目的级别依赖关系?例如,让maven研究我的第一级依赖项清单文件,读取导入包,查看提供此类包的中央回购版JAR,下载这些包并将它们打包成包吗?
编辑-1:
我想我没有用最恰当的方式来解释我的情况,我觉得很难用纯文本来解释。或者我不明白你的答案。我在OSGi方面很“新鲜”,我唯一的知识来自于书籍(OSGi in Action等)和谷歌(Google)。
假设我的包导入了包A和B,但是包A导入了包C,包B也导入了C。但是现在C是从D,E,F和G包进口的,另一方面,D包进口了一吨其他软件包,E,F和G也是如此。
我的计算机中唯一的捆绑包是我自己的包和提供包A和B的包,因为它们是我的第一级依赖项。但是,我没有任何其他必需的包,即使它们是作为JAR安装在我的JDK安装文件夹中,我也没有将它们作为包,甚至我也不知道在哪里可以将它们包装(实际上我知道,但让我们想象一下我不知道)。
我希望构建工具所做的是运行一个类似于以下内容的算法:
1)转到我的包MANIFEST.MF并阅读Import-Package字段。枚举所有必需的包及其resp..version。
2)在互联网上的某个地方搜索我所需要的库的罐子或包。
3)下载每个文件,并检查它们是否只是普通的JAR,还是有一个有效的OSGi清单文件(即它们是一个包)
3.1)如果他们是一个包裹,将它们复制到我的包/文件夹中。
3.2)其他使用任何工具将JAR包装到一个包中,并将该包复制到我的bundle/文件夹中。
4)现在,对于每个下载/创建的新包,重复步骤1)、2)、3)和4)。
我想要的最终结果是:对于我有直接或间接依赖关系的每个库,一个包,以便我可以在OSGi Framework实例(如Felix或equinox)中动态安装它们。
我不想要的:
1)必须手动完成此操作,因为如果我试图解决每个依赖项的依赖,我可能会花费数小时或几天收集和包装JAR。
2)将所有依赖项嵌入到一个ubber/mega包中。根据我读过的几本书,这是一种糟糕的实践,很难单独维护每一种依赖,而且它破坏了模块性。
注:我的问题不在于将一个JAR打包到一个包中的特殊任务,而是如何递归地对每个包的导入执行它,即使它们需要从诸如Maven的中心这样的在线存储库下载。
有没有办法自动做到这一点,或者我遗漏了一些关于OSGi的很大的东西?这么大以至于我根本不需要做我想要的事?
编辑-2:
有些(如果不是全部)导入包依赖关系可以在运行时解决.假设OSGi框架试图启动一个包,但没有显示“无法解决8.0:缺少需求”的错误消息。八点零它会在网上搜索这个软件包,下载并实时安装。生活会轻松得多。
发布于 2018-05-24 08:49:22
使用来自maven-bundle-plugin的条件包递归地内联JAR包中所有必需的包,并激活标记true。
发布于 2018-05-24 10:02:26
但是,如果找不到任何未转换为良好OSGi包的库,则可以使用PAX-URL中的Wack协议在OSGi框架中安装这些依赖项。要使用这些协议,取决于正在使用的OSGi框架,但在ApacheKaraf中,默认情况下是安装的。例如,要从maven存储库安装一个库:
root@karaf> osgi:install -s 'wrap:mvn:commons-lang/commons-lang/2.4$Bundle-SymbolicName=commons-lang&Bundle-Version=2.4'
此指令将Common-lang库从maven存储库安装到OSGi框架中,并将其包装为包含标题的OSGi包。
对于自动安装依赖关系,如在第二次编辑中所说的,有几种解决方案,但工作量很小。有两种主要的解决方案可以自动将包提供给OSGi Frawor,“Felix OBR存储库”和“Felix Providing”捆绑包和Equinox p2存储库。它们都有自动安装包和特性的控制台命令。问题是,实际上我找不到一个很好的包的公共存储库。需要用所有的包构建自己的存储库,而不是您所需要的。
如果使用maven-bundle-plugin,当将工件安装到本地maven存储库中时,插件将更新位于存储库根目录中的文件“pository.xml”,以反映你的包的需求和功能。此文件是OBR存储库文件。
https://stackoverflow.com/questions/-100004539
复制相似问题