远程debug ant脚本

我们在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


你可能感兴趣的:(远程debug ant脚本)