我正在尝试将我的项目转换为OSGI应用程序。我毫不怀疑。假设我的应用程序中的ModuleA依赖于外部jars jarA和jarB。现在要运行ModeuleA,我将使用maven-bundle-plugin的embed-dependency属性嵌入两个jar。 现在假设我还有另一个模块ModuleB,它也依赖于jarA。因此,此模块还嵌入了jarA。我的项目最终将jarA嵌入了2次,这将不必要地膨胀项目的大小。
有没有办法告诉OSGI只加载jarA一次并将其提供给两个模块。
如果将这些罐子转换为OSGI包是唯一的解决方案,那么我还有其他问题:
将jar转换为包的最简单方法是什么。 BND工具看起来是一个不错的解决方案,但我找不到有关它的适当文档。
jarA也将有一些依赖的jar。因此,我是否还需要将所有依赖的jar都转换为bundle。我的项目有100多个罐子。如何使该过程自动化。
预先感谢:)
答案 0 :(得分:0)
实际上有解决方案,两者都与您当前正在做的事情有些不同:
选项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>
这样做:
maven-bundle-plugin
嵌入此依赖项(可传递)maven-bundle-plugin
导出所有依赖项包我将一些必须设置的空白留为library.groupId
,library.artifactId
和library.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