我正在尝试使用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
答案 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