9

我们有很多组件,我们只想从其中模块化几个开始。想知道从所有这些组件中创建捆绑包的最佳方式是什么(在我的构建环境中)?

我的环境:Java 6、Maven 2.2.1、Hudson

技术:Spring 3.0.5、WebSphere 7、Hibernate 3.2.x 和大多数 apache commons。

要求

  1. 仅对少数组件进行模块化。其余组件可以导出所有包。
  2. 当导入 Eclipse 时,我应该能够在构建路径中看到导入包的包作为依赖项(mvn eclipse:eclipse 似乎没有这样做)
4

3 回答 3

11

从仅更改 MANIFEST.MF 条目开始,以便您的所有工件都成为捆绑包 - 它们显然不会神奇地工作,但这是一个很好的非破坏性第一步。

使用 maven-bundle-plugin 时,请确保您进行了设置extensions,如果打包类型为(见末尾)supportedProjectTypes,则可能会遇到 CI 构建、Maven 存储库和 m2e 失败的问题。bundle

尽早测试您最危险/核心的外部依赖项——例如,如果您使用 JPA 进行持久性,则确保提供程序在带有域包和 JDBC 驱动程序的 OSGi 环境中工作。

如果您从 Java EE/spring 迁移,请查看 Karaf 或 Virgo。但是,如果您的组件用于嵌入式系统或没有外部依赖项,Felix 或 Equinox 可能就足够了(如果是这种情况,请查看pax-url项目)。

可能值得编辑您的问题以更具体地了解领域/技术?


eclipse:eclipse 仅在项目首次配置时生成,m2e 的生命周期问题可能会有点痛苦,但它比使用旧的 eclipse 插件要好得多。


下面将向您现有的工件添加清单条目,而不以任何其他方式更改它们。它告诉标准 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>
于 2012-05-03T19:25:12.183 回答
4

看看 bndtools,它对创建打包包的项目有很好的支持。它提供了很多关于 JAR 的结构以及它们如何依赖于其他事物的见解。

于 2012-05-04T12:14:32.823 回答
3

使用Maven 捆绑插件。它将根据扫描您的代码和 pom.xml 中定义的依赖项向您的清单添加所需的导入和导出语句。这将需要最少的努力来转换。

我还建议您使用M2Eclipse而不是 mvn eclipse:eclipse。它将使您的 Maven 配置和工作区保持同步。

于 2012-05-03T18:29:14.040 回答