【发布时间】:2017-04-16 16:13:39
【问题描述】:
我的 java 游戏(使用 lwjgl 和 Eclipse 构建)在从 Eclipse 导出为 Runnable jar 后将无法运行。该程序在 Eclipse 中运行良好,并且导出的 jar 具有正确的 Manifest 文件格式。执行完这个Jar后,报错:
C:\Users\7rent\Desktop>java -jar hw.jar
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.lang.UnsatisfiedLinkError: no lwjgl in java.library.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 core.SecDef.main(SecDef.java:13)
... 5 more
然后我(使用堆栈溢出答案)使用 JarSplice 将 lwjgl jar 和 native 添加到这个 Jar 中。生成的 fatjar 给了我这个:
C:\Users\7rent\Desktop>java -jar SD.jar
错误:无法找到或加载主类 core.SecDef
jar 的清单包含以下内容: https://i.stack.imgur.com/ccpOH.png
FatJar 的内部是这样的: https://i.stack.imgur.com/hVBcD.png
我今天安装了 JRE 和 JDK,这两个都是最新版本,没有对系统变量进行任何配置。该项目设置为符合 java 6。
提前致谢:)
【问题讨论】:
-
您不能在大多数操作系统的 jar 文件中“按原样”使用本机库。您需要将库解压缩到普通磁盘文件,然后加载。
-
您使用了JarSplice's Fat Jar Creator 还是Eclipse 的可运行jar 导出器?我怀疑 JarSplice 会添加一些神奇的 Java 代码来将 DLL 提取到磁盘并从那里加载它们。
-
我首先使用了可运行的 jar 导出器,然后使用 JarSplice 将本地人添加到该 jar 中。
-
不要将第三方库添加到您的 JAR 中!在清单
Class-Path中标识的子目录中与 分发它们。 docs.oracle.com/javase/tutorial/deployment/jar/downman.html -
感谢库的帮助,但为什么会导致“无法找到或加载主类”错误?