1

SIGAR API を使用してシステム情報を収集しようとしています。ライブラリに sigar.jar を含めた後、Netbeans はsigar-amd64-winnt.dll見つからないというエラーを出しました。そのファイルをライブラリに追加した後、完全に機能しました。

ここで、実行可能な jar を作成する必要があったため、NetBeans を使用してプロジェクトをビルドしました。Netbeans は .dll ファイルを自動的に削除し、手動で dist フォルダーにコピーした後、私のプログラムは機能しました。現在、Launch4j を使用して exe ファイルを作成しようとしています。実行すると、おそらく Launch4j が .dll ファイルを削除したため、Java 例外がスローされます。

Launch4j が exe ファイルに含まれていることを確認するにはどうすればよいですか?

SOに関する多数の回答を閲覧しましたが、問題を解決できませんでした。以下にいくつか言及しました-

sigar-amd64-winnt.dll ... 参照できない、または .jar にバンドルできない

Java プロジェクトに SIGAR API を含める方法

どんな助けでも大歓迎です..

編集

exe ラッパーをテスト実行すると、Launch4j のログに次の例外が記録されます。

Exception in thread "main" java.lang.NoClassDefFoundError: org/hyperic/sigar/SigarException
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.lang.Class.getMethod0(Unknown Source)
at java.lang.Class.getMethod(Unknown Source)
at sun.launcher.LauncherHelper.validateMainClass(Unknown Source)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.hyperic.sigar.SigarException
at java.net.URLClassLoader$1.run(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
... 6 more
4

2 に答える 2

1

さて、プログラムが機能することを確認するには、パッケージ化されたexeからネイティブ.dllライブラリをコンピューターにコピーし(必要なdllライブラリをsrcフォルダーに入れます)、ライブラリとしてロードする必要があります。

これが最終的に私のために働いたものです-

int arch = Integer.parseInt(System.getProperty("sun.arch.data.model"));
    InputStream is = null;
    if(arch==32)
        is = Logger.class.getClass().getResourceAsStream("/sigar-x86-winnt.dll");
    else if(arch==64)
        is = Logger.class.getClass().getResourceAsStream("/sigar-amd64-winnt.dll");

    Path sigar = Files.createTempFile("sigar_lib", ".dll");

    try (FileOutputStream out = new FileOutputStream(sigar.toFile())) 
            {
                byte[] buffer = new byte[1024];
                int len;
                while ((len = is.read(buffer)) != -1) {
                    out.write(buffer, 0, len);
                }
            } 
            catch (Exception e) {

        }
    System.load(sigar.toString());
于 2015-03-21T05:52:49.747 に答える