【问题标题】:Embed SIGAR .so and .dll files into OSGI bundle将 SIGAR .so 和 .dll 文件嵌入 OSGI 包
【发布时间】:2016-11-21 10:57:25
【问题描述】:

我想将 .so 文件和 .dll 文件嵌入到 OSGI 包中。我试过这个: 我将所有文件复制到src\main\resources\lib

然后我添加了这个依赖:

        <dependency>
            <groupId>org.hyperic</groupId>
            <artifactId>sigar</artifactId>
            <version>1.6.5.132-6</version>
            <type>jar</type>
        </dependency>

POM.xml

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <version>3.0.0</version>
    <extensions>true</extensions>
    <configuration>
        <instructions>
            <Embed-Dependency>sigar;scope=compile|runtime</Embed-Dependency>
            <Embed-Dependency>sigar;scope=compile|runtime</Embed-Dependency>
                            <Include-Resource>
                                ${basedir}/src/main/resources/lib/libsigar-amd64-linux.so,
                                ${basedir}/src/main/resources/lib/libsigar-x86-linux.so,
                                ${basedir}/src/main/resources/lib/libsigar-amd64-solaris.so,
                                ${basedir}/src/main/resources/lib/libsigar-universal64-macosx.dylib,
                                ${basedir}/src/main/resources/lib/sigar-amd64-winnt.dll
                            </Include-Resource>
                            <Bundle-NativeCode>
                                /libsigar-amd64-linux.so;
                                processor=x86_64; osname=Linux,
                                /libsigar-x86-linux.so;
                                processor=x86;
                                osname=Linux,
                                /libsigar-amd64-solaris.so;
                                processor=x86_64; osname=Solaris,
                                /libsigar-universal64-macosx.dylib;
                                osname=macosx; processor=x86;
                                processor=x86_64,
                                /sigar-amd64-winnt.dll;
                                processor=x86_64; osname=Windows
                            </Bundle-NativeCode>
            <Bundle-Activator>org.test.Activator</Bundle-Activator>
            <Bundle-Version>${project.version}</Bundle-Version>
            <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
        </instructions>
    </configuration>
</plugin>

当我将包运行到 OSGI 框架中时,我得到:

no sigar-amd64-winnt.dll in java.library.path
org.hyperic.sigar.SigarException: no sigar-amd64-winnt.dll in java.library.path
        at org.hyperic.sigar.Sigar.loadLibrary(Sigar.java:172)

您能否提供一些建议,我可以如何嵌入它们?

更新:我也试过这个:

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <version>3.0.0</version>
    <extensions>true</extensions>
    <configuration>
        <instructions>
            <Embed-Dependency>sigar;scope=compile|runtime</Embed-Dependency>
            <Include-Resource>
                ${maven-resources},
                lib=src\main\resources\lib
            </Include-Resource>
            <Bundle-NativeCode>
                lib/sigar-amd64-winnt.dll;
                processor=x86_64; osname=win32
            </Bundle-NativeCode>
            <Import-Package>
                org.osgi.framework;version="[1.7,2)",
                org.osgi.util.tracker;version="[1.5,2)"
            </Import-Package>
            <Bundle-Activator>org.test.Activator</Bundle-Activator>
            <Bundle-Version>${project.version}</Bundle-Version>
            <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
         </instructions>
    </configuration>
</plugin>

我得到了这个部分结果:

org.osgi.framework.BundleException: Unable to resolve io.lambdacube.osgi.sigar [31](R 31.0): missing requirement [io.lambdacube.osgi.sigar [31](R 31.0)] osgi.native; (|(&(osgi.native.osname~=linux)(osgi.native.processor~=x86_64))(&(osgi.native.osname~=linux)(osgi.native.processor~=x86))(&(osgi.native.osname~=solaris)(osgi.native.processor~=x86_64))(&(osgi.native.osname~=macosx)(|(osgi.native.processor~=x86)(osgi.native.processor~=x86_64)))) Unresolved requirements: [[io.lambdacube.osgi.sigar [31](R 31.0)] osgi.native; (|(&(osgi.native.osname~=linux)(osgi.native.processor~=x86_64))(&(osgi.native.osname~=linux)(osgi.native.processor~=x86))(&(osgi.native.osname~=solaris)(osgi.native.processor~=x86_64))(&(osgi.native.osname~=macosx)(|(osgi.native.processor~=x86)(osgi.native.processor~=x86_64))))]
    at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:4111)[org.apache.felix.framework-5.4.0.jar:]
    at org.apache.felix.framework.Felix.startBundle(Felix.java:2117)[org.apache.felix.framework-5.4.0.jar:]
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:998)[org.apache.felix.framework-5.4.0.jar:]

有什么解决办法吗?

【问题讨论】:

    标签: maven osgi karaf sigar


    【解决方案1】:

    您需要使用标头 Bundle-NativeCode 来映射包中的本机库。

    此外,已经有几个项目将 sigar 打包为 osgi 包。您可以看到例如this onehere

    【讨论】:

    • 我检查了链接。 Windows 的 dll 文件丢失。我尝试更新我的 POM 文件,但出现错误 Native library not found in JAR: /libsigar-amd64-linux.so。能给点建议吗?
    • 根据上面的目录名 src\main\resources\lib,您的库似乎在捆绑包的 lib 文件夹中?您是否将包中的条目名称与包清单中的 Bundle-NativeCode 标头中的值进行比较?
    • 我有部分进展,请看帖子。
    猜你喜欢
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    相关资源
    最近更新 更多