如何用 Java 制作我的项目的可执行文件? 我尝试右键单击我的项目并选择导出。
问题是,当我执行导出的 jar 文件时,它无法打开!我错过了什么吗?有没有办法让我的项目生成 .exe 可执行文件?
当我在 cmd 中执行 jar 文件时,它显示:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no lwjgl in java.libr
ary.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at org.lwjgl.Sys$1.run(Sys.java:73)
at java.security.AccessController.doPrivileged(Native Method)
at org.lwjgl.Sys.doLoadLibrary(Sys.java:66)
at org.lwjgl.Sys.loadLibrary(Sys.java:95)
at org.lwjgl.Sys.<clinit>(Sys.java:112)
at org.lwjgl.opengl.Display.<clinit>(Display.java:135)
at org.newdawn.slick.AppGameContainer$1.run(AppGameContainer.java:39)
at java.security.AccessController.doPrivileged(Native Method)
at org.newdawn.slick.AppGameContainer.<clinit>(AppGameContainer.java:36)
at JavaGame.Game.main(Game.java:34)
最佳答案
UnsatisfiedLinkError 表示您缺少 native 库(通常是 Windows 上的 .dll
文件,或 Linux 上的 .so
文件)。您需要执行以下操作之一:
- 不建议:将 native 库复制到默认 java.library.path 上的某个位置(在 Windows 上,这包括
C:\Windows\system32
) - 不推荐:将 native 库复制到某个目录,然后使用
java -Djava.library.path=dir/containing/library -jar <jarfile>
运行您的程序 - 推荐:将 DLL 捆绑到 jar 文件中,然后修改代码以将 DLL 提取到临时目录并使用
System.load
加载它。或System.loadLibrary
.
您可以使用上面的前两个解决方案中的任何一个作为快速破解来使其工作,但这两个解决方案都不是很好。从部署的角度来看,最佳解决方案是上面的 #3。
就您而言,您正在使用 Lightweight Java Game Library ,或 UnsatisfiedLinkError 中引用的 lwjgl 。因此,您需要包含 lwjgl 附带的所有 DLL。
当您解压缩 lwjgl 时,您会注意到它有一个 native 目录,其中包含每个受支持平台的子目录。以下是 lwjgl 的 Windows DLL 列表:
要实现上面的解决方案 #3 并使可执行 jarfile 跨平台:
- 在您的项目/jar文件中,为每个平台创建一个单独的目录
- 将每个平台的所有 native 库放在适当的目录中(将它们放在与稍后用于提取它们的某些实用程序类相同的目录中可能会有所帮助)
- 将程序导出到 jar 文件时,请确保包含 native 库
- 查找平台/操作系统(例如 System.getProperty("os.name"))
- 在您的 Java 代码中(可能在您的 main 方法或某些实用方法中),创建一个临时目录
- 对于您在步骤 3 中查找的任何平台,将相应的 native 库提取到您在步骤 4 中创建的目录中(提示:使用
Class.getResourceAsStream
获取InputStream
,然后使用Files.copy
将其提取到文件) - 对于您在步骤 5 中提取的每个库,请调用
System.load("path/to/library_file")
参见https://stackoverflow.com/a/1611367/44737一个很好的例子,包括代码。
关于java - 将java项目构建为可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21295534/