<javac>任务和javac命令是相似,它编译两种类型的java文件1)没有被编译的java文件2)曾经编译过,但是class文件版本和当前对应的java文件版本不匹配的java文件。
1)javac命令支持的参数:
Attributes Description
srcdir :必须的,除非嵌套有<src>标签。包含源文件的文件夹
bootclasspath:编译过程中需要导入class文件会被导入
bootclasspathref:编译过程中需要引用的class文件夹目录
classpath:The class path to use. 文件夹中class会被导入的jar包
classpathref:文件夹中class文件会被引用的jar包
compiler :指定要使用的编译器。如果未设置该特性,将使用 build.compiler 属性的值(如果设置)。否则,将使用当前 VM 的默认编译器。
例子:设置环境变量 JIKESHOME 为 jikes 的路径
设置 ANT_OPTS=-Dbuild.compiler=jikes
将 jikes 路径添加到系统 PATH 中
然后在所有的ant任务就默认使用 jikes 了, 如果你想在单个工程中使用 ant, 就不要添加 ANT_OPTS 环境变量, 只需要修改 build.xml 中 javac 标签中的 compiler 为 jikes
debug:当值未为true时产生调试信息
debuglevel:相当于命令行中要追加到 -g 命令行开关后面的关键字列表。这将会被除 modern 和 classic(ver >= 1.2) 以外的所有实现忽略。合法值是 none 或下列关键字的逗号分隔列表:lines、vars 和 source。如果不指定 debuglevel,则默认情况下,将不会在 -g 的后面追加任何关键字。如果不打开 debug,该特性将被忽略。
depend:这个任务依赖的任务。当运行这个任务时,首先按照顺序依次执行完依赖的任务,如果出错将停止执行
deprecation: 假如为真,将会给出不建议使用的API,默认值false
destdir: 编译后文件存放的目标文件夹,默认是当前文件夹。
encoding:指定编码格式
excludes :必须排除的文件模式的列表,以逗号或空格分隔。如果忽略,将不会排除任何文件(默认排除的文件除外)。
excludesfile: 该文件的每一行都将作为一个 exclude 模式。
extdirs: Specifies an alternative location of installed extensions that overrides the default.
failonerror: 指定 clientgen Ant 任务在出现错误的情况下是否继续执行。此特性的有效值为 True 或 False。默认值为 True,这意味着即使遇到错误也要继续执行。
fork: 为true时在外部启用一个新的JDK 编译器进程执行编译。默认值是true,应用在需要配置编译器运行时环境时
includeantruntime :指出是否应在类路径中包括 Ant 运行时程序库,默认为 yes。
includejavaruntime: 指出是否应在类路径中包括来自执行 VM 的默认运行时程序库,默认为 no。
includes: 必须包括的文件模式的列表,以逗号或空格分隔。如果忽略,将包括所有文件。
includesfile: 文件名。该文件的每一行都将作为一个 include 模式。
listfiles: 为真时显示被编译文件列表,默认为false
memoryinitialsize 如果 javac 在外部运行,则是底层 VM 的初始内存大小;否则将被忽略。默认为标准 VM 内存设置。(例如:83886080、81920k 或 80m)
memorymaximumsize: 如果 javac 在外部运行,则是底层 VM 的最大内存大小;否则将被忽略。默认为标准 VM 内存设置。(例如:83886080、81920k 或 80m)
nowarn: 为真时将忽略所有警告信息
optimize: 指出是否应该用优化方式编译源代码,默认为 off。
source: 假如设置为1.4,将激活断言。默认是1.3
sourcepath: 指定源资源文件夹。默认指向srcdir
sourcepathref: 指定你想引用资源
target: Specifies the VM version to generate class files for (for example, 1.1 or 1.3).
verbose: 控制生成消息的输出量。
1)javac命令支持的参数:
Attributes Description
srcdir
bootclasspath:编译过程中需要导入class文件会被导入
bootclasspathref:编译过程中需要引用的class文件夹目录
classpath:The class path to use. 文件夹中class会被导入的jar包
classpathref:文件夹中class文件会被引用的jar包
compiler :指定要使用的编译器。如果未设置该特性,将使用 build.compiler 属性的值(如果设置)。否则,将使用当前 VM 的默认编译器。
例子:设置环境变量 JIKESHOME 为 jikes 的路径
设置 ANT_OPTS=-Dbuild.compiler=jikes
将 jikes 路径添加到系统 PATH 中
然后在所有的ant任务就默认使用 jikes 了, 如果你想在单个工程中使用
debug:当值未为true时产生调试信息
debuglevel:相当于命令行中要追加到 -g 命令行开关后面的关键字列表。这将会被除 modern 和 classic(ver >= 1.2) 以外的所有实现忽略。合法值是 none 或下列关键字的逗号分隔列表:lines、vars 和 source。如果不指定
depend:这个任务依赖的任务。当运行这个任务时,首先按照顺序依次执行完依赖的任务,如果出错将停止执行
deprecation: 假如为真,将会给出不建议使用的API,默认值false
destdir: 编译后文件存放的目标文件夹,默认是当前文件夹。
encoding:指定编码格式
excludes :必须排除的文件模式的列表,以逗号或空格分隔。如果忽略,将不会排除任何文件(默认排除的文件除外)。
excludesfile: 该文件的每一行都将作为一个 exclude 模式。
extdirs: Specifies an alternative location of installed extensions that overrides the default.
failonerror: 指定 clientgen
fork: 为true时在外部启用一个新的JDK 编译器进程执行编译。默认值是true,应用在需要配置编译器运行时环境时
includeantruntime :指出是否应在类路径中包括
includejavaruntime: 指出是否应在类路径中包括来自执行 VM 的默认运行时程序库,默认为 no。
includes: 必须包括的文件模式的列表,以逗号或空格分隔。如果忽略,将包括所有文件。
includesfile: 文件名。该文件的每一行都将作为一个 include 模式。
listfiles: 为真时显示被编译文件列表,默认为false
memoryinitialsize 如果 javac 在外部运行,则是底层 VM 的初始内存大小;否则将被忽略。默认为标准 VM 内存设置。(例如:83886080、81920k 或 80m)
memorymaximumsize: 如果 javac 在外部运行,则是底层 VM 的最大内存大小;否则将被忽略。默认为标准 VM 内存设置。(例如:83886080、81920k 或 80m)
nowarn: 为真时将忽略所有警告信息
optimize: 指出是否应该用优化方式编译源代码,默认为 off。
source: 假如设置为1.4,将激活断言。默认是1.3
sourcepath: 指定源资源文件夹。默认指向srcdir
sourcepathref: 指定你想引用资源
target: Specifies the VM version to generate class files for (for example, 1.1 or 1.3).
verbose: 控制生成消息的输出量。
当通过日志文件分析异常原因时,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,以便通过日志文件正确分析。
其实出现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
-g:source
Exception in thread "main" java.lang.RuntimeException
-g:source,lines
Exception in thread "main" java.lang.RuntimeException
-g:all 或 -g:source,lines,vars
运行效果等价于-g:source,lines,但是反编译生成的class文件,可以看到局部变量名也能正常的识别出应该根据程序的部署环境来更改编译参数,比如server端的代码应该加上-g:source,lines,以便通过日志文件正确分析。
下面是一个实际使用的例子部分代码:
<target name="compile" depends="copyresources" description="编译源文件">
<echo>编译源文件 </echo>
<javac srcdir="${app.home}" executable="C:\Program Files\Java\jdk1.7.0_03\bin\javac" destdir="${web.dir}/WEB-INF/classes"
<compilerarg line=" -g:source,lines,vars -encoding UTF-8 " />
</javac>
</target>
<echo>编译源文件 </echo>
<javac srcdir="${app.home}" executable="C:\Program Files\Java\jdk1.7.0_03\bin\javac" destdir="${web.dir}/WEB-INF/classes"
<compilerarg line=" -g:source,lines,vars -encoding UTF-8 " />
</javac>
</target>