Module jdk.compiler


module jdk.compiler
定义了系统Java编译器及其命令行等效项,javac

com.sun.source.*包提供了编译器树API:用于访问表示Java源代码和文档注释的抽象树(AST)的API,被javacjavadoc和相关工具使用。

javac

该模块通过ToolProviderTool服务提供者接口(SPI)提供了对javac的命令行访问等效项,并通过JavaCompiler SPI提供了更灵活的访问方式。

可以通过调用ToolProvider.findFirst或使用名称"javac"调用服务加载器来获取工具的实例。

此外,从JavaCompiler获取的JavaCompiler.CompilationTask实例可以向下转型为javac的低级方面,例如抽象语法树(AST)的访问。

该模块使用FileSystemProvider API来定位文件系统提供者。特别是,这意味着如果编译器要能够读取JAR文件,则必须提供JAR文件系统提供者,例如在jdk.zipfs模块中的提供者。

选项和环境变量

javac支持的所有选项和环境变量集合在javac工具指南中列出。但是,当通过其API调用编译器时存在一些限制。
  • -J选项不受支持。任何必要的VM选项必须在调用API时设置在VM中。如果在通过JavaCompiler API调用工具时使用了该选项,将抛出IllegalArgumentException;如果在通过ToolProvider或传统的Main API调用javac时使用了该选项,将报告错误。

  • "classpath通配符"功能不受支持。该功能仅由本机启动器支持。通过API调用工具时,所有必要的jar文件应直接包含在--class-path选项中,或者CLASSPATH环境变量中。通过API调用工具时,类路径的所有组件将被逐字接受,并且如果没有匹配的目录或文件,则将被忽略。可以使用-Xlint:paths选项生成有关缺失组件的警告。

JavaCompiler接口调用编译器时,以下限制适用。
  • 不支持参数文件(称为@-files)。在通过此API调用工具时,任何此类文件的内容应直接包含在提供的选项列表中。如果在通过此API调用工具时使用了该选项,将抛出IllegalArgumentException

  • 不支持环境变量JDK_JAVAC_OPTIONS。在调用API时,应将环境变量中定义的任何选项直接包含在提供的选项列表中;环境变量中的任何值将被忽略。

  • 仅用于获取信息的选项(例如--help--help-extended--version--full-version)不受支持。如果通过此API调用工具时使用了这些选项中的任何一个,将抛出IllegalArgumentException

  • 与路径相关的选项取决于调用JavaCompiler.getTask(java.io.Writer, javax.tools.JavaFileManager, javax.tools.DiagnosticListener<? super javax.tools.JavaFileObject>, java.lang.Iterable<java.lang.String>, java.lang.Iterable<java.lang.String>, java.lang.Iterable<? extends javax.tools.JavaFileObject>)时使用的文件管理器。当使用默认文件管理器或从其派生的文件管理器时,"标准"选项,例如--class-path--module-path等在使用时可用。当使用不同的文件管理器时,这些选项可能不可用,可能有不同的选项可用。如果在通过此API调用工具时使用了工具或文件管理器不知道的选项,将抛出IllegalArgumentException
请注意,通过其API调用编译器时,CLASSPATH环境变量被尊重,尽管不建议这样使用。一旦启动了VM,环境变量就无法取消设置,因此建议确保在启动将用于调用编译器的VM时不设置环境变量。但是,如果已设置了值,则可以通过在调用编译器时使用--class-path选项或在通过JavaCompiler接口调用编译器时在文件管理器中设置StandardLocation.CLASS_PATH来覆盖任何此类值。

SuppressWarnings

JLS 9.6.4.5指定了可用于抑制Java编译器可能生成的警告的一些字符串。此外,javac还支持其他可用于抑制其他类型警告的字符串。以下表格列出了所有可用于@SuppressWarnings的字符串。
SuppressWarnings支持的字符串
字符串 抑制关于...的警告
auxiliaryclass 源文件中隐藏的辅助类,用于其他文件中使用
cast 不必要的强制类型转换的使用
classfile 与类文件内容相关的问题
deprecation 使用已弃用的项目
dep-ann 在文档注释中标记为已弃用但未使用@Deprecated注解的项目
divzero 通过常量整数0进行除法
empty if后的空语句
exports 与模块导出相关的问题
fallthrough 从一个switch语句的一个case穿透到下一个case
finally 不正常终止的finally子句
lossy-conversions 复合赋值中可能存在的损失转换
missing-explicit-ctor 导出包中公共和受保护类中缺少显式构造函数
module 与模块系统相关的问题
opens 与模块打开相关的问题
overloads 与方法重载相关的问题
overrides 与方法覆盖相关的问题
path 命令行上的无效路径元素
preview 使用预览语言特性
rawtypes 使用原始类型
removal 使用已标记为移除的API
requires-automatic requires子句中使用自动模块
requires-transitive-automatic requires transitive中的自动模块
serial 没有serialVersionUID字段的Serializable类,或SerializableExternalizable类和接口中的其他可疑声明
static 使用实例访问静态成员
strictfp 不必要使用strictfp修饰符
synchronization 在基于值的类的实例上尝试同步
text-blocks 文本块缩进中不一致的空格字符
this-escape 超类构造函数在子类初始化之前泄漏this
try try块的使用相关的问题(即,try-with-resources)
unchecked 未经检查的操作
varargs 潜在不安全的可变参数方法
doclint:accessibility 在文档注释中发现的可访问性问题
doclint:all 在文档注释中发现的所有问题
doclint:html 在文档注释中发现的HTML问题
doclint:missing 文档注释中缺少的项目
doclint:reference 在文档注释中发现的引用问题
doclint:syntax 在文档注释中发现的语法问题
模块图:
jdk.compiler的模块图jdk.compiler的模块图
工具指南:
javac
自JDK版本:
9