我有自己的build.xml
文件,由几个目标组成,用Ant编译和运行Java项目。以下是本文的相关部分:
<path id="libpath">
<fileset dir="${lib.dir}" includes="**/*.jar" />
</path>
<patternset id="resources">
<include name="relative/path/to/resources/" />
</patternset>
<path id="resourcespath">
<fileset dir="${src.dir}">
<patternset refid="resources" />
</fileset>
</path>
<target name="compile">
<mkdir dir="${build.dir}" />
<mkdir dir="${classes.dir}" />
<javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="libpath" includeantruntime="false" debug="true" debuglevel="lines,vars,source" />
<copy todir="${classes.dir}">
<path refid="resourcespath" />
</copy>
</target>
<target name="debug" depends="compile">
<java fork="true" classname="${main-class}">
<sysproperty key="java.library.path" path="${dist.dir}"/>
<classpath>
<pathelement location="${classes.dir}" />
<path refid="libpath" />
</classpath>
</java>
</target>
我所要做的就是通过运行build.xml
的debug
目标来使用Netbeans调试${classes.dir}
中编译的代码。目前,此目标启动编译后的应用程序,而不会在断点处停止。我知道Netbeans生成默认的build-impl.xml
文件,但是这个文件太大了,对我来说很难理解。这就是为什么我想知道是否有可能使用Netbeans IDE来调试由Ant使用我自己的build.xml
文件编译的Java代码。
在Eclipse中使用Ant脚本时,在调试Java代码时也存在类似的问题,但我可以看到提出的解决方案是Eclipse特有的。
Sergey提出的方法有效,但每次调试项目时必须执行以下操作:
- 按调试主项目按钮(
Ctrl+F5
), Netbeans将等待调试器附加; - 选择"调试 "> " 附加调试器……在Netbeans主菜单中,在出现的对话框中指定调试器的参数,然后按"OK"按钮或从工具栏调试按钮的下拉列表中选择以前使用过的调试器(例如Attach to 5432);
- 调试应用程序,然后关闭它(
Shift+F5
不会像往常一样终止应用程序,它只会完成调试会话)。
在我看来,更好的方法是使用"附加调试器…"是选择SocketListen
连接器:
- 执行前面步骤链中的步骤2(选择Listen to 5432) -调试器将等待应用程序启动(请注意,
jvmarg
的子选项server
必须设置为n
-参见远程调试常见问题)。 - 按调试主项目按钮(
Ctrl+F5
)。 - 调试你的应用程序,然后关闭它或通过按
Shift+F5
在调试会话的同时终止它。
无论如何,这种方法也不舒服,特别是如果您习惯于通过简单地按Ctrl+F5
或按相应的工具栏按钮开始调试。每次从下拉菜单中选择所需的调试器都很烦人。
所以这是最好的解决方案——直接从Ant的debug
目标启动调试器。在我的例子中,它看起来像这样:
<target name="debug" depends="compile">
<nbjpdastart addressproperty="jpda.address" name="MyProjectName" transport="dt_socket">
<classpath>
<pathelement location="${classes.dir}" />
<path refid="libpath" />
</classpath>
</nbjpdastart>
<java fork="true" classname="${main-class}">
<sysproperty key="java.library.path" path="${dist.dir}" />
<classpath>
<pathelement location="${classes.dir}" />
<path refid="libpath" />
</classpath>
<jvmarg value="-Xdebug" />
<jvmarg value="-Xnoagent" />
<jvmarg value="-Djava.compiler=none" />
<jvmarg value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}" />
</java>
</target>
要获得更多信息,请参见创建一个目标来调试Java SE应用程序
from Eclipse topic的advice也适用于您。
-
使用下一个JVM参数(将它们添加到java目标调用中):
<jvmarg value="-Xdebug" />
<jvmarg value="-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5432" />
-
在netbeans中使用Debug->附加调试器端口5432