Java 将现有JAR转换为OSGi包

Java 将现有JAR转换为OSGi包,java,intellij-idea,osgi,osgi-bundle,Java,Intellij Idea,Osgi,Osgi Bundle,我有一个JAR文件需要转换成OSGi包。 我没有JAR文件的原始源代码 我尝试使用以下答案: 然而,它们已经相当过时了 编辑:我需要转换几个罐子,但数量固定 选项1-当需要频繁添加/更新JAR时,或者当您可以从Maven存储库检索依赖项时,使用bnd平台构建OSGi捆绑包 我们使用(我也是作者)管理第三方依赖关系,并从中创建OSGi捆绑包。您可以将它用于从Maven存储库和本地JAR检索的依赖项(请参阅)。如果您定期添加或更新依赖项,我建议您尝试bnd平台。这是一个Gradle插件,您可以很容易

我有一个JAR文件需要转换成OSGi包。 我没有JAR文件的原始源代码

我尝试使用以下答案:

然而,它们已经相当过时了


编辑:我需要转换几个罐子,但数量固定

选项1-当需要频繁添加/更新JAR时,或者当您可以从Maven存储库检索依赖项时,使用bnd平台构建OSGi捆绑包

我们使用(我也是作者)管理第三方依赖关系,并从中创建OSGi捆绑包。您可以将它用于从Maven存储库和本地JAR检索的依赖项(请参阅)。如果您定期添加或更新依赖项,我建议您尝试bnd平台。这是一个Gradle插件,您可以很容易地开始-只需添加Jar文件并提供项目自述文件(捆绑符号名称、版本)中描述的配置,然后运行
gradlew捆绑

选项2-使用bnd构建您的OSGi捆绑包,只需一次,或者很少添加/更新

如果只执行一次或很少执行此过程,那么从现有Jar创建OSGi包的一种简单方法是直接使用。您只需要Java和bnd jar。您可以使用
wrap
尝试自动包装一个jar或创建一个
.bnd
文件(例如,仅导出特定的包)

示例.bnd文件:

-classpath: lib/trove-2.0.4.jar
-output: gnu.trove-2.0.4.jar
Export-Package: *;-split-package:=merge-last;-noimport:=true
Import-Package: *
Bundle-Version: 2.0.4
Bundle-Name: GNU Trove Collections Plug-in
Bundle-SymbolicName: gnu.trove
示例调用:

java -jar <path to bnd>.jar trove-2.0.4.bnd
java-jar.jar-trove-2.0.4.bnd
bnd Jar下载不再直接通过网站提供,一个好的替代方法是。

该项目提供了一种基于Maven的方法,用于将OSGi元数据添加到Maven存储库中使用的Jar中。尽管名称不同,但它不使用Eclipse


在其核心,它使用了。这个工具就像一把瑞士军刀。它分析JAR和类文件,并正确计算包的导入和导出。您应该自己使用bnd转换专有JAR。如果您使用的是Maven,那么您可以使用Maven Bundle插件在OSGi Bundle中内联或嵌入依赖项:


或者只需使用osgi:install with wrap选项,如下所示

osgi:install wrap:file:/u01/repository/com/oracle/ojdbc6/11.2.0/ojdbc6-11.2.0.jar

这将把jar文件部署为bundle,您可以在“$fuse_home/data/cache/bundle{id}/version0.0”下获得该bundle文件夹。

是否有一种方法不涉及Eclipse?这是关于在不涉及Eclipse的情况下创建捆绑包。作为旁注:要实现这一点,您需要安装pax url wrap。如果您在捆绑包之间共享此依赖关系,这将不起作用-您将获得一个类加载器conflict@zacheusz,请针对您面临的具体问题提出一个新问题。看起来您遇到了特定库的问题。通常,通过使用bnd处理JAR创建的包工作得非常好。然而,有些库需要额外的步骤才能成为好的OSGi公民?我尝试了maven bundle插件将jar转换为bundle。但是,当我检查生成的bundle的MANIFEST.MF时,我在导入包中看到,有很多jar包需要导入。我认为这是一个循环。我需要首先将jar转换为一个包,然后我需要将它的jar依赖项转换为包,然后是依赖项的依赖项。。。。。。只要导入包中有一个jar包,我就不能使用bndrun来测试这个包……只需添加这段信息-您必须在-classpath条目中添加主jar及其所有依赖项(用逗号分隔的列表)。如果我错了,请纠正我。