我有一个使用jnlp作为启动程序的应用程序。它使用Sigar库,该库需要为特定于平台的代码动态加载本机库。
出于调试目的,我有两个JNLP文件,一个使用file: urls引用代码库,另一个使用http: urls引用代码库。http urls指向为文件提供正确服务的本地主机apache。我可以通过apache日志观看JNLP在启动过程中下载它们,这样我就可以知道文件是否正确地到达了我的应用程序。
下面是两个代码库标记
codebase="file:/Users/siberian/Documents/workspace_mnis/MNIS/localhost/"
href="file:/Users/siberian/Documents/workspace_mnis/MNIS/localhost/minis.jnlp"-->
和codebase="http://localhost/“href="http://localhost/mnis.jnlp”
如果我双击文件: version,它就能正常工作。如果我通过浏览器加载它,它工作得很好。
如果双击或浏览器加载http:版本,则无法找到动态库,并显示以下错误:
JNLPClassLoader: Finding library liblibsigar-universal64-macosx.dylib.dylib
[AWT-EventQueue-0] DEBUG Sigar - no libsigar-universal64-macosx.dylib in java.library.path
org.hyperic.sigar.SigarException: no libsigar-universal64-macosx.dylib in java.library.path
现在,值得注意的是,该文件显示找不到liblibsigar-universal64 al64-macosx.dylib.dylib
注意前缀“lib”和后缀“.dylib”。
Sigar/vmware论坛上有关于类似问题的注释,但没有解决方案。
核心问题是,为什么这在文件: context和http: context中表现不同?
同样值得注意的是,我已经对我的所有文件进行了未签名和重新签名,我看不到签名错误。
这里有一个答案的提示:Java Webstart with Tibco Native Libs
但它在一个文件中工作:上下文,这让我觉得有些地方不对劲。
还有: JaNeLa告诉我一切都很好
发布于 2013-04-24 20:49:10
JNLP和Sigar类加载器不能很好地配合使用。这是拼凑在一起的,但在Windows和Mac环境中都能很好地工作。VMWare论坛暗示了一个这样的答案,但没有人把它全部放在一起。对于JNLP,您需要根据您的体系结构专门创建一个loadLibrary。在非JNLP上下文中,Sigar透明地处理这一点,但JNLP以某种方式打破了这一点,需要手动选择平台。
只需将此方法放入您的类中,并在调用新的Sigar()之前调用它,它就会正常工作。这个解决方案需要commons-lang库。您可以很容易地将其扩展到linux和其他替代平台支持。
private static void preloadSigar() {
String arch = System.getProperty("os.arch");
String libName;
if (SystemUtils.IS_OS_WINDOWS) {
if (arch.equalsIgnoreCase("x86"))
libName = "sigar-x86-winnt";
else
libName = "sigar-amd64-winnt";
} else if (SystemUtils.IS_OS_MAC_OSX) {
if (arch.startsWith("i") && arch.endsWith("86"))
libName = "sigar-universal-macosx";
else
libName = "sigar-universal64-macosx";
} else {
throw new RuntimeException("Unrecognized platform!");
}
System.setProperty("org.hyperic.sigar.path", "-");
System.loadLibrary(libName);
}
https://stackoverflow.com/questions/16069507
复制