1

我正在尝试使用 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 ...无法引用它或将其与 .jar 捆绑

如何在 Java 项目中包含 SIGAR API

任何帮助,将不胜感激..

编辑

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

2 回答 2

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());
于 2015-03-21T05:52:49.747 回答
0

如果是 Windows 则指定.dll路径,否则指定.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

于 2017-03-28T09:14:29.510 回答