【问题标题】:When I run the .jar, I get a "No lwjgl in java.library.path" error当我运行 .jar 时,出现“java.library.path 中没有 lwjgl”错误
【发布时间】:2011-09-29 03:34:43
【问题描述】:

我正在通过 Netbeans 使用 LWJGL 库用 Java 制作一个基本游戏。

我创建了一个包含 lwjgl、lwjgl_util 和 jinput .jar 的库,并在项目属性的“运行”类别中添加了 -Djava.library.path=C:\LWJGL\native\windows。

当我在 Netbeans 中运行该文件时,它运行完美,没有任何问题。但是当我通过双击文件运行 .jar 时,什么都没有弹出(据我所知,甚至没有瞬时 cmd 错误窗口)。当我通过命令行运行文件时,我得到:

C:\Users\200160765>java -jar "C:\Users\200160765\Documents\NetBeansProjects\Game
\dist\Game.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:82)
        at org.lwjgl.Sys.<clinit>(Sys.java:99)
        at org.lwjgl.opengl.Display.<clinit>(Display.java:130)
        at game.Draw.createWindow(Draw.java:198)
        at game.Draw.init(Draw.java:214)
        at game.Draw.run(Draw.java:56)
        at game.Main.main(Main.java:9)

我尝试将 DLL 和 .jar 库文件移动到与 Game.jar 相同的目录中的“lib”文件夹中,并将它们移动到与 Game.jar 相同的目录中,但我得到了同样的错误。有人可以帮我解释为什么我似乎无法在 netbeans 之外使用它吗?

【问题讨论】:

    标签: java opengl command-line command-line-arguments lwjgl


    【解决方案1】:

    您必须使用命令行参数 -Djava.library.path="path/to/natives" 将 jvm 指向本机文件所在的位置。您可以使用批处理 (.bat) 文件来指定它并为您启动应用程序。

    或者,您可以使用JarSplice 之类的工具从您的所有 jar 中创建一个可执行的 jar 文件,同时在其中包含您的本机文件。它将手动指定原生对象的棘手部分自动化,并提供更好的最终用户体验。

    要使用 JarSplice,只需在 jars 选项卡中选择您的 game.jar、lwjgl.jar、lwjgl_util.jar 和 jinput.jar。然后是 natives 选项卡中的所有 *.dll、*.so、*.dylib 和 *.jnilib 文件。在类选项卡上添加您的主类并创建单个可执行 jar。

    【讨论】:

    • 我对 .bat 文件语法不太熟悉,但我尝试了这条路线:'@echo off java -jar Game.jar -Djava.library.path=C:\LWJGL\native\ windows' 我仍然遇到同样的错误。
    • 此外,Fat Jar 的东西可以工作,但是我目前正在渲染的块上的纹理没有加载......但是,这可能是打包成 .jar 而不是装进一个胖罐子里。
    • 是的,只要确保您没有使用 File 或 FileInputStream 加载任何纹理,因为它们不能用于加载 jar 内的纹理。
    • 那么正确的 .bat 文件语法究竟是什么?或者我将如何在没有 FileInputStream 的情况下获取 LWJGL 的 png?
    • @Stephen Wilkins:您必须将 -D 参数放在 -jar 参数之前,否则它将由 Java 应用程序而不是 JVM 解释。
    【解决方案2】:

    LWJGL 需要您特定平台的本机组件位于 java.library.path 中。它们位于 LWJGL 发行版的子目录 native 中,在 Linux、OSX 和 Solaris 上以 .so 结尾,在 Windows 上以 .dll 结尾。

    【讨论】:

    • 我知道它需要 DLL,但我不知道 Netbeans 是如何找到 DLL 的,但 .jar 没有,以及我如何告诉 .jar。
    【解决方案3】:

    当我遇到这个问题时,是因为我不小心将指定本地人位置的参数(-Djava.library.path=/native/)放在选项的运行类别下名为“参数”的字段中面板,而不是“vm选项”。 如此处所示:http://s30.postimg.org/6f90akidt/Capture.png

    【讨论】:

      【解决方案4】:

      另一种方法是使用 Java Web Start (jnlp):http://lwjgl.org/forum/index.php?topic=3763.0

      这使得在某些方面共享您的项目更容易。

      【讨论】:

        【解决方案5】:

        我遇到了这个问题并使用 jarSplice (http://ninjacave.com/jarsplice) 修复了它

        确保在创建胖 jar 之前删除 jar 中所有预先放置的原生对象,否则会产生重复错误

        【讨论】:

          【解决方案6】:

          我也遇到了同样的错误,然后意识到我将文件命名为“my_lib.zip”而不是“my_lib.jar”。也许它可以帮助某人。

          【讨论】:

            【解决方案7】:

            另一件事要检查:

            • 如果您使用的是 32 位 JVM,则需要 32 位库。 (即使在 64 位操作系统上)
            • 如果您使用的是 64 位 JVM,则需要 64 位库。

            【讨论】:

              猜你喜欢
              • 2019-09-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-10-07
              • 2013-11-14
              • 2013-10-21
              相关资源
              最近更新 更多