总体思路: 我想在 Gradle 和 Java 17(Gradle 7.5、Java 17.0.6)上构建一个简单的注释处理器。并在具有相同设置的另一个项目中使用它。
这是我的代码:
注释处理器项目build.gradle:
plugins {
id 'java'
id 'maven-publish'
}
group 'org.simple.processor'
version '1.0-SNAPSHOT'
repositories {
mavenLocal()
}
publishing {
publications {
maven(MavenPublication) {
}
}
repositories {
mavenLocal()
}
}
compileJava {
options.annotationProcessorPath = configurations.annotationProcessor
}
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
tasks.withType(JavaCompile) {
options.compilerArgs += ["--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED"]
options.compilerArgs += ["--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED"]
options.compilerArgs += ["--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED"]
options.compilerArgs += ["--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED"]
}
注释处理器项目LocalVariableTranslator.class:
public class LocalVariableTranslator extends TreeTranslator {
@Override
public void visitClassDef(JCTree.JCClassDecl tree) {
// simply log something
}
}
注释处理器演示项目build.gradle:
plugins {
id 'java'
}
group 'org.simple.processor'
version '1.0-SNAPSHOT'
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
repositories {
mavenCentral()
mavenLocal()
}
dependencies {
annotationProcessor 'org.simple.processor:simple-processor:1.0-SNAPSHOT'
implementation 'org.simple.processor:simple-processor:1.0-SNAPSHOT'
}
我的处理器代码在某种程度上依赖于内部 Java API,即“com.sun.tools.javac”包,当我尝试构建演示项目时,这会给我带来问题:
任务“:compileJava”执行失败。 超类访问检查失败:类 org.simple.processor.LocalVariableTranslator(在未命名模块 @0x6073770b 中)无法访问类 com.sun.tools.javac.tree.TreeTranslat 或(在模块 jdk.compiler 中)因为模块 jdk.compiler 不会将 com.sun.tools.javac.tree 导出到未命名模块 @0x6073770b
您可以将此代码添加到您的 gradle.properties
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 \
--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED \
--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED \
--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \
--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED \
--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED
用户 Crow 的 answer 有效,但您可能不希望覆盖
org.gradle.jvmargs
,这会影响 整个构建,以实现此结果。
通过 fork JVM 进行编译可以避免影响整个构建。 Groovy DSL 中的示例:
tasks.withType(JavaCompile) {
options.fork = true
options.forkOptions.jvmArgs += [
"--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED",
"--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED",
"--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED",
"--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED",
"--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED",
]
...
}
详细信息请参阅文档: