OSGi无法找到我的DLL文件,而且我似乎也找不到原因。
目前foo.dll
,我的包根目录中有DLL文件(),我也尝试将其放在libs
目录中。
有关捆绑商品的清单看起来像这样:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: foobundle
Bundle-SymbolicName: com.foo.bar
Bundle-Version: 1.0.0
Bundle-Vendor: me
Import-Package: com.sun.jna,
com.sun.jna.ptr,
com.sun.jna.win32
Export-Package: com.foo.bar
Bundle-NativeCode: foo.dll;
osname=WindowsXP;
processor=x86
然后在我的JNA界面中,执行loadLibrary(根据文档):
public interface MyFooInterface extends com.sun.jna.Library{
static final MyFooInterface INSTANCE = (MyFooInterface)com.sun.jna.Native.loadLibrary("foo", MyFooInterface .class);
// specific interface defs here...
}
然后在另一个类中,我尝试使用JNA接口
// ...code
int var = MyFooInterface.INSTANCE.bar();
// ...more code
我通过另一个捆绑软件提供了JNA(该捆绑软件输出com.sun.jna和上面导入的其他软件包),但也尝试过使用此处定义的捆绑软件打包(在这种情况下,将其添加到类路径中,等等)。
我也尝试过指定Bundle-NativeCode: /foo.dll
。
同样有趣的是,这些是相关的OSGi属性(我使用调出了这些属性getprop
)
org.osgi.framework.os.name=WindowsXP
org.osgi.framework.processor=x86
即使进行了所有这些操作(以及我进行的每一次尝试),我仍然总是遇到以下错误(并且未显示堆栈跟踪):
java.lang.UnsatisfiedLinkError: Unable to load library 'foo': The specified module could not be found.
…所以我想念什么?
编辑 :我还应该注意,我已经测试并成功完成了JNA接口代码和它作为JUnit Test程序一部分与之交谈的DLL。
编辑2
:将此代码添加到正在调用该库的类似乎允许JNA找到该库(Native.loadLibrary
以后被调用时)。看来我应该能够避免基于清单中的Bundle-
NativeCode指令进行此调用。显然,一旦加载库,Native.loadLibrary就会获取它的现有实例,但是我宁愿不要依赖于这种非常特定于订单的策略。
static{
System.loadLibrary("foo");
}
问题是专门的JNA
loadLibrary调用,它不支持OSGi。当您从OSGi捆绑软件调用loadLibrary时,它将使用OSGi类加载器(支持捆绑软件)查找DLL的位置,在这种情况下,将其从捆绑软件中提取出来并通过System.loadLibrary()使其可加载。针对特定位置致电。
由于此JNA似乎(a)不了解OSGi,并且(b)多余,为什么不只使用System.loadLibrary()呢?
如果您需要同时编写两者,请在BundleActivator的bundle的start()方法中执行System.loadLibrary(),这将带入本机库(您可能想确保如果无法加载该包,在任何情况下都无法启动)。
我正在将我的spring-java项目转移到OSGi。 我有一些依赖项,这些依赖项在spring ebr repo或maven repo中不能作为包提供。处理它们的最佳方法是什么? null
在感觉自己已经掌握了如何使用OSGi之后,我尝试向我的应用程序添加第三方依赖,特别是log4j2,该应用程序使用ApacheFelix并与maven捆绑插件捆绑。不幸的是,我似乎陷入了依赖地狱。 我尝试过使用许多maven捆绑包策略,如导入包,嵌入依赖,wrapImportPackage,Embed-Transitive,以及设置特定的版本号,仅举几例。以下是我的pom在这个插件中的样子: 我觉得
我是OSGi的新手。我正在使用Apache Felix。我已经构建了一个捆绑包,并且具有依赖性。当我尝试使用启动它会给我这个错误。 org . OSGi . framework . bundle exception:无法解析lk . ucsc . research . belly runner[20](R 20.0):缺失需求[lk . ucsc . research . belly runner
我试图在Felix中添加一个新的OSGI包(没有Karaf)作为ActiveMQ客户端(消息发送方)。 ActiveMQ客户端在非OSGI环境中运行良好。但当我在Felix中使用相同的代码(稍加修改)时,它会抛出以下错误: org.osgi.framework.捆绑异常:无法解决com.packtpub.felix.bookshelf-库存-impl-mock[7](R 7.3):缺少需求[com
我使用EclipseIndigo使用OSGiJava框架开发了一些包。有一个主捆绑包,它依赖于其他捆绑包,并且具有要运行的主程序。如果我尝试在Eclipse中运行所有捆绑包,一切都正常工作,但是如果我将每个捆绑包保存为一个JAR,并在命令行中启动OSGi框架,当我尝试启动主捆绑包时,会出现异常<code>NoClassDefFoundError。找不到的类是依赖项。包的其余部分处于活动状态,主包刚
我在Apache Felix上开发了一个OSGI捆绑包。捆绑包公开不同的API来实时管理YouTube事件。捆绑包服务将通过REST服务公开,并将由用户通过Web浏览器(chrome、safari、mozilla)使用。 我为该帐户生成凭据Google(client_secret和client_id)并将其保存在文件中,然后我的代码使用此凭据并正常工作。 我使用这个类(在youtube文档中找到)