如何在OSGI包中嵌入外部jar依赖项?

时间:2019-06-21 06:30:24

标签: maven osgi apache-felix

我正在尝试将我的项目转换为OSGI应用程序。我毫不怀疑。假设我的应用程序中的ModuleA依赖于外部jars jarA和jarB。现在要运行ModeuleA,我将使用maven-bundle-plugin的embed-dependency属性嵌入两个jar。 现在假设我还有另一个模块ModuleB,它也依赖于jarA。因此,此模块还嵌入了jarA。我的项目最终将jarA嵌入了2次,这将不必要地膨胀项目的大小。

有没有办法告诉OSGI只加载jarA一次并将其提供给两个模块。

如果将这些罐子转换为OSGI包是唯一的解决方案,那么我还有其他问题:

  1. 将jar转换为包的最简单方法是什么。 BND工具看起来是一个不错的解决方案,但我找不到有关它的适当文档。

  2. jarA也将有一些依赖的jar。因此,我是否还需要将所有依赖的jar都转换为bundle。我的项目有100多个罐子。如何使该过程自动化。

预先感谢:)

1 个答案:

答案 0 :(得分:0)

实际上有解决方案,两者都与您当前正在做的事情有些不同:

  1. 构建一个 one “第三方依赖项”捆绑包,该捆绑包将嵌入您的项目具有的所有非OSGi依赖项。
  2. 将每个非OSGi依赖项转换为OSGi捆绑包。

选项1更易于处理,因此我认为大多数项目都可以这样做。我个人更喜欢选项2。我们有一个Maven“ pom.xml”模板,可用来转换这些依赖关系。

“ pom.xml”如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <properties>
        <library.groupId></library.groupId>
        <library.artifactId></library.artifactId>
        <library.version></library.version>
    </properties>

    <artifactId></artifactId>
    <packaging>bundle</packaging>

    <name></name>
    <description>${library.groupId}:${library.artifactId}:${library.version}</description>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Import-Package>*;resolution:=optional</Import-Package>
                        <Export-Package>*</Export-Package>
                        <Embed-Dependency>*;scope=compile|runtime;inline=true</Embed-Dependency>
                        <Embed-Transitive>true</Embed-Transitive>
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>${library.groupId}</groupId>
            <artifactId>${library.artifactId}</artifactId>
            <version>${library.version}</version>
        </dependency>
    </dependencies>

</project>

这样做:

  1. 将非OSGi库添加为依赖项
  2. 告诉maven-bundle-plugin嵌入此依赖项(可传递)
  3. 告诉maven-bundle-plugin导出所有依赖项包

我将一些必须设置的空白留为library.groupIdlibrary.artifactIdlibrary.version。还有一些我们需要调整maven-bundle-plugin的配置。但这是我们的出发点。例如,您不想导出所有软件包等。

如果确实有100多个需要转换的依赖项,则最好使用此模板,然后将所有100个依赖项都添加为依赖项,并在其中将所有这些依赖项构建成一个大捆绑包。

您可以在此处找到maven-bundle-plugin的文档:

https://felix.apache.org/documentation/subprojects/apache-felix-maven-bundle-plugin-bnd.html

在这一点上,我还想提到一个新的捆绑插件,您可能需要考虑使用它:bnd-maven-plugin

请参阅:https://github.com/bndtools/bnd/tree/master/maven/bnd-maven-plugin