2013-04-28 58 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

這解決了這個問題。