加载本机库时OSGI框架挂起

情况:开源的OSGI框架SMILA(http://www.eclipse.org/smila/)是通过Apache commons-daemon(http://commons.apache.org/daemon/)作为Windows Service启动的。 尝试从OSGI包通过System.loadLibrary()加载DLL,而Manifest.mf包含Bundle-NativeCode: path/to/dll

环境:Windows Server 2003,Java 1.6

错误:在调用System.loadLibrary() ,完整的Java进程挂起。 当服务停止时, System.loadLibrary()完成并执行代码,直到OSGI框架closures。

在Windows Server 2008上不会发生此错误,或者OSGI框架未作为服务启动。

DLL本身被剥离到没有functiontesting。 所有导入都是静态的,唯一依赖的库是kernel32.ddl

谁能想象为什么会发生这种情况,以及如何解决这个问题?


包含DLL的清单:

 Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: NTFS Utils Acl Win32 Library Bundle-SymbolicName: com.eccenca.utils.ntfs.acl.win32 Bundle-Version: 2.2.0 Bundle-Vendor: brox IT-Solutions GmbH Fragment-Host: com.eccenca.utils.ntfs Eclipse-PlatformFilter: (& (osgi.os=win32) (osgi.arch=x86)) Bundle-NativeCode: ntfsacl/Release/NtfsAcl.dll Bundle-RequiredExecutionEnvironment: JavaSE-1.6+ 

包含代码的清单:

 Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: NTFS Utils Acl Bundle-SymbolicName: com.eccenca.utils.ntfs Bundle-Version: 2.2.0 Bundle-Vendor: brox IT-Solutions GmbH Export-Package: com.eccenca.processing.acl, com.eccenca.utils.ntfs Import-Package: org.apache.commons.io;version="1.4.0", org.apache.commons.lang, org.apache.commons.logging;version="1.1.1", org.eclipse.smila.blackboard;version="0.8.0", org.eclipse.smila.datamodel, org.eclipse.smila.processing;version="0.8.0", org.eclipse.smila.processing.pipelets;version="0.8.0", org.eclipse.smila.utils.config;version="0.8.0", org.eclipse.smila.utils.service;version="0.8.0", org.osgi.framework;version="1.4.0" SMILA-Pipelets: com.eccenca.processing.acl.AccessListConverterPipelet Bundle-RequiredExecutionEnvironment: JavaSE-1.6 

使用System.loadLibrary()调用System.loadLibrary()代码:

 public class ACLList { private static final org.apache.commons.logging.Log LOG = org.apache.commons.logging.LogFactory.getLog(ACLList.class); static { try { LOG.debug("Start loading library"); System.loadLibrary("NtfsAcl"); if (LOG.isInfoEnabled()) { LOG.info("NTFS ACL library was succesfully loaded"); } } catch (Throwable e) { LOG.error(e); } } private ACLList() { } public static native ArrayList<ACLEntry> getAccessFor(String path, String serverName) throws IOException; } 

Solutions Collecting From Web of "加载本机库时OSGI框架挂起"

你描述的情况有两个可能的问题。 我不知道Equinox究竟是如何处理本地代码的,所以我只是把它们呈现给你。

Bundle-NativeCode至少需要一个参数

您使用的Bundle-NativeCode头只定义了一个库,似乎您使用Eclipse-PlatformFilter来指定该库的用途。 规范的第3.10节显示,您至少需要一个参数来选择库。

你可以改变你的Bundle-NativeCode头来阅读

 Bundle-NativeCode: ntfsacl/Release/NtfsAcl.dll;osname=win32 

你的软件包将能够找到合适的库。

仅从您自己的包中加载

从你的代码判断,你可能会在一个bundle中定义这个库,然后尝试把它加载到另一个bundle中。 这不起作用,一个包只能加载它自己包含的库。