В настоящее время я пытаюсь реализовать небольшую забавную библиотеку, которая автоматически генерирует классы фикстур во время компиляции с помощью обработки аннотаций: 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, который, кажется, работает. По крайней мере, файл существует как часть сгенерированных классов. Это файл build.gradle, который я использую для fixturize-core.
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. Вот как выглядит мой 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 класс не генерируется, а журнал задачи компиляции показывает, что мой собственный обработчик аннотаций не является частью пути к обработчику аннотаций. Я в некоторой растерянности и надеялся, что кто-нибудь подскажет, что я делаю не так.
Ух ты, это действительно проснулось. Я немного не понимаю, почему, потому что раньше я использовал @AutoService(Processor.class)
, но он не работал. Но я думаю, что на тот момент я еще не добавил annotationProcessor project(":fixturize-core")
в build.gradle игровой площадки. В любом случае, изменение аннотации на @AutoService(Processor.class)
сработало. Спасибо!
Решение проблемы было таким, как slaw предложил в своем комментарии: @AutoService(AbstractProcessor.class)
в классе FixtureProcessor
нужно было вместо @AutoService(Processor.class)
быть @AutoService(AbstractProcessor.class)
. Потом поколение начало работать.
Что произойдет, если вместо этого вы попробуете
@AutoService(Processor.class)
? Интерфейс Процессора — это SPI, а неAbstractProcessor
(класс удобства).