当前位置: 首页 > 知识库问答 >
问题:

在Maven OSGi捆绑包中使用第三方依赖

万铭
2023-03-14

在感觉自己已经掌握了如何使用OSGi之后,我尝试向我的应用程序添加第三方依赖,特别是log4j2,该应用程序使用ApacheFelix并与maven捆绑插件捆绑。不幸的是,我似乎陷入了依赖地狱。

我尝试过使用许多maven捆绑包策略,如导入包,嵌入依赖,wrapImportPackage,Embed-Transitive,以及设置特定的版本号,仅举几例。以下是我的pom在这个插件中的样子:

<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>

<parent>
    <artifactId>ParentId</artifactId>
    <groupId>ParentGroupId</groupId>
    <version>x.x.x</version>
</parent>

<groupId>ParentGroupId.ParentId</groupId>
<artifactId>thisModule</artifactId>
<packaging>bundle</packaging>

<name>thisModule</name>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
    <dependency>
        <groupId>org.osgi</groupId>
        <artifactId>org.osgi.core</artifactId>
        <version>6.0.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>${project.groupId}</groupId>
        <artifactId>AM</artifactId>
        <version>${project.version}</version>
    </dependency>

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.12.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.12.1</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <version>3.5.1</version>
            <extensions>true</extensions>
            <configuration>
                <instructions>
                    <Bundle-SymbolicName>${project.name}</Bundle-SymbolicName>
                    <Bundle-Activator>moduleActivator</Bundle-Activator>
                    <Embed-Dependency>
                        AM,
                        gson,
                        log4j-api,
                        log4j-core
                    </Embed-Dependency>
                </instructions>
            </configuration>
        </plugin>
    </plugins>
    <finalName>${project.artifactId}</finalName>
</build>

我觉得我取得的最大进步是在上面的pom中,我将log4j api和核心直接嵌入到捆绑包中,但似乎OSGi无法下载和捆绑log4j api和核心所依赖的编译依赖项。它成功地使用maven构建,但当我部署EAR和JAR时,在运行时(当插件试图启动时)会出现以下错误:

起因:org.osgi.framework.BundleException:捆绑中的未解决约束模块[2]:无法解决2.0:缺少需求[2.0]包;(包=com.conversantmedia.util.concurrent)

将命名log4j需要的特定依赖项的错误。我不想做的是在Embed-Dependency标记中包含每个依赖项及其母依赖项。

我在这里做错了什么?

另请注意:由于限制,我在这里唯一的选择是使用apache felix和OSGi。

下面是我对上述POM所做的修改及其结果输出的其他示例:

  • Embed-Dependency中删除log4j-apilog4j-core并添加

由:org.osgi.framework引起。BundleException:bundle thisModule[2]中未解析的约束:无法解析2.0:缺少需求[2.0]包;(

    < li >将*添加到< code>Embed-Dependency以及添加< code >

< code >原因:org . OSGi . framework . bundle异常:bundle thisModule [2]中未解析的约束:无法解析2.0:缺少requirement [2.0]包;(package=android.dalvik)

共有1个答案

安浩瀚
2023-03-14

嵌入日志记录库是一个坏主意。毕竟,您希望在一个中心位置配置日志记录,当每个捆绑包嵌入日志记录框架时,这是非常困难的。

在大多数情况下,安全的做法是简单地将maven-bundle-plugin配置保持为空,让它完成自己的工作。

我个人在OSGi总是用slf4j来记录日志。您只需依赖slf4j-api。maven-bundle-plugin自动创建导入包语句。

然后在运行时,您只需部署一个支持所需日志api的日志框架。

对于apache karaf,默认情况下已经是这种情况。如果您使用bndtools或基于普通felix的您自己的应用程序汇编,请查看我的osgi最佳实践示例。它展示了如何在您自己的捆绑包中使用slf4j-api,以及如何在基于karaf和bndtools的应用程序中配置日志系统。

 类似资料:
  • 我们将这个库用于另一个项目,我们现在也在Xamarin中开发。目前,我们需要添加这两个库(用于ExoPlayer的my.aar和.jar)。老实说,这有点烦人,我很想把我的。Aar放进去,然后走。 所以两个问题: 有没有一种方法可以使用gradle和其他东西将ExoPlayer捆绑到我的。aar中?(我是个初学者,请仔细) 我意识到这可能不是最好的做法(依赖应该由应用程序管理,诸如此类),但实际上

  • 我是OSGi的新手。我正在使用Apache Felix。我已经构建了一个捆绑包,并且具有依赖性。当我尝试使用启动它会给我这个错误。 org . OSGi . framework . bundle exception:无法解析lk . ucsc . research . belly runner[20](R 20.0):缺失需求[lk . ucsc . research . belly runner

  • 问题内容: 我才刚刚开始OSGI开发,并且正在努力了解如何最好地处理依赖的JAR。 即,如果我要创建捆绑包,则很有可能需要使用一些第三方JAR。当我创建要部署到OSGI的捆绑软件JAR时,显然不包括这些第三方JAR,因此捆绑软件将无法运行。 我知道一种选择是将这些JAR打包成束,然后将它们部署到OSGI容器中。但是,如果只需要一个捆绑包使用它们,这似乎并不理想。 最好的解决方案是什么?可以将JAR

  • 于是我就开始了实现这些依赖的“兔子洞”。基于maven页面,我将features.xml文件放在一起: 现在,当我尝试安装它时,我得到: 我觉得这可能和equinox vs Felix有关?我只是使用默认的Karaf设置,并使用内置的Netbeans Maven项目创建包,对于OSGI世界来说,我还是比较新的。在大多数情况下,我可以启动和运行bundle,并为一个应用程序建立了一个基本的集合,但这

  • 我正在将我的spring-java项目转移到OSGi。 我有一些依赖项,这些依赖项在spring ebr repo或maven repo中不能作为包提供。处理它们的最佳方法是什么? null

  • null lib-ThirdPartyProject1.jar-ThirdPartyProject2.jar-ThirdPartyProject3.jar wrapperproject.jar-project1.jar-project2.jar-project3.jar