我目前正在尝试实现一个小型有趣的库,它通过使用阳极处理在编译时自动生成固定装置类:https://github.com/floydkretschmar/fixturize/tree/main/fixturize
项目结构是一个非常简单的单一仓库
|-- fixturize
|
|--fixturize-core
|--fixturize-playground
fixturize-core 定义了相关注释以及注释处理器:
@SupportedAnnotationTypes("de.floydkretschmar.fixturize.annotations.Fixture")
@SupportedSourceVersion(SourceVersion.RELEASE_21)
@AutoService(AbstractProcessor.class)
public class FixtureProcessor extends AbstractProcessor {
...
}
如您所见,我正在使用自动服务来生成 META-INF/services/javax.annotation.processing.Processor ,这似乎可以工作。至少该文件作为生成的类的一部分存在。这是我用于 fixturize-core 的 build.gradle 文件
plugins {
id "java"
id "io.freefair.lombok" version "8.6"
}
ext {
nashornVersion = "15.4"
guavaVersion = "33.2.1-jre"
autoServiceVersion = "1.1.1"
junitVersion = "5.10.0"
assertJVersion = "3.25.1"
mockitoVersion = "5.12.0"
compileTestingVersion = "0.21.0"
lombokVersion = "1.18.34"
}
dependencies {
implementation "com.google.auto.service:auto-service:$autoServiceVersion"
annotationProcessor "com.google.auto.service:auto-service:$autoServiceVersion"
implementation "com.google.guava:guava:$guavaVersion"
implementation "org.openjdk.nashorn:nashorn-core:$nashornVersion"
testImplementation platform("org.junit:junit-bom:$junitVersion")
testImplementation "org.junit.jupiter:junit-jupiter"
testImplementation "org.assertj:assertj-core:$assertJVersion"
testImplementation "org.mockito:mockito-junit-jupiter:$mockitoVersion"
testImplementation "com.google.testing.compile:compile-testing:$compileTestingVersion"
testImplementation "org.projectlombok:lombok:$lombokVersion"
}
test {
useJUnitPlatform()
}
现在在fixturize-playground中,我想以确切的方式使用该库,我会在任何其他项目中使用它:导入它,注册注释处理器,然后为所有用@Fixture注释的域对象获取自动生成的fixture类。这就是我的 build.gradle 的样子:
plugins {
id "java"
id "io.freefair.lombok" version "8.6"
}
tasks.withType(JavaCompile) {
doFirst {
println "AnnotationProcessorPath for $name is ${options.getAnnotationProcessorPath().getFiles()}"
}
}
compileJava {
options.annotationProcessorPath = configurations.annotationProcessor
}
dependencies {
implementation project(":fixturize-core")
annotationProcessor project(":fixturize-core")
testImplementation platform('org.junit:junit-bom:5.10.0')
testImplementation 'org.junit.jupiter:junit-jupiter'
}
test {
useJUnitPlatform()
}
还有我带注释的课程:
import de.floydkretschmar.fixturize.annotations.Fixture;
@Fixture
public class Test {
private int field;
}
运行 ./gradlew clean build 时,不会生成任何类,并且编译任务中的日志显示我的自定义注释处理器不是注释处理器路径的一部分。我有点不知所措,我希望有人知道我做错了什么。
问题的解决方案正如 slaw 在他的评论中提出的:
@AutoService(AbstractProcessor.class)
类中的 FixtureProcessor
需要改为 @AutoService(Processor.class)
。然后这一代人开始工作。