compileOnly 'com.sun.tools.javac:compiler:XXX'添加在哪一行
时间: 2024-02-23 10:02:52 浏览: 147
这个取决于你在使用哪种构建工具,如果是使用Gradle构建项目,那么一般情况下,在你的build.gradle文件的dependencies块中添加这行代码即可,例如:
```
dependencies {
compileOnly 'com.sun.tools.javac:compiler:XXX'
// 其他依赖项
}
```
需要注意的是,`XXX`应该被替换为具体的版本号。另外,`compileOnly`是Gradle的一个依赖配置项,表示该依赖项只在编译时使用,而不会被打包到最终的构建产物中。
相关问题
unable to make field private com.sun.tools.javac.processing.javacprocessingenvironment$discoveredprocessors com.sun.tools.javac.processing.javacprocessingenvironment.discoveredprocs accessible: module jdk.compiler does not "opens com.sun.tools.javac.proce
### 回答1:
该错误提示无法访问私有字段com.sun.tools.javac.processing.javacprocessingenvironment$discoveredprocessors com.sun.tools.javac.processing.javacprocessingenvironment.discoveredprocs,因为模块jdk.compiler没有打开com.sun.tools.javac.processing包。
### 回答2:
这是一个关于Java模块化的错误提示。在Java 9之后,Java引入了模块化的概念,可以让开发者更加灵活地控制Java应用程序中的类和资源。但同时也带来了一些新的问题和挑战。
错误提示中提到的问题是无法访问某个类的私有字段,具体来说是无法访问com.sun.tools.javac.processing.javacprocessingenvironment.discoveredprocs这个私有类的discoveredprocessors字段。原因是该字段所在的包com.sun.tools.javac.processing.javacprocessingenvironment是位于模块jdk.compiler中的,而该模块并没有以opens指令打开com.sun.tools.javac.processing.javacprocessingenvironment包,因此其内部的类和字段都无法被其他模块访问或反射。
要解决这个问题,可以有以下几种方法:
1. 在Java命令行参数中加上--add-opens jdk.compiler/com.sun.tools.javac.processing.javacprocessingenvironment=ALL-UNNAMED。这个参数可以强制打开jdk.compiler模块中指定包的反射权限,从而允许访问私有成员。
2. 修改代码,将访问discoveredprocs字段的代码放在同一个模块中,或者将discoveredprocs字段改为public或protected可访问性。这样就可以在同一个模块中直接访问该字段,或者通过继承的方式访问该字段。
3. 将使用该字段的代码移动到一个单独的模块中,并在使用该模块的模块描述文件(module-info.java)中加上对jdk.compiler模块的requires指令,同时添加opens指令打开com.sun.tools.javac.processing.javacprocessingenvironment包。这样就可以访问私有成员了。
总之,在Java模块化中,要清楚每个模块的边界和访问权限,避免出现类似上述的问题。对于无法访问的私有成员,可以采用上述方法解决。
### 回答3:
这个问题产生的原因是因为在JDK9中,Java平台新增了一个模块系统,对于Java应用程序而言,它们现在都运行在一个隔离的模块环境中,每个模块都提供了一组API。
这个问题的具体解决方式是在module-info.java文件中加入如下的配置信息:
```java
opens com.sun.tools.javac.processing to jdk.compiler;
```
这个配置的作用是打开com.sun.tools.javac.processing这个包,并将其提供的类暴露给jdk.compiler这个模块,从而让jdk.compiler模块可以访问处理器这个类。
需要注意的是,这个配置文件只有在classpath中的模块中才能被添加,对于直接运行在命令行上的程序而言,需要将这个配置信息加入到初始的模块路径中。
总的来说,这个问题的解决方式就是通过配置moduel-info.java文件,将相应的包打开,并且将其暴露给相应的模块,从而让相应模块可以访问它。同时,需要注意的是,在JDK9中,所有的Java应用都运行在一个隔离的模块环境中,因此需要特别注意对于类的访问控制。
出现下列问题:ava: java.lang.ExceptionInInitializerError Unable to make field private com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors com.sun.tools.javac.processing.JavacProcessingEnvironment.discoveredProcs accessible: module jdk.compiler does not "opens com.sun.tools.javac.processing" to unnamed module @4f2b12b
这个错误可能是因为您正在使用Java 9或更高版本,而默认情况下这些版本会禁用对未命名模块的反射访问权限。要解决此问题,您可以尝试在运行Java时使用以下参数:
```
--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED
```
如果您正在使用Eclipse或IntelliJ IDEA等IDE,则可以在IDE的启动配置中添加此参数。
如果您使用的是Maven,则可以在pom.xml文件中添加以下配置:
```
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgs>
<arg>--add-opens=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
```
这将向Maven编译器添加参数,以便在编译时添加反射访问权限。
如果以上方法都不起作用,您可以尝试升级您的Java版本或联系Java开发者社区以了解更多帮助。
阅读全文