在感觉自己已经掌握了如何使用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-api
和log4j-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)
嵌入日志记录库是一个坏主意。毕竟,您希望在一个中心位置配置日志记录,当每个捆绑包嵌入日志记录框架时,这是非常困难的。
在大多数情况下,安全的做法是简单地将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