2014-09-07 48 views
1

SIGAR API를 사용하여 시스템 정보를 수집하려고합니다. 내 라이브러리에 sigar.jar를 포함시킨 후 Netbeans는 sigar-amd64-winnt.dll이라는 오류를 발견했습니다. 해당 파일을 라이브러리에 추가 한 후 완벽하게 작동했습니다.jar/exe로 패키징 한 후 SIGAR API가 작동하지 않습니다.

이제 NetBeans를 사용하여 프로젝트를 빌드하기 위해 실행 가능한 jar 파일을 만들어야했습니다. Netbeans은 .dll 파일을 자동으로 삭제하고 수동으로 dist 폴더로 복사 한 후 내 프로그램이 작동했습니다. 지금은 Launch4j를 사용하여 exe 파일을 만들려고합니다. 내가 그것을 실행할 때 Java 예외가 throw됩니다. 아마도 Launch4j가 .dll 파일을 삭제했기 때문입니다.

Launch4j가 exe 파일에 포함 시키려면 어떻게해야합니까?

나는 수많은 답변을 통해 찾아 볼 수 있지만 내 문제를 해결할 수 없었다.

Launch4j 일부 below- 어떤 도움을 주시면 감사하겠습니다

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

How to include SIGAR API in Java Project

..

편집을 언급 한 것은 내가 실행 테스트 할 때 로그에 다음과 같은 예외를 제공합니다 exe wrapper-

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

좋아, 그래서 프로그램이 작동하는지 확인하기 위해 패키지 된 exe (필요한 dll 라이브러리를 src 폴더에 넣음)에서 네이티브 .dll 라이브러리를 컴퓨터로 복사 한 다음 라이브러리로로드해야합니다 .

이 마침내 윈도우 또는 다른 우분투의 경우 .so를 지정하는 경우 .dll 경로를 지정 ME-

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

에 의해 생성 된 실제 실행 가능한 병이다 그러나이 생성됩니다 때마다 문제가 .so 파일의 경로입니다 temp 폴더에 새 파일이 생기면 프로그램을 여러 번 실행하면 C 드라이브가 매일 하루 종일 사용됩니다. 1Mb 3 회 실행 –

+0

'sigar.deleteOnExit();'는 JVM 종료시 파일이 삭제되는지 확인합니다. – Pranav

0

위해 일 것입니다. 예를 들어 : 여기

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

.:/home/ubuntu/AssetManager/libsigar-amd64-linux.so는 SIGAR API를

aa.jar 이클립스

+0

우분투 시스템에서 완벽하게 작동합니다. – Amaranath