首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >管理OSGi依赖项

管理OSGi依赖项
EN

Stack Overflow用户
提问于 2018-05-24 00:20:25
回答 2查看 0关注 0票数 0

我有一个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:缺少需求”的错误消息。八点零它会在网上搜索这个软件包,下载并实时安装。生活会轻松得多。

EN

回答 2

Stack Overflow用户

发布于 2018-05-24 08:49:22

使用来自maven-bundle-plugin的条件包递归地内联JAR包中所有必需的包,并激活标记true。

票数 0
EN

Stack Overflow用户

发布于 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存储库文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100004539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档