首页 文章

JNLP通过文件加载Sigar本机库:但不是http:

提问于
浏览
1

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

出于调试的目的,我有两个JNLP文件,一个使用file:urls引用代码库,另一个使用http:urls . http urls指向localhost apache,它正确地提供文件 . 我可以看看JNLP在启动过程中通过apache日志下载它们,所以我知道这些文件正确地进入我的应用程序 .

以下是两个代码库标记

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”

如果我双击文件:版本它工作正常 . 如果我通过浏览器加载它可以正常工作 .

如果我双击或浏览器加载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-macosx.dylib.dylib的文件

注意前缀额外'lib'和后缀额外'.dylib' .

Sigar / vmware论坛上有关于没有解决方案的类似问题的说明 .

核心问题是,为什么这在文件中的表现不同:context vs http:context?

另外值得注意的是,我已经签名并取消了我的所有文件,没有签名错误,我可以看到 .

这里有一些答案提示:Java Webstart with Tibco Native Libs

但它在一个文件中工作:上下文让我觉得别的东西是错的 .

另外:JaNeLa告诉我一切都很好

1 回答

  • 1

    JNLP和Sigar类加载器不能很好地协同工作 . 这是拼凑在一起但在Windows和Mac环境中都能很好地工作 . VMWare论坛提示这样的答案,但没有人把它放在一起 . 对于JNLP,您需要根据您的体系结构专门执行loadLibrary . 在非JNLP上下文中,Sigar透明地处理它,但JNLP以某种方式中断,需要这种手动平台选择 .

    只需将此方法放入您的类中,并在调用新的Sigar()之前调用它,它应该正常工作 . 这个解决方案需要公共图书馆 . 您可以轻松地为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);
    
          }
    

相关问题