Maven 如何在OSGI捆绑包中包含和使用.SO库文件
我是osgi捆绑包开发的新手。我正在开发osgi包以在ubuntu机器上运行。我想从osgi包访问共享库(Maven 如何在OSGI捆绑包中包含和使用.SO库文件,maven,osgi,shared-libraries,maven-plugin,osgi-bundle,Maven,Osgi,Shared Libraries,Maven Plugin,Osgi Bundle,我是osgi捆绑包开发的新手。我正在开发osgi包以在ubuntu机器上运行。我想从osgi包访问共享库(.so文件)。我正在使用maven插件生成osgi包jar 我在我的代码中添加了。因此,如下图所示 这是我的pom文件,它生成osgi包jar <build> <plugins> <plugin> <groupId>org.apache.felix</groupId>
.so
文件)。我正在使用maven插件生成osgi包jar
我在我的代码中添加了。因此
,如下图所示
这是我的pom文件,它生成osgi包jar
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Embed-StripVersion>true</Embed-StripVersion>
<Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
<Bundle-Name>${pom.artifactId}</Bundle-Name>
<Bundle-Version>${pom.version}</Bundle-Version>
<Import-Package>org.osgi.framework,
javax.net.ssl, javax.net,
com.google.gson,
com.google.gson.reflect,
org.osgi.service.blueprint.container
</Import-Package>
<Bundle-Activator>com.example.ModuleActivator</Bundle-Activator>
<Embed-Dependency></Embed-Dependency>
<Bundle-ClassPath>libexample.so, .</Bundle-ClassPath>
<Bundle-NativeCode>libexample.so</Bundle-NativeCode>
<Export-Package />
<Require-Capability />
<Embedded-Artifacts />
</instructions>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<filtering>false</filtering>
<directory>${basedir}/native</directory>
<includes>
<include>libexample.so</include>
</includes>
</resource>
<resources>
`
这是生成的包内容
开始工作很烦琐,但根据我的经验,一旦你有了它,工作起来就很容易了 我对Maven配置不太熟悉,但您是否嵌入了本机代码?看起来您正在系统上寻址一个显式文件,不知道这是否有效 所以要想弄明白:
- 检查您的捆绑包,它是否包含本机代码?
- 将其与[this][1](例如)这样的“已知”本机捆绑包进行比较。
- 清单中的路径是否与捆绑包中本机文件的路径相对应?
- 检查架构是否与操作系统/arch匹配:
Bundle NativeCode:lwjgl32.dll;jemalloc32.dll;osname=Windows;过程
r=x86,lwjgl.dll;jemalloc.dll;osname=Windows;处理器=x86-64,liblwjg
l、 所以,;libjemalloc.so;osname=Linux;处理器=x86-64,liblwjgl.dylib;解放党
jemalloc.dylib;osname=MacOSX;处理器=x86-64
否则,请发布您的清单文件和bundle jar的布局。很容易开始工作,但根据我的经验,一旦您准备好了,就很容易使用它 我对Maven配置不太熟悉,但您是否嵌入了本机代码?看起来您正在系统上寻址一个显式文件,不知道这是否有效 所以要想弄明白:
- 检查您的捆绑包,它是否包含本机代码?
- 将其与[this][1](例如)这样的“已知”本机捆绑包进行比较。
- 清单中的路径是否与捆绑包中本机文件的路径相对应?
- 检查架构是否与操作系统/arch匹配:
Bundle NativeCode:lwjgl32.dll;jemalloc32.dll;osname=Windows;过程
r=x86,lwjgl.dll;jemalloc.dll;osname=Windows;处理器=x86-64,liblwjg
l、 所以,;libjemalloc.so;osname=Linux;处理器=x86-64,liblwjgl.dylib;解放党
jemalloc.dylib;osname=MacOSX;处理器=x86-64
否则,请发布您的清单文件和捆绑罐的布局。Hi@Frank Lee感谢您的回复。我在两方面都在尝试。一个是,我希望使用系统。所以图书馆。我不确定是否需要将该so库添加到我的捆绑包中,或者是否可以直接从平台使用它。其次,我已将.so库复制到我的包的本机目录中。但是,当我构建包时,我并没有得到。所以,在生成的jar中使用这个库。我在上面的pom文件中更改了
native/libexample.so
。请指导我如何发送。因此,如何发送到生成的jar以及如何在运行时使用它。您不能只列出捆绑包中库文件的路径。您还必须添加与库相关的平台的元数据,如Frank Lee的回答所示。即,您必须至少指定操作系统名称和处理器。有关详细信息,请参阅OSGi核心版本6.0规范的第3.10节。您好,尼尔,谢谢您的评论。我添加了native/libexample.so;osname=linux;processor=arm
添加到我的pom文件中。我在项目根目录中创建了本机目录,并向其中添加了.so库。现在,当我构建它时,它给我这个错误在JAR中找不到本机库
。你能告诉我这里缺少什么吗?我已经用额外的资源更新了这个问题。现在请看一看。查看您的屏幕截图,捆绑包的路径不是native/libexample.so
,而是libexample.so
。只需相应地修复Bundle NativeCode头。你好@Frank Lee谢谢你的回复。我在两方面都在尝试。一个是,我希望使用系统。所以图书馆。我不确定是否需要将该so库添加到我的捆绑包中,或者是否可以直接从平台使用它。其次,我已将.so库复制到我的包的本机目录中。但是,当我构建包时,我并没有得到。所以,在生成的jar中使用这个库。我在上面的pom文件中更改了native/libexample.so
。请指导我如何发送。因此,如何发送到生成的jar以及如何在运行时使用它。您不能只列出捆绑包中库文件的路径。您还必须添加与库相关的平台的元数据,如Frank Lee的回答所示。即,您必须至少指定操作系统名称和处理器。有关详细信息,请参阅OSGi核心版本6.0规范的第3.10节。您好,尼尔,谢谢您的评论。我添加了native/libexample.so;osname=linux;processor=arm
添加到我的pom文件中。我在项目根目录中创建了本机目录,并向其中添加了.so库。现在,当我构建它时,它给我这个错误在JAR中找不到本机库
。你能告诉我这里缺少什么吗?我已经用额外的资源更新了这个问题。现在请看一看。查看您的屏幕截图,捆绑包的路径不是native/libexample.so
,而是libexample.so
。只需相应地修复Bundle NativeCode头。
Manifest-Version: 1.0
Bnd-LastModified: 1505136984891
Build-Jdk: 1.8.0_121
Built-By: Raj Sharma
Bundle-Activator: com.example.ModuleActivator
Bundle-ClassPath: libexample.so, .
Bundle-ManifestVersion: 2
Bundle-Name: ExampleModule
Bundle-NativeCode: libexample.so ; osname=linux ; processor=arm
Bundle-SymbolicName: ExampleModule
Bundle-Version: 2.0.5.Release
Created-By: Apache Maven Bundle Plugin
Embed-StripVersion: true
Import-Package: org.osgi.framework;version="[1.8,2)",javax.net.ssl,javax
.net,com.google.gson;version="[2.5,3)",com.google.gson.reflect;version=
"[2.5,3)",org.osgi.service.blueprint.container;version="[1.0,2)"
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"
Tool: Bnd-3.0.0.201509101326