【问题标题】:build java project into executable将java项目构建成可执行文件
【发布时间】:2014-02-13 06:07:11
【问题描述】:

如何在 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)

【问题讨论】:

  • 1) 尝试在命令行上运行 jar 文件并检查您可能收到的任何错误消息。 2) 请搜索此站点和其他有关从 Java 项目创建 exe 文件的站点,因为这已被彻底重新散列。在大多数情况下,您确实希望避免这样做,最好的办法是创建一个正在运行的 Jar 文件。
  • 请注意,如果您发现自己处于绝对需要 exe 的少数情况下,您仍然需要首先有一个运行的 jar 文件。
  • 这里是错误:i.imgur.com/5VIzPUU.png
  • 不在 cmets 中,将其添加到您的问题中(使用 Edit 选项)

标签: java eclipse executable


【解决方案1】:

您可以使用 jar command line tool 手动将所有内容打包到 jar 中,也可以使用 AntMavenGradle 等工具自动打包 jar。

一旦您将类文件正确打包到 jar 文件中,您就可以通过创建适合您的操作系统的脚本文件来执行它们。例如 Windows 中的批处理文件或 Linux 中的 bash 文件。

您所要做的就是调用 java 命令并提供您的类路径和应用程序入口点的名称。

#!/bin/bash
java -cp myApp.jar com.my.app.Main

就是这样。您可以通过调用该脚本来执行您的应用程序。

此外,您可以通过为您的 jar 文件定义一个 MANIFEST 文件来安排创建一个可执行的 jar。在该清单文件中,您可以放置​​一个属性Main-Class,它指示您的应用程序入口点,您可以定义另一个名为Class-Path 的属性,它允许您指定应用程序所需的其他jar 列表。

Running Jar-Packaged Software

如果您以这种方式打包 jar,某些操作系统允许您通过简单地双击 jar 来执行应用程序。

但很可能,您仍然需要创建一个脚本,只是这次有点不同:

#!/bin/bash
java -jar myApp.jar

请参阅Java Tutorial: Packaging Applications in Jar Files

最终,如果您真的非常需要创建一个可执行文件,并且如果您在 Windows 上工作,您可以考虑使用像 WinRun4j 这样的工具。

【讨论】:

    【解决方案2】:

    UnsatisfiedLinkError 表示您缺少本机库(通常是 Windows 上的 .dll 文件,或 Linux 上的 .so 文件)。您需要执行以下操作之一:

    1. 不推荐:将本机库复制到默认 java.library.path 上的某个位置(在 Windows 上,这包括 C:\Windows\system32
    2. 不推荐:将本机库复制到一个目录,然后使用java -Djava.library.path=dir/containing/library -jar &lt;jarfile&gt; 运行您的程序
    3. 推荐:将 DLL 打包到 jarfile 中,然后修改代码以将 DLL 提取到临时目录并使用 System.loadSystem.loadLibrary 加载它。

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

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

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

    实施上述解决方案#3 并使您的可执行 jarfile 跨平台:

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

    请参阅 https://stackoverflow.com/a/1611367/44737 以获取包含代码的好示例。

    【讨论】:

    • 我需要什么 DLL 文件?我正在使用 Windows 8
    • 对不起,我应该更清楚。我会更新我的答案。您需要您正在使用的轻量级 Java 游戏库随附的 DLL(错误中引用的 lwjgl)。 lwjgl.org
    • 是的,谢谢,我希望你能解释我如何做推荐的部分,这意味着我必须使用 System.Load
    • 我添加了一些额外的细节,以及一个带有代码的示例的链接。
    • 现在的问题是当我将我的项目导出到 jar 时,jar 文件不包含 lib 文件夹和包含我的项目图像的其他文件夹,我试图将它们归档到 jar 文件中手动编译显示 NullPointerException 这意味着它没有找到我存档的文件!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    相关资源
    最近更新 更多