2014-09-07 9 views
1

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

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

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

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

sigar-amd64-winnt.dll ... can't reference it or bundle it with .jar

How to include SIGAR API in Java Project

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

РЕДАКТИРОВАНИЕ

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 

ответ

1

Итак, чтобы убедиться, что программа работает, нам нужно скопировать собственную .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()); 
+0

Но есть проблема, которая каждый раз, когда он будет создан новый файл в папке temp, если вы запускаете программу много раз, диск C станет полным с каждым днем. 1Mb для 3-го запуска –

+0

'sigar.deleteOnExit();' будет убедиться, что файл удален при завершении работы JVM. – Pranav

0

Укажите .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 является фактическим работоспособным банком, созданные Затмениями

+0

Он отлично работает для меня в системе Ubuntu – Amaranath