Процессор аннотаций Java не запускается во время компиляции

В настоящее время я пытаюсь реализовать небольшую забавную библиотеку, которая автоматически генерирует классы фикстур во время компиляции с помощью обработки аннотаций: 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)? Интерфейс Процессора — это SPI, а не AbstractProcessor (класс удобства).

Slaw 22.07.2024 05:17

Ух ты, это действительно проснулось. Я немного не понимаю, почему, потому что раньше я использовал @AutoService(Processor.class), но он не работал. Но я думаю, что на тот момент я еще не добавил annotationProcessor project(":fixturize-core") в build.gradle игровой площадки. В любом случае, изменение аннотации на @AutoService(Processor.class) сработало. Спасибо!

floydk 22.07.2024 10:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решение проблемы было таким, как slaw предложил в своем комментарии: @AutoService(AbstractProcessor.class) в классе FixtureProcessor нужно было вместо @AutoService(Processor.class) быть @AutoService(AbstractProcessor.class). Потом поколение начало работать.

Другие вопросы по теме