Java JNLP通过文件而不是http加载Sigar本机LIB:

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

我有一个应用程序使用jnlp作为启动器。它使用Sigar库,这些库需要为特定于平台的代码动态加载本机库

为了调试这个,我有两个JNLP文件,一个使用file:url引用代码库,另一个使用http:url引用代码库。http URL指向本地主机apache,它正确地为文件提供服务。我可以通过apache日志观看JNLP在其启动过程中下载它们,这样我就知道这些文件正确地进入了我的应用程序

下面是两个代码基标签

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);

      }