Java 打包到jar/exe后SIGAR API不工作
我正在尝试使用sigarapi收集系统信息。在我的库中包含sigar.jar之后,Netbeans给出了一个错误,即未找到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
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终止时删除该文件。