2013-04-28 3 views
1

В настоящее время я использую Linux Mint 14 Nadia 64bit с обновлением Java 7 21, и я использую LWGL 2.9. Я также использую make-файл для компиляции и запуска всего.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

ответ

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

И это устраняет проблему.

Смежные вопросы