[感觉好像我掌握了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-core
和Embed-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)
在大多数情况下,安全的押注是简单地将maven-bundle-plugin配置保持为空,然后让它执行其操作。
我个人始终使用slf4j登录OSGi。您只需依赖slf4j-api。 maven-bundle-plugin自动创建导入包语句。