2013-04-17 3 views
1

У меня есть приложение, которое использует jnlp в качестве запуска. Он использует библиотеки Sigar, для которых требуются динамически загруженные собственные библиотеки для кода, специфичного для платформы.JNLP загружает собственные библиотеки Sigar через файл: но не http:

Для отладки этого файла у меня есть два файла JNLP, один из которых ссылается на код, используя файл: 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"--> 

и кодовых = "HTTP: // локального /" 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

Обратите внимание на префикс extra 'lib' и postfix extra '.dylib'.

На форумах Sigar/vmware есть замечания по аналогичным проблемам без каких-либо решений.

Главный вопрос: почему это действует по-другому в файле: context vs http: context?

Также обратите внимание: у меня есть неподписанные и списаны все мои файлы, я не вижу ошибок подписи.

Есть намеки на ответ здесь: Java Webstart with Tibco Native Libs

Но он работает в файле: контекст, который заставляет меня думать, что-то еще не так.

также: Джанеле говорит мне все прекрасно

ответ

1

JNLP и SIGAR загрузчиков классов не играют хорошо вместе. Это было собрано вместе, но хорошо работает как в среде Windows, так и в Mac. На форумах VMWare HINT ответит так, но никто не поставил все это вместе. Для 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); 

     } 
Смежные вопросы