我们有许多组件,我们只想开始模块化。想知道在所有这些组件中创建捆绑包的最佳方式(在我的构建环境中)是什么?
我的环境:Java 6,Maven 2.2.1,Hudson
技术:Spring 3.0.5,WebSphere 7,Hibernate 3.2.x和大多数apache commons。
要求
答案 0 :(得分:11)
首先只更改MANIFEST.MF条目,使所有工件成为捆绑包 - 它们显然不会神奇地起作用,但它是一个很好的非破坏性的第一步。
当使用行家束-插件确保设置extensions
和supportedProjectTypes
,你可能会遇到问题与CI构建时,Maven回购和M2E失败如果包装类型为bundle
(见结束)。
尽早测试最具风险/核心的外部依赖项 - 例如,如果您使用JPA进行持久化,那么请确保提供程序在OSGi环境中使用您的域绑定和JDBC驱动程序。
如果您从Java EE / spring迁移到Karaf或Virgo。但是,如果你的组件是用于嵌入式系统或没有外部依赖,那么Felix或Equinox就足够了(如果是这种情况,请查看pax-url项目。)
可能值得编辑您的问题,以更具体地了解域/技术吗?
以下内容会将清单条目添加到现有工件中,而不会以任何其他方式更改它们。它告诉标准的maven jar和war插件使用maven-bundle-plugin生成的MANIFEST.MF。
将它放在父POM中:
<pluginManagement>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>2.3.7</version>
<extensions>true</extensions>
<configuration>
<archive>
<addMavenDescriptor>true</addMavenDescriptor>
</archive>
<supportedProjectTypes>
<supportedProjectType>jar</supportedProjectType>
<supportedProjectType>war</supportedProjectType>
</supportedProjectTypes>
<instructions>
<Built-By>${project.organization.name}</Built-By>
<Bundle-Vendor>${project.organization.name}</Bundle-Vendor>
<Bundle-ContactAddress>${project.organization.url}</Bundle-ContactAddress>
<Bundle-Description>${project.description}</Bundle-Description>
<Bundle-DocURL>${bundle.doc.url}</Bundle-DocURL>
<Bundle-Category>${bundle.category}</Bundle-Category>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Bundle-Version>${project.version}</Bundle-Version>
<Import-Package>*</Import-Package>
<Export-Package>*</Export-Package>
</instructions>
</configuration>
<executions>
<execution>
<id>bundle</id>
<goals>
<goal>manifest</goal>
</goals>
<phase>prepare-package</phase>
<inherited>true</inherited>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.1</version>
<configuration>
<archive>
<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
</archive>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<executions>
<execution>
<id>create-war</id>
<phase>package</phase>
<goals>
<goal>war</goal>
</goals>
<inherited>true</inherited>
</execution>
</executions>
<configuration>
<archive>
<manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
</archive>
</configuration>
</plugin>
</pluginManagement>
然后在儿童POM中,您可以这样做:
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
</plugin>
<!-- Below is mutually exclusive: Either jar or war plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
</plugin>
</plugins>
</build>
答案 1 :(得分:4)
看一下bndtools,它非常支持创建包装包的项目。它提供了很多关于JAR如何构建以及它们如何依赖其他事物的见解。
答案 2 :(得分:3)
使用maven bundle plugin。它将根据扫描您的代码和pom中定义的依赖项向您的清单添加所需的导入和导出语句。这将需要最少的努力才能转换。
我还建议您使用M2Eclipse而不是mvn eclipse:eclipse。它将使您的maven配置和工作区保持同步。