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

问题描述 投票:0回答:1

[感觉好像我掌握了OSGi的使用方式后,我尝试着向我的应用程序中添加第3方依赖性,特别是log4j2,该应用程序使用apache felix并与maven-bundle-plugin捆绑在一起。不幸的是,似乎我陷入了依赖地狱。

我已经尝试使用许多Maven捆绑策略,例如Import-Package,Embed-Dependency,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时,我在运行时收到此错误(当插件尝试启动时):

Caused By: org.osgi.framework.BundleException: Unresolved constraint in bundle thisModule [2]: Unable to resolve 2.0: missing requirement [2.0] package; (package=com.conversantmedia.util.concurrent)

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

我在这里做错了什么?

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


以下是我对上述POM及其产生的输出进行的其他修改示例:

  • log4j-api中同时删除log4j-coreEmbed-Dependency,并添加<wrapImportPackage>;</wrapImportPackage>标签。这样做会导致此输出,这是非常常见的,每次我尝试导入时都会发生:

Caused By: org.osgi.framework.BundleException: Unresolved constraint in bundle thisModule [2]: Unable to resolve 2.0: missing requirement [2.0] package; (&(package=org.apache.logging.log4j)(version>=2.12.0)(!(version>=3.0.0)))

  • Embed-Dependency添加*以及向<Embed-Transitive>true</Embed-Transitive>添加:

Caused By: org.osgi.framework.BundleException: Unresolved constraint in bundle thisModule [2]: Unable to resolve 2.0: missing requirement [2.0] package; (package=android.dalvik)

osgi log4j2 osgi-bundle maven-bundle-plugin
1个回答
0
投票
嵌入日志库是个坏主意。毕竟,您想在一个中央位置配置日志记录,这在每个捆绑软件嵌入日志记录框架时非常困难。

在大多数情况下,安全的押注是简单地将maven-bundle-plugin配置保持为空,然后让它执行其操作。

我个人始终使用slf4j登录OSGi。您只需依赖slf4j-api。 maven-bundle-plugin自动创建导入包语句。

© www.soinside.com 2019 - 2024. All rights reserved.