精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-05-30
最后修改:2010-05-30
引子先说一下为什么写这一篇小文章,最近不少同事是在问一个问题,为什么Ant编译出的代码在日志里的出错异常栈看不到行号信息,每次如果在定位问题,都需要用eclipse重新将相应的jar包编译一下,再放到问题环境上重现一下,这样再看日志才可以。而且使用ant生成的包就算是远程调试也不可用,断点总是打不上。
一般的开发都会有一套持续集成的环境,用作每日构建,用ant或是其他工具,开发人员一般用Eclipse或其他的IDE做开发,所以经常会遇见上面的问题。
原因ant的javac任务里有对debug信息输出的设置,不过默认是不输出。
javac中设置调试信息级别的选项为-g,其详细含义如下,英文太简单,偶会详细介绍一下:
![]() public class Main {
public static void main(String[] args) {
Test t = new Test();
t.sayHello();
}
}
class Test
{
public Test() {
}
public void sayHello()
{
int a = 10; // 断点将打在此行
int b = a++;
System.out.println("b:" + b);
String hello = "Test say";
hello += " hello";
System.out.println(hello);
}
}
![]() ![]() 以上javac选项英文描述出自:javac - Java programming language compiler,本文只关注调试信息相关选项,其他可自行参考。
OK,算是介绍完了,相信大家对这几个参数的含义应该也理解了。
另外在最后想说一下:Eclipse编译使用编译器并不是jdk自带的javac,而是Eclipse JDT自己的编译器。虽然本文的演示是用的Eclipse,但对于javac生成类文件时的调试信息选项的含义和用法也是一样的,Eclipse的JDT编译器和javac是兼容的。
如果想了解Eclipes的JDT编译器和javac编译器的不同可以参考以下文档: 这里介绍了一个小例子,说明这两个编译器间的差别。 Java Compiler - Eclipse compiler vs. Sun compiler
这个是Eclipse的帮助里的东东,介绍Eclipse的JDT编译器的使用,(当然你可以通过本地Eclipse的帮助查看) http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.jdt.doc.isv/guide/jdt_api_compile.htm 这里面的编译方法偶在本地试过了,很好用,你也可以试式用JDT的编译器编译个文件试一试。Eclipse 3.5的示例用法如下: D:\Program Files\eclipse\plugins>java -jar org.eclipse.jdt.core_3.5.2.v_981_R35x.jar -d F:\Study\eclipsepro\Study\src\eclipse -g F:\Study\eclipsepro\Study\src\*.java
还有一个参考资料就是《深入java虚拟机》,纸件的,没法贴链接了。嘿嘿 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-05-31
springMVC中的Annotation就大量使用了调试信息,所以如果要选用SpringMVC作为项目框架的话,编译选项中调试信息这几项就不能去掉,否则要报错。
|
|
返回顶楼 | |
发表时间:2010-05-31
icanfly 写道 springMVC中的Annotation就大量使用了调试信息,所以如果要选用SpringMVC作为项目框架的话,编译选项中调试信息这几项就不能去掉,否则要报错。
这个是为什么?能不能详细说一下,看文档说: 引用 annotation 的retention定义了该annotation被保留的时间长短:某些annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在 class文件中;编译在class文件中的annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class 的执行,因为annotation与class在使用上是被分离的)。使用这个meta-annotation可以对annotation的“生命周期” 限制。
个人觉得如果要反射时用,是不是将Annotation只要定义成RUNTIME的就可以了?和编译选项没有关系吧? |
|
返回顶楼 | |
浏览 5314 次