作为一项临时措施,以便能够迅速地过渡到OSGi的,我需要创建与我的所有库一个罐子。 我所做的就是把所有的jar库中的src / main /资源,以便他们在创建罐子的根目录的最后。 我遇到的问题是告诉Maven的捆绑,插件的所有包导出的罐子。 所以基本上,我要揭露我的所有库到其他OSGi包
这是我在POM尝试的第一件事
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Export-Package>*</Export-Package>
<Bundle-Name>${project.artifactId}</Bundle-Name>
<Bundle-Version>${project.version}</Bundle-Version>
</instructions>
</configuration>
</plugin>
</plugins>
</build>`
我试图出口都出现了。 但似乎是被导出这样的唯一的事情是两个OSGi的依赖关系,而不是在资源罐子
我有过百库,所以我试图找到一个自动化的方式来填充<Export-Package>
指令,而无需手工添加每个librarie的包。 不知怎的,日食做它的插件开发环境,但我需要为此使用maven。 这是可能的捆绑插件呢? 加分如果罐子被添加到<Bundle-ClassPath>
您必须添加瓶当在你的pom.xml依赖关系,然后使用下面的配方为您的maven-捆插件在<建立>标签:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<manifestLocation>META-INF</manifestLocation>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Bundle-Version>${project.version}</Bundle-Version>
<Export-Package>*</Export-Package>
<Bundle-Activator>your.activator.package.Activator</Bundle-Activator>
<Embed-Dependency>*;scope=compile|runtime</Embed-Dependency>
<Embed-Directory>target/dependency</Embed-Directory>
<Embed-StripGroup>true</Embed-StripGroup>
<Embed-Transitive>true</Embed-Transitive>
</instructions>
</configuration>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
也将添加以下,使一切有M2E工作:
请参阅: Maven的依赖关系的插件(目标“复制依赖性”,“解压”)不支持M2E
<pluginManagement>
<plugins>
<!-- Ignore/Execute plugin execution -->
<plugin>
<groupId>org.eclipse.m2e</groupId>
<artifactId>lifecycle-mapping</artifactId>
<version>1.0.0</version>
<configuration>
<lifecycleMappingMetadata>
<pluginExecutions>
<!-- copy-dependency plugin -->
<pluginExecution>
<pluginExecutionFilter>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<versionRange>[1.0.0,)</versionRange>
<goals>
<goal>copy-dependencies</goal>
</goals>
</pluginExecutionFilter>
<action>
<ignore />
</action>
</pluginExecution>
</pluginExecutions>
</lifecycleMappingMetadata>
</configuration>
</plugin>
</plugins>
</pluginManagement>
还添加以下,使其与Eclipse的PDE(摘自工作阿帕奇菲利克斯网站 ):
<profiles>
<profile>
<activation>
<property>
<name>m2e.version</name>
</property>
</activation>
<properties>
<osgi-version-qualifier>qualifier</osgi-version-qualifier>
</properties>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<!-- PDE does not honour custom manifest location -->
<manifestLocation>META-INF</manifestLocation>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</profile>
</profiles>
根据该文件的捆绑插件,您可以使用{local-packages}
,这将扩大到所有项目的包。
然而,这是一个非常糟糕的主意! 想想看一秒钟,你是说在你的捆绑一切都应该是公开可见的API。 这意味着你必须保持所有这些软件包,请务必仔细发展他们,并正确版本等,基本上你不会被模块化。
理想的任何OSGi包应该是尽可能少的包导出为可能 。
我觉得这是不可能的。 这些罐子需要单独在Maven回购能够通过将它们设为库项目依赖建立一个“库项目”; 否则罐子不会在类路径。 这样做的一个很好的参考是此页