2013-04-28 59 views
1

我目前使用Java 7 update 21运行Linux Mint 14 Nadia 64bit,并且使用LWGL 2.9。我也使用makefile来编译和运行所有的东西。LWJGL NoClassDefFoundError

我的问题我已经是当我尝试运行我的JAR(make run),我从命令行编译(见下文源),我收到此错误信息:

Exception in thread "main" java.lang.NoClassDefFoundError: org/lwjgl/LWJGLException 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2451) 
    at java.lang.Class.getMethod0(Class.java:2694) 
    at java.lang.Class.getMethod(Class.java:1622) 
    at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486) 
Caused by: java.lang.ClassNotFoundException: org.lwjgl.LWJGLException 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
    ... 6 more 
make: *** [run] Error 1 

之前,我有同样的通过javac(通过make)编译时遇到问题,但我通过将-cp $(LIB_FILES)标志添加到javac命令来解决此问题。所以,我试图将其添加到java命令(通过make run),但它没有解决我的问题。

我的下一个猜测是我需要将Djava.library.path设置为本地文件夹,这也不起作用。我提供了我认为需要的所有信息,但如果您需要更多信息,请询问。

目录布局:

Platform-Jumper 
    + class 
     + net/netne/platinumcoding/platformer (shortened to save space) 
      - Main.class 
    + dist 
     - Executable.jar 
    + lib 
     + native 
      + (freeusb/linux/macosx/solaris/windows) 
     - jinput.jar 
     - lwjgl.jar 
     - lwjgl_util.jar 
    - Makefile 
    - MANIFEST.MF 
    - README.md 
    + res 
     (Image files) 
    + src 
     + net/netne/platinumcoding/platformer (shortened to save space) 
      - Main.java 

(感谢Manzill0原始的Makefile) Makefile

JC    := javac 
JAR    := jar 

MODULES   := net/netne/platinumcoding/platformer 
SRC_DIR   := $(addprefix src/,$(MODULES)) 
CLASS_DIR  := $(addprefix class/,$(MODULES)) 
SO_DIR   := "lib/native/linux" 
LIB_FILES  := lib/lwjgl.jar:lib/lwjgl_util.jar:lib/jinput.jar 

SRC    := $(foreach sdir,$(SRC_DIR),$(wildcard $(sdir)/*.java)) 
OBJ    := $(patsubst src/%.java,class/%.class,$(SRC)) 

vpath %.java $(SRC_DIR) 

.PHONY: all checkdirs clean 

all: checkdirs dist/Executable.jar 

dist/Executable.jar: $(OBJ) 
     $(JAR) cvfm [email protected] MANIFEST.MF -C $(CLASS_DIR)/ . 

$(OBJ): $(SRC) 
     $(JC) -cp $(LIB_FILES) -d $(CLASS_DIR) $< 

checkdirs: $(SRC_DIR) $(CLASS_DIR) $(LIB_DIR) 

$(CLASS_DIR): 
     @mkdir -p [email protected] 

clean: 
     @rm -rf $(BUILD_DIR) 
     @rm -f dist/Executable.jar 

run: 
     java -cp $(LIB_FILES) -Djava.library.path=$(SO_DIR) -jar dist/Executable.jar 

Main.java

package net.netne.platinumcoding.platformer; 

import org.lwjgl.LWJGLException; 
import org.lwjgl.opengl.Display; 
import org.lwjgl.opengl.DisplayMode; 

public class Main { 
     public static void main(String[] args) { 
       new Main().start(); 
     } 

     public void start() { 
       try { 
         Display.setDisplayMode(new DisplayMode(800, 600)); 
       } catch (LWJGLException e) { 
         e.printStackTrace(); 
       } 

       while (!Display.isCloseRequested()) { 
         Display.update(); 
         Display.sync(60); 
       } 

       Display.destroy(); 
     } 
} 

注意:如果你需要的内容文件,我把它上传到GitHub @https://github.com/DealerNextDoor/Platform-Jumper

+0

在任何人暗示它之前,不,我不想使用IDE;我更喜欢手动从终端手动执行它,因为我对javac和java没有太多了解,所以我不打算让IDE解决我的问题,也不知道问题出在哪里。我想知道为什么这些错误首先发生以及如何避免它们。 – DealerNextDoor 2013-04-28 18:59:25

回答

1

我发现了我的问题。我正在混合-jar标志和-cp标志。为了解决这个问题,我所要做的就是将JAR文件添加到我的类路径中,然后运行我的主类。

其所以不是:

-cp lib/lwjgl.jar:lib/lwjgl_util.jar:lib/jinput.jar

我会用

-cp lib/lwjgl.jar:lib/lwjgl_util.jar:lib/jinput.jar:dist/Executable.jar

这解决了这个问题。