1

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

出于调试目的,我有两个 JNLP 文件,一个使用 file: urls 引用代码库,另一个使用 http: urls。http url 指向正确提供文件的 localhost 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"

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

如果我双击或浏览器加载 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 论坛上有关于类似问题但没有解决方案的注释。

核心问题是,为什么这在文件中表现不同:上下文与 http: 上下文?

另外值得注意的是,我已经取消了所有文件的签名和辞职,我看不到任何签名错误。

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

但它在一个文件中工作:上下文让我认为其他事情是错误的。

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

4

1 回答 1

1

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

      }
于 2013-04-24T20:49:10.253 回答