Java JNLP通过文件而不是http加载Sigar本机LIB:
我有一个应用程序使用jnlp作为启动器。它使用Sigar库,这些库需要为特定于平台的代码动态加载本机库 为了调试这个,我有两个JNLP文件,一个使用file:url引用代码库,另一个使用http:url引用代码库。http URL指向本地主机apache,它正确地为文件提供服务。我可以通过apache日志观看JNLP在其启动过程中下载它们,这样我就知道这些文件正确地进入了我的应用程序 下面是两个代码基标签Java JNLP通过文件而不是http加载Sigar本机LIB:,java,jnlp,java-web-start,sigar,Java,Jnlp,Java Web Start,Sigar,我有一个应用程序使用jnlp作为启动器。它使用Sigar库,这些库需要为特定于平台的代码动态加载本机库 为了调试这个,我有两个JNLP文件,一个使用file:url引用代码库,另一个使用http:url引用代码库。http URL指向本地主机apache,它正确地为文件提供服务。我可以通过apache日志观看JNLP在其启动过程中下载它们,这样我就知道这些文件正确地进入了我的应用程序 下面是两个代码基标签 codebase="file:/Users/siberian/Documents/work
codebase="file:/Users/siberian/Documents/workspace_mnis/MNIS/localhost/"
href="file:/Users/siberian/Documents/workspace_mnis/MNIS/localhost/minis.jnlp"-->
及
代码基=”http://localhost/"
href=”http://localhost/mnis.jnlp"
如果我双击文件:version,它可以正常工作。如果我通过浏览器加载它,它工作正常
如果双击或浏览器加载http:version,则无法找到动态库,并出现以下错误:
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
现在,有趣的是它说找不到的那个文件
libsigar-universal64-macosx.dylib.dylib
注意前缀extra'lib'和后缀extra'.dylib'
Sigar/vmware论坛上有关于类似问题的说明,但没有解决方案
核心问题是,为什么这在file:context和http:context中的行为不同
另外值得注意的是,我已经取消了所有文件的签名并辞职,我看不到任何签名错误
这里有一些关于答案的提示:
但它是在一个文件中工作的:上下文,这让我觉得其他东西是错的
另外:JaNeLa告诉我一切都很好JNLP和Sigar类加载器在一起玩得不好。这是拼凑在一起的,但在Windows和Mac环境下都能很好地工作。VMWare论坛暗示了这样一个答案,但没有人将其全部放在一起。对于JNLP,您需要根据您的体系结构专门创建一个loadLibrary。在非JNLP上下文中,Sigar透明地处理这一点,但JNLP以某种方式打破了这一点,需要手动选择平台 只需将此方法放入类中并在调用new 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);
}
JNLP和Sigar类装入器不能很好地配合使用。这是拼凑在一起的,但在Windows和Mac环境下都能很好地工作。VMWare论坛暗示了这样一个答案,但没有人将其全部放在一起。对于JNLP,您需要根据您的体系结构专门创建一个loadLibrary。在非JNLP上下文中,Sigar透明地处理这一点,但JNLP以某种方式打破了这一点,需要手动选择平台 只需将此方法放入类中并在调用new 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);
}