2013-11-07 4 views
1

Хей там.Classpath jdb с lwjgl

Я программирую игру с lwjgl с помощью vim, и я пытаюсь отладить с помощью jdb, но у меня возникают некоторые проблемы.

Прежде всего, я покажу вам дерево моего проекта. (Основной класс - Engine.java).

. 
├── build 
│   ├── classes 
│   │   └── com 
│   │    └── ionsoft 
│   │     ├── engine 
│   │     │   ├── Draw.class 
│   │     │   ├── Engine.class 
│   │     │   └── Timer.class 
│   │     └── game 
│   │      └── Game.class 
│   └── jar 
│    └── Jump2Box.jar 
├── build.properties 
├── build.xml 
├── lib 
│   ├── jars 
│   │   ├── lwjgl.jar 
│   │   ├── lwjgl_util.jar 
│   │   └── slick-util.jar 
│   └── natives-linux 
│    ├── libjinput-linux64.so 
│    ├── libjinput-linux.so 
│    ├── liblwjgl64.so 
│    ├── liblwjgl.so 
│    ├── libopenal64.so 
│    └── libopenal.so 
├── LICENCE 
├── README 
├── src 
│   └── com 
│    └── ionsoft 
│     ├── engine 
│     │   ├── Draw.java 
│     │   ├── Engine.java 
│     │   └── Timer.java 
│     └── game 
│      └── Game.java 
└── tags 

Я компилирую свой проект с помощью муравья, используя опцию debug javac. Здесь есть часть для компиляции в build.xml файл:

<!-- Compile --> 
<target name="compile"> 
    <mkdir dir="${classes.dir}" /> 
    <javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" debug="true" includeantruntime="false" /> 
</target> 

Проблема появляется, когда я пытаюсь отладки приложения. Я прочитал человека page, и я увидел, что есть опция classpath. Поскольку я использую lwjgl, я полагаю, что мне нужно включить путь к файлам .class.

Я выполняю этот код из корня проекта.

[email protected] ~/development/java/projects/Jump2Box $ jdb -classpath build/classes com.ionsoft.engine.Engine              
Initializing jdb ... 
> run 
run com.ionsoft.engine.Engine 
Set uncaught java.lang.Throwable 
Set deferred uncaught java.lang.Throwable 
> 
VM Started: 
Exception occurred: java.lang.ClassNotFoundException (uncaught)"thread=main", java.lang.ClassLoader.loadClass(), line=436 bci=121 

main[1] cont 
Exception in thread "main" > java.lang.NoClassDefFoundError: org/lwjgl/LWJGLException 
    at java.lang.Class.getDeclaredMethods0(Native Method) 
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2521) 
    at java.lang.Class.getMethod0(Class.java:2764) 
    at java.lang.Class.getMethod(Class.java:1653) 
    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:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    ... 6 more 

The application exited 

Я также заметил об этом странном исключении.

Set uncaught java.lang.Throwable 
Set deferred uncaught java.lang.Throwable 

Я нашел этот пост here, который объясняет решение.

ignore uncaught java.lang.Throwable 

Я не уверен, где мне нужно поставить эту строку кода, чтобы решить эту проблему. Мне также нужно включить .class для lwjgl? Я не знаю, что я делаю неправильно.

UPDATE:

Я включил LWJGL в моем пути к классам, и это до сих пор в настоящее время работает хорошо. Я также включил путь к моим исходным файлам.

[email protected] ~/development/java/projects/Jump2Box $ jdb -launch -classpath build/classes/com/ionsoft/engine/:build/classes/com/ionsoft/game/:lib/jars/ -sourcepath src/com/ionsoft/engine/:src/com/ionsoft/game/ Engine 
Set uncaught java.lang.Throwable 
Set deferred uncaught java.lang.Throwable 
Initializing jdb ... 
> 
VM Started: No frames on the current call stack 

main[1] stop in Engine.main 
Deferring breakpoint Engine.main. 
It will be set after the class is loaded. 
main[1] cont 
> 
Exception occurred: java.lang.NoClassDefFoundError (uncaught)"thread=main",java.lang.ClassLoader.loadClass(), line=436 bci=121 

main[1] next 
Excep> tion in thread "main" java.lang.NoClassDefFoundError: Engine (wrong name: com/ionsoft/engine/Engine) 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:792) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
    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:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482) 

The application exited 

Если я пытаюсь запустить JVM в качестве сервера jdb, появляется такая же ошибка.

Настройка виртуальной машины Java сервер

[email protected] ~/development/java/projects/Jump2Box $ java -classpath build/classes/com/ionsoft/engine/:build/classes/com/ionsoft/game/:lib/jars/ -agentlib:jdwp=transport=dt_socket,address=localhost:8888,server=y,suspend=y Engine                      
Listening for transport dt_socket at address: 8888 

Подключение JDB

[email protected] ~/development/java/projects/Jump2Box $ jdb -sourcepath src/com/ionsoft/engine/:src/com/ionsoft/game/ -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8888 
Set uncaught java.lang.Throwable 
Set deferred uncaught java.lang.Throwable 
Initializing jdb ... 
> 
VM Started: No frames on the current call stack 

main[1] stop in Engine.main 
Deferring breakpoint Engine.main. 
It will be set after the class is loaded. 
main[1] cont 
> 
Exception occurred: java.lang.NoClassDefFoundError (uncaught)"thread=main",java.lang.ClassLoader.loadClass(), line=436 bci=121 

main[1] list 
Source file not found: ClassLoader.java 
main[1] next 
> 
The application exited 

В тот момент, когда "Exception ocurred" виртуальная машина появляется та же ошибка.

Exception in thread "main" java.lang.NoClassDefFoundError: Engine (wrong name: com/ionsoft/engine/Engine) 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:792) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
    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:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482) 

Я вижу, что есть проблемы с именами, но я не знаю, как его решить.

Когда я запускаю свой файл jar с помощью lwjgl, мне нужно прикрепить собственные файлы к банке. Я делаю эту операцию с помощью муравья. Здесь это цель, когда я выполняю эту операцию.

<!-- Run generated jar --> 
<target name="run" depends="jar"> 
    <java fork="true" classname="${main-class}"> 
    <classpath> 
     <path refid="classpath" /> 
     <path location="${jar.dir}/${ant.project.name}.jar" /> 
    </classpath> 
    <sysproperty key="java.library.path" value="${lwjgl_natives.dir}" /> </java> 
</target>  

Благодарим за ваше время.

ответ

1

Чтобы решить эту проблему, мне нужно сделать 3 вещи.

  1. Укажите путь к lwjgl.jar в пути к классам.
  2. Добавить -Djava.library.path вариант для вставки туземцев lwjgl.
  3. Используйте полное имя класса, используя также пакет. Ex. com.ionsoft.engine.Engine

Здесь я добавляю рабочие команды для þér JVM сервера и клиента JDB:

# JVM server 
java -classpath ./build/classes:./lib/jars/lwjgl.jar -Djava.library.path=./lib/natives-linux -agentlib:jdwp=transport=dt_socket,address=localhost:8888,server=y,suspend=y com.ionsoft.engine.Engine 

# JDB client 
jdb -sourcepath ./src -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8888 

Надежда, что это кому-то помочь.

-1

Вам нужно включить банку lwjgl на пути к классам.

Альтернативно - и это может быть проще - вы можете подключиться к другой JVM с помощью jdb, тогда я думаю, что классы будут перемещаться по сети или что-то в этом роде. Или, может быть, они просто не нужны.

+0

Что это плохо работает. Я думаю, что я делаю что-то неправильно. Я приложил больше информации в качестве ответа в своем ответе. – Ionthas

+0

Я добавил lwjgl.jar в classpath, как вы предлагали, и ничего не изменилось. Если вам нужна дополнительная информация, просто спросите. – Ionthas

+0

«тогда я думаю, что классы будут перемещаться по сети или что-то» - этого не происходит. –

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