将现有java项目转换为osgi包的最佳方法

时间:2012-05-03 17:58:50

标签: java eclipse maven osgi

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

我的环境: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似乎没有这样做)

3 个答案:

答案 0 :(得分:11)

首先只更改MANIFEST.MF条目,使所有工件成为捆绑包 - 它们显然不会神奇地起作用,但它是一个很好的非破坏性的第一步。

当使用行家束-插件确保设置extensionssupportedProjectTypes,你可能会遇到问题与CI构建时,Maven回购和M2E失败如果包装类型为bundle(见结束)。

尽早测试最具风险/核心的外部依赖项 - 例如,如果您使用JPA进行持久化,那么请确保提供程序在OSGi环境中使用您的域绑定和JDBC驱动程序。

如果您从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>

答案 1 :(得分:4)

看一下bndtools,它非常支持创建包装包的项目。它提供了很多关于JAR如何构建以及它们如何依赖其他事物的见解。

答案 2 :(得分:3)

使用maven bundle plugin。它将根据扫描您的代码和pom中定义的依赖项向您的清单添加所需的导入和导出语句。这将需要最少的努力才能转换。

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