其實出現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,該特性將被忽略。