我们在eclipse中就可以很方便的debug ant脚本:
在eclipse中打开一个build.xml,打一个断点就可以debug了。
但是今天来说说如何远程debug ant脚本。首先大家需要知道如何用eclipse远程debug程序,不知道的同学先参考这篇博文:
http://blog.csdn.net/onlyqi/article/details/7213503
设想这样一个场景: 我们的java程序在本地开发机器(windows)和在远程daily build机器 (linux)的行为不同。
在尝试以下方法以后:
1,在review代码后没有找到可能的原因。
2,确认linux上运行的是最新的jar包。避免人为疏忽导致运行的版本不是最新的。
唯一的剩下的方法就是远程debug,即让java程序在linux上以debug的形式运行。远程debug分为两步:
1,在remote机器将java程序以-Xdebug的方式launch起来。
2,将本地(开发机器)的eclipse attach到remote端正在运行的java程序上。
之后,我们就可以在本地eclipse方便的debug代码(程序实际是在remote端运行), 从而彻底发现问题。
如果参考了前面的文章,就会发现其实remote debugging很简单。首先我们需要用下面的command启动程序:
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address="8000" -jar httpContent.jar
但今天我们的问题是:remote机器上,程序是在ant脚本里运行起来的,如下例:
<taskdef name="runStoriesAsEmbeddables" classname="org.jbehave.ant.RunStoriesAsEmbeddables"
classpathref="project.classpath" />
<runStoriesAsEmbeddables includes="**/Ant*Stories.java" ignoreFailureInStories="true"
ignoreFailureInView="false"
systemProperties="story.path=.,qr.host=*,qr.port=*" generateViewAfterStories="true" />
此时应该如何将-Xbebug传递给jvm呢?
方法有两种:
1,如果程序有main函数,即是一个独立完整的java程序,我们可以将上例改为:
<java classname="org.jbehave.ant.RunStoriesAsEmbeddables" fork="true">
<jvmarg value="-Xdebug" />
<jvmarg value="-Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5432" />
<arg includes="**/Ant*Stories.java"/>
...
</java>
大家知道ant也是一个java程序,上例相当于在ant之外再起一个jvm,同时使用-Xdebug模式。
但是这种方法的限制是,org.jbehave.ant.RunStoriesAsEmbeddables必须有main函数,因为jvm需要知道程序的入口。
而有时launch的程序并没有main函数,如上例org.jbehave.ant.RunStoriesAsEmbeddables仅仅是继承了ant task的接口,我们可以认为它仅仅是被ant调用的一个方法而已。
此时就要使用第二种方法:
2,在launch ant时使用-Xdebug。
留心的同学会注意到,我们使用的ant不是exe这样的程序,而仅仅是一个脚本:
ant.bat 或 ant.cmd 或ant (shell)
例如在linux上打开ant脚本:
>which ant
/home/apache-ant-1.8.1/bin/ant
>cat /home/apache-ant-1.8.1/bin/ant
查看脚本内容就会发现,真正启动ant的是这一步:
ant_exec_command="exec \"$JAVACMD\" $ANT_OPTS -classpath \"$LOCALCLASSPATH\" -Dant.home=\"$ANT_HOME\" -Dant.library.dir=\"$ANT_LIB\" $ant_sys_opts org.apache.tools.ant.launch.Launcher $ANT_ARGS -cp \"$CLASSPATH\""
其中$ANT_OPTS是环境变量。
ANT_OPTS - command-line arguments that should be passed to the JVM. For example, you can define system properties or set the maximum Java heap size here.
因此我们仅仅需要设置这个环境变量为-Xdebug就可以了。
修改完毕,重新运行ant:
>ant -file build.xml 就可以看到程序悬停在那里,等待eclipse连接上来,进入debug模式。
另外需要注意的是ant 本身支持-D参数,但-D用于将参数传递到ant脚本中:
>ant -file build.xml -Darg1=“test”
此时ant脚本就可以引用$arg1这个参数并得到“test”值了。但是正如上文所说:只有ANT_OPTS会被传递给jvm,因此下面这样是错误的:
>ant -file build.xml -Xdebug