SIGAR API не работает после упаковки в jar/exe

Я пытаюсь собрать системную информацию с помощью SIGAR API. После включения sigar.jar в мою библиотеку Netbeans выдал ошибку, что sigar-amd64-winnt.dll не найден. После добавления этого файла в библиотеку все заработало отлично.

Теперь мне нужно было создать исполняемый файл jar, поэтому я использовал NetBeans для сборки своего проекта. Netbeans автоматически удалил файл .dll, и после того, как я вручную скопировал его обратно в папку dist, моя программа заработала. Сейчас я пытаюсь создать исполняемый файл с помощью Launch4j. Когда я запускаю его, возникает исключение Java, вероятно, потому, что Launch4j удалил файл .dll.

Как я могу убедиться, что Launch4j включает его в исполняемый файл?

Я просмотрел множество ответов на SO, но не смог решить свою проблему. Упомянули некоторые ниже-

sigar-amd64-winnt.dll ... не может ссылаться на него или связывать его с .jar

Как включить SIGAR API в проект Java

Любая помощь будет оценена.

ИЗМЕНИТЬ

Launch4j дает следующее исключение в своем журнале, когда я тестирую запуск exe-оболочки:

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

person Pranav    schedule 07.09.2014    source источник


Ответы (2)


Итак, чтобы убедиться, что программа работает, нам нужно скопировать родную библиотеку .dll на компьютер из запакованного exe (нужные библиотеки 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());
person Pranav    schedule 21.03.2015
comment
Но есть проблема, которая каждый раз будет создавать новый файл во временной папке, если запускать программу много раз, диск С будет заполняться изо дня в день. 1Мб на 3 запуска - person Bahramdun Adil; 03.06.2015
comment
sigar.deleteOnExit(); позаботится о том, чтобы файл был удален при завершении работы JVM. - person Pranav; 21.08.2015

Укажите путь .dll, если это Windows, или укажите .so, если это Ubuntu. Например:

java -Djava.library.path=".:/home/ubuntu/AssetManager/libsigar-amd64-linux.so" -jar aa.jar

Здесь .:/home/ubuntu/AssetManager/libsigar-amd64-linux.so — путь к файлу Sigar API .so.

aa.jar — это фактическая исполняемая банка jar, созданная Eclipse.

person Amaranath    schedule 28.03.2017