Java 带有lwjgl的类路径jdb
你好 我正在用vim和lwjgl编写一个游戏,我正在尝试用jdb调试,但我遇到了一些问题 首先,我向您展示我的项目树。(主类是Engine.java) 我正在使用javac调试选项用ant编译我的项目。以下是build.xml文件中的编译部分:Java 带有lwjgl的类路径jdb,java,lwjgl,jdb,Java,Lwjgl,Jdb,你好 我正在用vim和lwjgl编写一个游戏,我正在尝试用jdb调试,但我遇到了一些问题 首先,我向您展示我的项目树。(主类是Engine.java) 我正在使用javac调试选项用ant编译我的项目。以下是build.xml文件中的编译部分: <!-- Compile --> <target name="compile"> <mkdir dir="${classes.dir}" /> <javac srcdir="${src.dir}
<!-- Compile -->
<target name="compile">
<mkdir dir="${classes.dir}" />
<javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" debug="true" includeantruntime="false" />
</target>
我也注意到了这个奇怪的例外
Set uncaught java.lang.Throwable
Set deferred uncaught java.lang.Throwable
我找到了这篇解释解决方案的帖子
ignore uncaught java.lang.Throwable
我不确定我需要把这行代码放在哪里才能解决这个问题。
我还需要包括lwjgl的.class?我不知道我做错了什么
更新:
我将lwjgl包含在我的类路径中,它现在仍然运行良好。我还包括了源文件的路径
ruby@Cedrus ~/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的服务器运行,同样的错误也会出现
设置JVM服务器
ruby@Cedrus ~/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连接
ruby@Cedrus ~/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
当出现“异常”时,JVM会显示相同的错误
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)
我知道名字有问题,但我不知道如何解决
当我使用lwjgl运行jar文件时,我需要将本机文件附加到jar。我使用ant执行此操作。这里是我做这个操作的目标
<!-- 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>
谢谢您的时间。您需要在类路径中包含lwjgl jar
或者——这可能更容易——您可以使用jdb连接到另一个JVM,然后我认为这些类将通过网络或其他方式传输。或者可能它们只是不需要。要解决这个问题,我需要做三件事
# 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
希望这对某人有所帮助。它工作不好。我想我做错了什么。我在静默中附上了更多信息作为答案。我按照您的建议在类路径中添加了lwjgl.jar,没有任何更改。如果您需要更多信息,只需询问,“那么我认为课程将通过网络或其他方式传输”——这不会发生。
<!-- 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>
# 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