Gradle 注释处理器依赖项

问题描述 投票:0回答:2

总体思路: 我想在 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

java gradle compilation javac annotation-processing
2个回答
1
投票

您可以将此代码添加到您的 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

0
投票

用户 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",
    ]
    ...
}

详细信息请参阅文档:

© www.soinside.com 2019 - 2024. All rights reserved.