来源:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javac.html
javac:读取java类和接口定义,并且编译成字节码和.class文件。还可以处理.java源文件和类中的注释。
javac命令格式:javac [ options ] [ sourcefiles ] [ classes] [ @argfiles ]
参数顺序没有要求。
options: 参数选项
sourcefiles: 需要编译的一个或多个源文件,一般为.java后缀名。如果源文件较少,可以直接在命令行指定文件名。
@argfiles: 记录源文件列表的文件。如果需要编译的.java源文件数量多,则将源文件名列在一个文件中,文件名之间用空格或回车行分隔。然后在javac命令行中使用该列表文件名,文件名前冠以@字符。
注1:.java源文件和.class类文件都必须有识别该类的根名。例如,名为MyClass的类将写在名为MyClass.java的源文件中,并被编译为字节码类文件MyClass.class。
注2:内部类定义产生附加的类文件。这些类文件的名称将内部类和外部类的名称结合在一起,例如MyClass$MyInnerClass.class。
注3:缺省情况下,编译器将每个类文件、其源文件放在同一目录中。可以使用-d选项指定为类文件指定目录。
Option选项:
包含标准option选项、非标准option选项。
标准option选项,目前的开发环境支持这些标准选项,将来的版本也将支持它;
非标准option选项是目前的虚拟机实现所特有的,将来可能要有变化。非保准option选项以-x开头。
1、 标准option选项
1.1、路径类:
-cp path 或 -classpath path
指定在哪个路径下查找用户类文件路径(user class path)。此参数覆盖环境变量中的CLASSPATH。如果CLASSPATH、-cp、-classpath都没指定,则 用户类文件 路径(user class path)默认为执行命令的当前路径。(搜索过程参考文尾“Javac搜索类型(type)信息”)
- 如果没有指定-sourcepath选项,还会搜索用户类路径(user class path)来查找源文件。
- 如果没有指定-processorpath选项。还会搜索用户类路径(user class path)来查找源文件。
-sourcepath path
指定搜索 类 或 接口 定义的 源文件 路径。(搜索过程参考文尾“Javac搜索类型(type)信息”)
- 源路径条目在Oracle Solaris上使用冒号(:)分隔,在Windows上使用分号分隔。
- 源文件路径可以是目录、jar归档、zip归档。如果是包,则目录或归档中的路径名中必须包含包名。
- 当通过类路径(user class path)找到的类 的源文件也被找到时,这些类可能会被重新编译。
-d directory
设置编译后.class文件的目录。
- 这个目录需要已经存在,javac不会创建。
- 如果未指定-d directory目录,则javac会把编译后的.class文件放在源文件相同的目录中。
- javac编译后.class文件的存放全部路径是,类目录/包路径/.class文件
- -d选型指定的路径,不会自动添加到 用户类文件 路径 中(user class path)
-s dir
指定生成的源文件存放目录。
- 这个目录需要已经存在,javac不会创建。
- 如果类是包的一部分,那么编译器将源文件放在反映包名的子目录中,并根据需要创建子目录。如:指定-s C:mysrc,该类名为com.mypackage.MyClass,则源文件放在C:mysrccommypackageMyClass.java中。
-processorpath path
指定搜索 注释处理器 路径。如果没有指定本参数,则默认在 用户类文件 路径(user class path)搜索注释处理器。
-Djava.ext.dirs=directories
覆盖已安装扩展的路径(location of installed extensions)
-Djava.endorsed.dirs=directories
覆盖已认可的标准路径(endorsed standards path)
-endorseddirs directories
覆盖已认可的标准路径(endorsed standards path)
-extdirs directories
覆盖 ext目录(扩展类) 路径。本参数如果有多个路径,以:分割。
-bootclasspath bootclasspath
采用指定的 引导类(boot classes) 进行交叉编译。
注1:与用户类文件路径一样,本参数如果有多个路径,以:分割。路径可以是目录、JAR存档或ZIP存档。
1.2 调试信息类
-g
产生所有的debugging信息,包含局部变量(local variables)。默认情况下只产生源文件和行号信息。
-g:none
不产生任何debugging信息。
-g:[kerword list]
只产生指定类型的debugging信息,这些信息由逗号分隔额关键字列表指定。关键字:
- source:源文件debugging信息
- lines:行号debugging信息
- vars:局部变量(local variables)debugging信息。
-nowarn
禁用warning信息。作用同-Xline:none
-werror
发生告警时,停止编译。
1.3 其他
-encoding encoding
设置源文件编码名称,如EUC-JP、UTF-8。
-Joption
把参数内容传递给JVM。如-J-Xms48m
-deprecation
显示已弃用的成员或类的每次使用或重写的说明。如果没有-deprecation选项,javac将显示使用或重写已弃用的成员或类的源文件的摘要。-deprecation选项是-Xlint:deprecation的简写形式。
-implicit:[class, none]
控制javac进行搜索类型(type)时,如果使用源文件,是否把源文件编译成类文件。(参考文尾“Javac搜索类型(type)信息”)
-version
打印javac版本相关信息
-verbose
使用详细输出,包含加载的每个类、编译的每个源文件的详细信息。
-parameters
将构造函数和方法的正式参数名存储在生成的类文件中,以便反射API中的方法java.lang.reflect.Executable.getParameters可以检索到它们。
-proc: [none, only]
控制是否进行注释处理和编译。-proc:none表示不进行注释处理,直接编译。-proc:只做注解处理,不做任何后续编译。
-processor class1 [,class2,class3...]
指定要运行的注释处理器的名称。
2、 交叉编译选项(Cross-Compilation Options)
默认情况下,类是根据javac附带的平台的引导类(bootstrap)和扩展类(extension class)进行编译的。但是,javac也支持交叉编译,即根据不同java平台的引导(bootstrap)和扩展类(extension class)进行编译。在交叉编译时使用-bootclasspath和-extdirs选项非常重要。
-source release
指定编译器可以接受的源代码版本。有效的release值为1.3 1.4 1.5(或5) 1.6(或6) 1.7(或7) 1.8(或8)。
如:指定1.3,表示编译器不接受java 1.3版本后引入的断言、泛型等语言特性。
-target version
生成指定JVM 版本 的类文件。类文件将在指定版本、或更新版本的JVM上运行。有效的version值为1.1 1.2 1.3 1.4 1.5(或5) 1.6(或6) 1.7(或7) 1.8(或8)
-target选项的默认值,依赖与-source选项:
- -source未指定,-target默认值为1.8
- -source为1.2、或1.3,-target默认值为1.4
- -source为1.5、或1.6、或1.7、或1.8,-target默认值为1.8
- -source非如上值,-target默认值与-source值相同。
-bootclasspath bootclasspath
采用指定的 引导类(boot classes) 进行交叉编译。
3、 精简配置文件选项(Compact Profile Option)
精简配置文件是java 8后提供的能力。采用本特性后,java应用程序不再需要完整的java平台,而是可以以较小的占用空间部署和运行。本特性可以缩短从app store下载应用程序的时间;也使基于JRE的java应用程序部署更加精简,在小型设备上也十分有用。
支持的compact profile为compact1、compact2、compact3。编号大的compact profile包含编号小的compact profile中的所有API。
-profile compact
如:javac –profile compact1 hello.java,表示编译时使用Compact1精简配置文件。
- 如果使用compact profile特性,则javac编译源代码时无法使用任何不在指定compact profile中的JavaSE API。
- 可以替代-profile选项、而使用compact profile文件的另一种方式是:采用-bootclasspath选项指定rt.jar文件的路径,rt.jar指定了compact profile文件的映像。但是此方式没有-profile方式易用,-profile方式不需要在编译系统上提供一个compact profile文件映像。
4、 非标准配置文件选型
-Xbootclasspath/p:path
向引导类(bootstrap class)路径添加后缀(suffix)。
-Xbootclasspath/a:path
向引导类(bootstrap class)路径添加前缀(prefix)。
-Xbootclasspath/:path
覆盖引导类(bootstrap class files)文件路径。
-Xdoclint:[-]group][/access]
启用或禁用特定检查组。其中group可取值:accessibility, syntax, reference, html or missing。
-Xdoclint:none
禁用所有检查组。
-Xdoclint:all[/access]
启动所有检查组。
-Xlint
启动所有建议(recommended)的warnings。当前版本中, 建议(recommended)的warnings包含所有可用的warning(available warnings)。
-Xlint:all
启动所有建议(recommended)的warnings。同-Xlint。
-Xlint:none
禁用所有warnings。
-Xlint:name
禁用指定名字的warnings。name可以取如下值:
- cast: 不必要的和多余的强制转换类告警。
- calssfile: 类文件内容相关问题(issues related to class file contents)的告警。
- deprecation: 使用不推荐项相关的告警。比如:java.util.Date.getDay()方法在java 1.1后已不推荐使用,代码中使用了此方法会告警。
- dep-ann: 使用了@deprecated Javadoc comment产生文档,但是没有使用@Deprecated注释时,会报此类告警。
- divzero: 代码存在除0的告警。
- empty: 代码存在if空语句的告警。
- fallthrough: 检查switch case代码块,如case分支中缺少break,导致本case后的case代码块也被执行,会产生本告警。
- finally: try-catch-finally代码块中,finally语句无法正常执行情况下,产生本告警。
- options: javac命令行中关于option选型使用问题的告警。
- overrides: 类中方法重写相关的告警。
- path: javac命令行中指定的路径无效、或目录不存在产生的告警。
- processing: 注释处理器相关的告警。
- rawtypes: 对java原始数据类型操作检查告警。
- Serial: 序列化class缺少serialVersionUID定义。
- static: static关键字使用相关问题的告警。
- try: try代码块相关问题的告警。
- unchecked: java语言规范约束的未检查通过的类型强制转换告警。
- vargars: 方法的参数使用不安全相关的告警。
-Xlint:-name
禁用指定名字的warnings。
-Xmaxerrs number
设置打印的最多errors数量
-Xmaxwarns number
设置打印的最多warnings数量
-Xstdout filename
把编译信息输出到指定文件。默认编译信息保存在System.err
-Xprefer:[newer,source]
配置编译器获取类型(type)信息时,是从源文件获取,还是从源文件、类文件中较新的文件获取。(搜索过程参考文尾“Javac搜索类型(type)信息”)
-Xpkginfo:[always,legacy,nonempty]
控制javac是否是否根据package-info.java文件生成package-info.class。
- always:
- legacy:仅当package-info.java包含注释(annotations)时产生。
- nonempty:仅当package-info.java包含带有RetentionPolicy.CLASS或RetentionPolicy.RUNTIME的注释时,才产生。
-Xprint
用于调试的目的,打印指定类型(specified types)的文本信息。此过程不编译、不做注释处理。
-XprintProcessorInfo
打印注释处理器申请处理的注释的信息。
-XprintRounds
打印初始和后续注释处理的顺序。
5、 命令行参数文件(Command-Line Argument Files)
可以把javac参数放到参数文件中,在命令行通过javac命令指定参数文件进行编译。
参数文件可以包含javac的option选项参数、以及源文件名。文件内的参数可以用空格或换行符分隔。如果文件名包含嵌入的空格,那么将整个文件名放在双引号中。
参数文件中的文件名是相对于执行javac命令的当前目录的,而不是参数文件的位置。参数文件中的文件名列表不允许出现通配符(*) (如指定*.java)。不支持使用@符号递归解释文件。不支持-J选项。
如:
可以创建2个参数文件,options参数文件用于保存javac的option选项、classes参数文件用于保存源文件列表。
使用 javac @options @classes 编辑即可。
附:Javac搜索类型(type)信息:
编译源文件时,编译器需要源文件中使用的、扩展的、继承的所有类、接口的类型(type)信息。这些类型信息并不在命令行指定的源文件中。
此时,编译器会搜索该类型(type)定义的源文件、或类文件。编译器:
- 首先在引导类、扩展类路径中搜索。
- 然后在用户类文件 路径(user class path)下搜索。(用户类文件路径默认为当前目录,也可通过CLASSPATH环境变量、或-cp、或-classpath参数指定。)
- 如果命令行指定了-sourcepath选项,编译器优先从指定的目录中搜索 源文件;否则,编译器从 用户类文件 路径(user class path)同时搜索类文件和源文件。
- 用户可以通过-bootclasspath、-extdirs选型自定义引导类、扩展类路径。
- 搜索结果,可能包含type定义的类文件、或源文件、或两者皆搜索到。如果两者都找到了,通过-Xperfer类指定使用哪个。如果-Xperfer为newer,编译器使用两个文件中较新的;如果-Xperfer为source,编译器使用源文件。
- 如果搜索结果指定使用源文件(不论是只找到了源文件,还是通过-Xperfer选项确定使用源文件),编译器都会读取源文件类获取需要的信息。默认情况下,编译器还会编译此源文件。也可以使用-implicit选型配置是否编译源文件,配置为none,编译器不会为此源文件编译生成类文件;配置为class,则编译器会为此源文件编译生成类文件