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

2024-03-31

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

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

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

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

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

如果您要从 Java EE/spring 迁移,请考虑 Karaf 或 Virgo。但是,如果您的组件用于嵌入式系统或没有外部依赖项,Felix 或 Equinox 可能就足够了(尽管请查看pax-url http://team.ops4j.org/wiki/display/paxurl/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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 使用 python pty 伪终端进程发送命令并退出

    使用 python pty 模块 我想使用 stdin 函数 如 pty 模块想要的那样 向终端模拟器发送一些命令 然后强制退出 我想到了类似的事情 import pty cmnds exit n ls al n Command to se
  • Sun 的 bug 数据库中的 Java 版本名称

    In https bugs java com bugdatabase view bug bug id 6525150 https bugs java com bugdatabase view bug bug id 6525150它说 发布修
  • 如何在java中实现高效的超时

    有n执行某些操作的对象 执行操作后 时间戳将会更新 现在我想实现一个超时线程 它验证时间戳是否早于 60 秒 我的第一个解决方案是使用一个线程 while loop sleep 来做到这一点 该线程保存一个包含所有对象 包括最后一个时间戳
  • 使用 Visual Studio 创建大小为 100 字节的 C 程序

    我想编写一个 C 应用程序 该程序在构建时将创建一个大小为 100 字节或更小的可执行文件 即使我创建一个简单的 C 程序 其中只有一个空的main 我的输出文件在 Visual Studio 2015 上变成 11KB 有没有办法告诉 V
  • 在目录和子目录中搜索文件中的模式

    在Linux中 我想搜索给定目录及其子文件夹 文件以查找某些包含和排除模式 find apps exec grep performance v warn dev null 这与搜索所经过的大量行相呼应 我不想这样 我想找到包含性能但不包含警
  • 为什么这个 Jinja nl2br 过滤器会转义
    而不是

    我正在尝试实施this http flask pocoo org snippets 28 Jinja nl2br筛选 它工作正常 除了 br 是不是广告被转义了 这对我来说很奇怪 因为 p 没有被转义并且它们都在同一个字符串中 我正在使用烧
  • 可以将 std::numeric_limits 专门用于用户定义的类似数字的类吗?

    的文档std numeric limits
  • PHP 忽略 php.ini 中的curl.cainfo 设置(显然)

    我正在尝试修复 Windows 服务器 运行 IIS 上的 php curl 调用 该调用返回熟悉的错误 SSL 证书问题 请验证 CA 证书是否正常 详细信息 错误 14090086 SSL 例程 SSL3 GET SERVER CERT
  • 如何在 Apps 脚本中设置表格的水平对齐方式

    我无法找到使用 Google Apps 脚本水平对齐 Google 文档中表格的方法 我彻底检查了所有文档 也盲目地尝试了几种方法 尝试一 var cells Company rowData 3 Title rowData 4 var ta
  • 循环展开优化,它是如何工作的

    考虑这个 C 代码 int sum 0 for int i 0 i lt 5 i sum i 这可以用 伪 汇编方式翻译 无需循环展开 pseudo code assembly ADDI R10 0 sum ADDI R11 0 i LOO
  • 自动提供数据库中的唯一ID

    在我的项目中 我需要注册一位捐赠者 我需要用户输入他的信息 系统会注册他并为捐赠者生成一个唯一的 ID 制作一个带有字段ID的表 该表具有索引并且具有自动递增功能 CREATE TABLE Persons ID int NOT NULL A
  • 如何尾部除第一行之外的所有行[重复]

    这个问题在这里已经有答案了 例如 我有一个文件 1 2 3 然后我想从第二行输出到尾部 我怎样才能在linux下做到这一点 tail n 2 my file 将输出所有行myfile从第 2 行开始 n2会显示最后两行 tail有很多更多的
  • 算法时间复杂度分析

    您好 我正在尝试分析该算法的时间复杂度 但我很难解开并计算最终循环将执行的次数 我意识到第一个循环是 log n 但之后我似乎无法得到一个评估良好的总和 这是算法 for int i 1 i lt n i 2 i for int j 1 j
  • Ramda 循环数组

    循环可能是错误的术语 但它描述了我正在尝试的事情 我想为平面数据提供结构 但我还需要跟踪它来自的数组 基本上我的规则是 每个数组 如果级别 1 存在 给它name该项目的 以及typechild大批 每次出现级别 1 时 即使在同一个数组中
  • 寻找单调序列并考虑达到最大值时重新启动序列

    我有一个 data table 说 dt name lt letters 1 22 score lt c 42 82 43 32 47 48 49 50 54 59 76 9 13 88 91 99 4 6 8 12 14 15 class
  • Vim 中可以显示缩进指南吗?

    我是 Vim 的长期用户 三四年 最近开始处理一些深度嵌套的代码 此代码使用空格缩进 而不是制表符 我想要一些干净且不分散注意力的缩进指示 以帮助在我查看多个层次的深度内容时跟踪我所在的代码块 set list 只显示制表符和结束行字符 我
  • ASP.Net Core 1.0 RC2:web.config 中提到的 LAUNCHER_PATH 和 LAUNCHER_ARGS 是什么?

    有在 ASP NET 5 RC2 版本中 它更名为 ASP NET Core 1 0 ASP NET 5 已死 http www hanselman com blog ASPNET5IsDeadIntroducingASPNETCore10
  • 在 React 中将组件数组作为 Props 传递

    我正在寻找一种将组件数组传递给选项卡组件的道具的方法 只是想知道这是否可能 因此 我需要创建一个组件来缩短材质 ui 的选项卡方法 但我找不到一种方法来将组件数组作为 prop 传递 以便将其渲染在该组件上 这是我的代码的示例
  • 文件被隐藏了吗?

    如何确定某个路径是否指向隐藏文件 文件夹 NSString file my file some where BOOL fileIsHidden lt what do I do here 我知道隐藏文件以句点为前缀 这不是隐藏文件的唯一标准
  • 将现有 java 项目转换为 osgi 包的最佳方法

    我们有很多组件 我们只想模块化其中的几个 想知道 在我的构建环境的上下文中 从所有这些组件创建捆绑包的最佳方法是什么 我的环境 Java 6 Maven 2 2 1 Hudson 技术 Spring 3 0 5 WebSphere 7 Hi