打包到jar / exe后,SIGAR API无法正常工作

时间:2014-09-07 14:33:26

标签: java jar exe launch4j sigar

我正在尝试使用SIGAR API收集系统信息。在我的库中包含sigar.jar后,Netbeans给出了sigar-amd64-winnt.dll未找到的错误。将该文件添加到库后,它工作得很好。

现在我需要创建一个可执行jar,因此我使用NetBeans来构建我的项目。 Netbeans自动删除了.dll文件,在我手动将其复制回dist文件夹后,我的程序运行正常。我现在正在尝试使用Launch4j创建一个exe文件。当我运行它时,抛出一个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

任何帮助将不胜感激..

修改

当我测试运行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

2 个答案:

答案 0 :(得分: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());

答案 1 :(得分: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是Eclipse创建的实际可运行jar