Javac命令详解

命令行

用法: javac <options> <source files>
其中, 可能的选项包括:
  -g                         生成所有调试信息
  -g:none                    不生成任何调试信息
  -g:{lines,vars,source}     只生成某些调试信息
  -nowarn                    不生成任何警告
  -verbose                   输出有关编译器正在执行的操作的消息
  -deprecation               输出使用已过时的 API 的源位置
  -classpath <路径>            指定查找用户类文件和注释处理程序的位置
  -cp <路径>                   指定查找用户类文件和注释处理程序的位置
  -sourcepath <路径>           指定查找输入源文件的位置
  -bootclasspath <路径>        覆盖引导类文件的位置
  -extdirs <目录>              覆盖所安装扩展的位置
  -endorseddirs <目录>         覆盖签名的标准路径的位置
  -proc:{none,only}          控制是否执行注释处理和/或编译。
  -processor <class1>[,<class2>,<class3>...] 要运行的注释处理程序的名称; 绕过默认的搜索进程
  -processorpath <路径>        指定查找注释处理程序的位置
  -d <目录>                    指定放置生成的类文件的位置
  -s <目录>                    指定放置生成的源文件的位置
  -implicit:{none,class}     指定是否为隐式引用文件生成类文件
  -encoding <编码>             指定源文件使用的字符编码
  -source <发行版>              提供与指定发行版的源兼容性
  -target <发行版>              生成特定 VM 版本的类文件
  -version                   版本信息
  -help                      输出标准选项的提要
  -A关键字[=]                  传递给注释处理程序的选项
  -X                         输出非标准选项的提要
  -J<标记>                     直接将 <标记> 传递给运行时系统
  -Werror                    出现警告时终止编译
  @<文件名>                     从文件读取选项和文件名(多个Java文件写在此文件中)

参数说明

-g

  • -g:在生成的class文件中包含所有调试信息(行号、变量、源文件)
  • -g:none :在生成的class文件中不包含任何调试信息。

这个参数在javac编译中是看不到什么作用的,因为调试信息都在class文件中,而我们看不懂这个class文件。

为了看出这个参数的作用,在IDE中进行debug实验。

  • 加入“断点”,这个是靠-g:lines起作用,如果不记录行号,则不能加断点。
  • 在“variables”窗口中查看当前的变量,如下图所示,这是靠-g:vars起作用,否则不能查看变量信息。
  • 在多个文件之间来回调用,比如 A.java的main()方法中调用了B.java的fun()函数,而我想看看程序进入fun()后的状态,这是靠-g:source,如果没有这个参数,则不能查看B.java的源代码。

image-20230215171748068

-bootclasspath、-extdirs

-bootclasspath-extdirs 几乎不需要用的,因为他是用来改变 “引导类”和“扩展类”。

  • 引导类(组成Java平台的类):${JAVA_HOME}\jdkk1.7.0_25\jre\lib\rt.jar等,用-bootclasspath设置。
  • 扩展类:${JAVA_HOME}\jdk1.7.0_25\jre\lib\ext目录中的文件,用-extdirs设置。
  • 用户自定义类:用-classpath设置。

-sourcepath和-classpath(-cp)

  • -classpath(-cp)指定你依赖的类的class文件的查找位置。在Linux中,用“:”分隔classpath,而在windows中,用“;”分隔。
  • -sourcepath指定你依赖的类的java文件的查找位置。

如果依赖的类,既找到了.class文件,也找到了.java文件。则

  • 内容一致,使用.class文件
  • 内容不一致,使用.java文件,重新编译。

-proc:、-procpath、-processor

这3个参数是用来自定义“Annotation Processor”的。

  • -processor <CustomProcessor> :自定义注解处理器的类
  • -procpath:注解处理器的查找目录。
  • -proc:only:只运行注解处理器,而不编译源文件。
  • -proc:none:不使用注解处理器,只编译源文件。一般在Processor项目中,使用这个。