【问题标题】:Best way to convert existing java projects to osgi bundles将现有 java 项目转换为 osgi 包的最佳方法
【发布时间】:2012-05-13 07:00:19
【问题描述】:

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

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

【问题讨论】:

    标签: java eclipse maven osgi


    【解决方案1】:

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

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

    尽早测试您风险最高/核心的外部依赖项 - 例如,如果您使用 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>
    

    【讨论】:

    • 我有两个选项来运行这几个包 1) 在嵌入式 Apache Felix witin WAR 2) Witin WAB
    • 我已经用这些技术更新了我的帖子。你试过第谷吗?
    • 非常翔实的帖子 - POM 内容特别有用,谢谢 earcam。用户注意:如果在 JAR 上运行,您必须注释掉 maven-war-plugin 部分,否则包目标将失败。
    • @earcam - 完美,谢谢 =) 我为每个 jar,war 使用了配置文件,因为您可以通过这种方式为每种类型指定不同的 BundleActivator。 maven-war-plugin 配置进入 'war' 配置文件。这仅对我们来说是必要的,因为我们在部分原型中使用您的代码,该部分原型可以应用于任何一种包装类型的现有项目。
    • maven.apache.org/archetype/archetype-models/…部分原型所做的总结是 i。将archetype-resources/pom.xml 与现有项目的合并,以及 ii。将archetype-resources 中的任何其他资源添加到现有项目中。它对于可重用的包装器功能非常有用,例如我们正在讨论的 OSGi-fication ehre。
    【解决方案2】:

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

    【讨论】:

    • bndtools 是否会自动将生成的 jar 移动到 maven 存储库?或者如何将罐子移动到 mvn repo?
    • 现在比较老了,但可能值得透露您与 bndtools 的关系
    • 为什么需要这样做?bndtools 不是产品?
    【解决方案3】:

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

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

    【讨论】:

    • 它是可配置的,您可以将其设置为外部安装 - 可能适用于 Maven2。但是使用 m2e 和 maven-bundle-plugin 会大大提高您的续航里程
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 2023-03-05
    • 2020-02-23
    • 2010-09-17
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多