java - 将java项目构建为可执行文件

标签 java eclipse executable

如何用 Java 制作我的项目的可执行文件? 我尝试右键单击我的项目并选择导出。

http://i.imgur.com/XvyDZ8i.png

http://img560.imageshack.us/img560/6379/3ey9.png

问题是,当我执行导出的 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 文件)。您需要执行以下操作之一:

  1. 不建议:将 native 库复制到默认 java.library.path 上的某个位置(在 Windows 上,这包括 C:\Windows\system32 )
  2. 不推荐:将 native 库复制到某个目录,然后使用 java -Djava.library.path=dir/containing/library -jar <jarfile> 运行您的程序
  3. 推荐:将 DLL 捆绑到 jar 文件中,然后修改代码以将 DLL 提取到临时目录并使用 System.load 加载它。或System.loadLibrary .

您可以使用上面的前两个解决方案中的任何一个作为快速破解来使其工作,但这两个解决方案都不是很好。从部署的角度来看,最佳解决方案是上面的 #3。

就您而言,您正在使用 Lightweight Java Game Library ,或 UnsatisfiedLinkError 中引用的 lwjgl 。因此,您需要包含 lwjgl 附带的所有 DLL。

当您解压缩 lwjgl 时,您会注意到它有一个 native 目录,其中包含每个受支持平台的子目录。以下是 lwjgl 的 Windows DLL 列表:

Windows DLLs in lwjgl zipfile

要实现上面的解决方案 #3 并使可执行 jarfile 跨平台:

  1. 在您的项目/jar文件中,为每个平台创建一个单独的目录
  2. 将每个平台的所有 native 库放在适当的目录中(将它们放在与稍后用于提取它们的某些实用程序类相同的目录中可能会有所帮助)
  3. 将程序导出到 jar 文件时,请确保包含 native 库
  4. 查找平台/操作系统(例如 System.getProperty("os.name"))
  5. 在您的 Java 代码中(可能在您的 main 方法或某些实用方法中),创建一个临时目录
  6. 对于您在步骤 3 中查找的任何平台,将相应的 native 库提取到您在步骤 4 中创建的目录中(提示:使用 Class.getResourceAsStream 获取 InputStream ,然后使用 Files.copy 将其提取到文件)
  7. 对于您在步骤 5 中提取的每个库,请调用 System.load("path/to/library_file")

参见https://stackoverflow.com/a/1611367/44737一个很好的例子,包括代码。

关于java - 将java项目构建为可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21295534/

相关文章:

java - 为什么我无法将类导入 Eclipse Maven 项目中的 java 文件?

java - 没有这样的定义异常 : Spring Famework 4 , Apache tiles 3 和 Tomcat 8

linux - ELF header ,偏移量 06h 和 14h 是否重复?

python:我可以在不实际安装 python 的情况下运行 python 脚本吗?

java - 如何将 url 中的查询字符串传递的值传递到 spring Controller 中?

java - 类连接和类语句错误 "cannot find symbol"

java - 不确定为什么会发生 'java.net.ConnectException: Connection timed out: connect' 异常

java - 有没有更好的方法将变量传递到我的 View ?

java - Eclipse 中没有 Android 项目选项

exception - 混合 native /托管可执行文件中的最终托管异常处理程序?