将java项目构建成可执行文件

时间:2014-01-22 22:38:42

标签: 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)

2 个答案:

答案 0 :(得分:3)

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

  1. 不推荐:将本机库复制到默认java.library.path上的某个位置(在Windows上,这包括C:\Windows\system32
  2. 不推荐:将本机库复制到目录,然后使用java -Djava.library.path=dir/containing/library -jar <jarfile>
  3. 运行程序
  4. 推荐:在您的jar文件中捆绑DLL,然后修改代码以将DLL解压缩到临时目录并使用System.loadSystem.loadLibrary加载它。
  5. 您可以使用上面的前两个解决方案中的任何一个作为快速入侵来使其正常工作,但这些解决方案都不是很好。从部署的角度来看,最佳解决方案是#3。

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

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

    Windows DLLs in lwjgl zipfile

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

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

答案 1 :(得分:2)

您可以使用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之类的工具。