1

jnlp をランチャーとして使用するアプリがあります。プラットフォーム固有のコード用に動的にロードされるネイティブ ライブラリを必要とする Sigar ライブラリを使用します。

これをデバッグするために、2 つの JNLP ファイルがあります。1 つは file: urls を使用してコードベースを参照し、もう 1 つは http: urls を使用して参照します。http url は、ファイルを適切に提供している localhost apache を指しています。JNLP が起動シーケンス中にそれらをダウンロードする様子を apache ログで確認できるので、ファイルがアプリに適切に到達していることがわかります。

これが2つのコードベースタグです

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"

file: version をダブルクリックすると、正常に動作します。ブラウザ経由でロードすると、正常に動作します。

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 フォーラムには、解決策のない同様の問題に関するメモがあります。

中心的な問題は、なぜこれが file: context と http: context で異なる動作をするのかということです。

また、すべてのファイルの署名を解除して辞任したことにも注意してください。署名エラーは見られません。

ここに答えのヒントがあります: Java Webstart with Tibco Native Libs

しかし、それは file: context で機能します。これにより、何か他のことが間違っていると思います。

また: 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 に答える