Java 打包到jar/exe后SIGAR API不工作

Java 打包到jar/exe后SIGAR API不工作,java,jar,exe,launch4j,sigar,Java,Jar,Exe,Launch4j,Sigar,我正在尝试使用sigarapi收集系统信息。在我的库中包含sigar.jar之后,Netbeans给出了一个错误,即未找到sigar-amd64-winnt.dll。将该文件添加到库中后,它工作得非常好 现在我需要创建一个可执行jar,所以我使用NetBeans来构建我的项目。Netbeans自动删除了.dll文件,在我手动将其复制回dist文件夹后,我的程序运行正常。我现在尝试使用Launch4j创建一个exe文件。当我运行它时,会抛出一个java异常,可能是因为Launch4j删除了.dll

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

现在我需要创建一个可执行jar,所以我使用NetBeans来构建我的项目。Netbeans自动删除了.dll文件,在我手动将其复制回dist文件夹后,我的程序运行正常。我现在尝试使用Launch4j创建一个exe文件。当我运行它时,会抛出一个java异常,可能是因为Launch4j删除了.dll文件

如何确保Launch4j将其包含在exe文件中

我浏览了许多答案,但还是没能解决我的问题。我在下面提到了一些-

任何帮助都将不胜感激

编辑

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

好的,为了确保程序正常运行,我们需要将本机.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());

如果是Windows,请指定
.dll
路径;如果是Ubuntu,请指定
.so
。 例如:

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
是Eclipse创建的实际可运行jar

,但有一个问题,每次它都会在临时文件夹中创建一个新文件,如果您多次运行该程序,C驱动器将一天比一天满。1Mb用于3次运行
sigar.deleteOnExit()
将确保在JVM终止时删除该文件。