Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Maven 如何在OSGI捆绑包中包含和使用.SO库文件_Maven_Osgi_Shared Libraries_Maven Plugin_Osgi Bundle - Fatal编程技术网

Maven 如何在OSGI捆绑包中包含和使用.SO库文件

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>

我是osgi捆绑包开发的新手。我正在开发osgi包以在ubuntu机器上运行。我想从osgi包访问共享库(
.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