是否觉得下面的异常非常眼熟呢?
Exception in thread "main" java.lang.RuntimeException
at Test.main(Unknown Source)
当通过日志文件分析异常原因时,Unknown Source通常比较令人郁闷,郁闷程度与出错方法中行数成正比。
其实出现Unknown Source的原因是在编译时没有指定相应的选项,具体可以参见javac -g系列参数的帮助。当通过javac编译时,默认相当于指定-g:source,lines,这样编译出来的class文件中会包含源代码和行号信息;而通过ant编译时,默认相当于指定-g:none,这样编译出来的class文件会比较小,但是不包含任何调试信息,所以出错的时候就会打印出上面的错误堆栈信息。
如果要改变ant javac task的编译效果,可以更改其debug和debuglevel属性,参见:http://ant.apache.org/manual/CoreTasks/javac.html。
以下列出了用不同的-g参数编译同一java文件并运行的效果:
-g:none
Exception in thread "main" java.lang.RuntimeException
at Test.main(Unknown Source)
-g:source
Exception in thread "main" java.lang.RuntimeException
at Test.main(Test.java)
-g:source,lines
Exception in thread "main" java.lang.RuntimeException
at Test.main(Test.java:4)
-g:all 或 -g:source,lines,vars
运行效果等价于-g:source,lines,但是反编译生成的class文件,可以看到局部变量名也能正常的识别出应该根据程序的部署环境来更改编译参数,比如server端的代码应该加上-g:source,lines,以便通过日志文件正确分析。
Exception in thread "main" java.lang.RuntimeException
at Test.main(Unknown Source)
当通过日志文件分析异常原因时,Unknown Source通常比较令人郁闷,郁闷程度与出错方法中行数成正比。
其实出现Unknown Source的原因是在编译时没有指定相应的选项,具体可以参见javac -g系列参数的帮助。当通过javac编译时,默认相当于指定-g:source,lines,这样编译出来的class文件中会包含源代码和行号信息;而通过ant编译时,默认相当于指定-g:none,这样编译出来的class文件会比较小,但是不包含任何调试信息,所以出错的时候就会打印出上面的错误堆栈信息。
如果要改变ant javac task的编译效果,可以更改其debug和debuglevel属性,参见:http://ant.apache.org/manual/CoreTasks/javac.html。
以下列出了用不同的-g参数编译同一java文件并运行的效果:
-g:none
Exception in thread "main" java.lang.RuntimeException
at Test.main(Unknown Source)
-g:source
Exception in thread "main" java.lang.RuntimeException
at Test.main(Test.java)
-g:source,lines
Exception in thread "main" java.lang.RuntimeException
at Test.main(Test.java:4)
-g:all 或 -g:source,lines,vars
运行效果等价于-g:source,lines,但是反编译生成的class文件,可以看到局部变量名也能正常的识别出应该根据程序的部署环境来更改编译参数,比如server端的代码应该加上-g:source,lines,以便通过日志文件正确分析。
ant javac Unknown Source 问题
版权信息: 可以任意转载, 转载时请务必以超链接形式标明文章原文出处, 即下面的声明.
原文出处:http://blog.chenlb.com/2009/03/ant-javac-unknown-source.html
项目中,我一般用ant编译打包,然后放到服务器中运行。但运行时候可能会有错误,抛出异常时看不到代码在几行出问题,这个比较郁闷,还用使用行的javac编译再打包的不会,当然eclipse导出的也不会。还是解决下ant javac Unknown Source的问题吧。
找到几个资源:http://www.lslnet.com/linux/f/docs1/i28/big5226734.htm , http://www.jguru.com/faq/view.jsp?EID=1122360
说用
- <javac srcdir="src" destdir="target/classes"
- debug="true" debuglevel="lines, vars, source">
- ...
- </javac>
java 测试下:
- package com.chenlb;
- public class Test {
- /**
- * ant javac Unknown Source
- */
- public static void main(String[] args) {
- //ArrayIndexOutOfBoundsException
- String str = args[0];
- System.out.println(str);
- }
- }
运行:
- E:\workspace\build>java -cp .;unknown-source-0.1.jar com.chenlb.Test
- Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
- at com.chenlb.Test.main(Unknown Source)
但是我用了了还是出现 Unknown Source。
后来把debuglevel去了,只保留debug,就可以了,debuglevel 加了不会想来想去不明白,试一下改为lines,vars,source即是把空格去了。就行了。
最终的:
- <target name="compile" depends="init">
- <javac srcdir="${src.java.dir}" destdir="${build.java.dir}"
- debug="true" debuglevel="lines,source"
- encoding="GBK" source="1.6" target="1.6">
- <classpath refid="project.classpath" />
- </javac>
- </target>
出现:
- E:\workspace\build>java -cp .;unknown-source-0.1.jar com.chenlb.Test
- Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
- at com.chenlb.Test.main(Test.java:10)
相关推荐
NULL 博文链接:https://rooi.iteye.com/blog/1164734
javac-source-code-reading:javac源码调试
javac 源码 javac 源码 javac 源码
org.apache.tools.ant.taskdefs.Javac org.apache.tools.ant.taskdefs.Jikes org.apache.tools.ant.taskdefs.Mkdir org.apache.tools.ant.taskdefs.Patch org.apache.tools.ant.taskdefs.Sleep org.apache....
包含文档和项目实例。 用Ant实现Java项目的自动构建和部署。...1.利用Ant的javac任务来编译java程序 2.使用Ant的java任务运行Java程序 3.使用Ant的jar任务生成jar文件 4.使用Ant的war任务打包J2EE Web项目 五.总结
4. 当设置jocky的enable属性为true时,此时,Ant脚本中的javac编译命令,便会被自动替换成Jocky编译器;当设置enable属性为false时,javac编译命令将恢复成正常设置 二、jocky for eclipse 1. 将org.apusic.jocky_...
NULL 博文链接:https://1342912960.iteye.com/blog/2235268
javac 源代码 javac 源代码 javac 源代码 javac 源代码 javac 源代码
jdk7 javac源码
关于javac命令的一些细节,import、package等关键字,classpath选项。不用IDE时怎么组织代码进行编译
javac源码免费下载,欢迎大家下载学习。
java编译的javac.jar
分析如下:Ant的debug和debuglevel参数会去调用JDK的javac -g参数, 而-g参数又包含3个选项, -g:{lines,vars,source},分别代表编译时向字节码中写入行号、方法局部变量信息、关联源代码信息。 这里主要说说-g:var...
jdk安装检验,java能执行,javac不能执行的原因
ant例子说明 (先下载并解压ant,并将ant的bin目录放到系统变量中.cmd运行测试... 本例子写了delete,mkdir,javac,jar,java这几个最常用的命令。 参看本例子后,相信马上可以摆脱IDE的限制,自己布署web/桌面的java程序.
虽然ANT可调用的外部应用种类非常丰富,但其实最常用的就2,3个:比如javac javadoc jar等。 Ant的优点 Ant是Apache软件基金会JAKARTA目录中的一个子项目,它有以下的优点。 跨平台性。Ant是纯Java语言编写的,所...
解决javac 不是内部或外部命令问题 javac 命令
ant打包时编码 GBK 的不可映射字符 原因:这个主要是因为我们在写代码的时候加入了一些中文注释,而导致编译时候...解决方式:要处理这个问题,仅仅只需要在 build.xml文件中的调用javac的所有地方加入encoding的参数。
linux下 Error running javac compiler