解决ant编译 源码Unknown Source的问题

来源:互联网 发布:mit人工智能实验室 编辑:程序博客网 时间:2024/05/22 04:44

其实出现Unknown Source的原因是在编译时没有指定相应的选项,具体可以参见javac -g系列参数的帮助。当通过javac编译时,默认相当于指定-g:source,lines,这样编译出来的class文件中会包含源代码和行号信息;而通过ant编译时,默认相当于指定-g:none,这样编译出来的class文件会比较小,但是不包含任何调试信息,所以出错的时候就会打印出上面的错误堆栈信息。
以下列出了用不同的-g参数编译同一java文件并运行的效果:

-g:none Exception in thread "main" java.lang.RuntimeException        at com.llc.Test.main(Unknown Source)-g:source Exception in thread "main" java.lang.RuntimeException        at com.llc.Test.main(Test.java)-g:source,lines Exception in thread "main" java.lang.RuntimeException        at com.llc.Test.main(Test.java:9)-g:all 或 -g:source,lines,vars 

运行效果等价于-g:source,lines,但是反编译生成的class文件,可以看到局部变量名也能正常的识别出应该根据程序的部署环境来更改编译参数,比如server端的代码应该加上-g:source,lines,以便通过日志文件正确分析。

所以需要在ant配置文件中的javac标签内添加debug属性

<target name="compile" depends="init" description="编译源文件">  <javac srcdir="${src.dir}" destdir="${classes.dir}" source="1.6" target="1.6" debug="true" includeAntRuntime="false">   <classpath refid="compile.classpath" />  </javac> </target>

即可解决上述问题
debuglevel的属性的问题没有深入研究

debug: 当值为true时产生调试信息

debuglevel: 相当于命令行中要追加到 -g 命令行开关后面的关键字列表。这将会被除 modern 和 classic(ver >= 1.2) 以外的所有实现忽略。合法值是 none 或下列关键字的逗号分隔列表:lines、vars 和 source。如果不指定 debuglevel,则默认情况下,将不会在 -g 的后面追加任何关键字。如果不打开 debug,该特性将被忽略。

0 0