Примитивное приложение Axon, запущенное как FAT JAR, не выполняет автоматическую настройку Axon Beans - PullRequest
2 голосов
/ 18 апреля 2020

ПРОБЛЕМА:

ИССЛЕДОВАНИЕ: На https://gitlab.com/ZonZonZon/simple-axon.git я составил простое приложение Axon , чтобы показать, что JAR-артефакт построен с Gradle-plugin com.github.johnrengelman.shadow не выполняет автоматическую настройку бобов Axon, когда (при запуске в качестве JAR). Хотя он работает нормально под Intellij.

Из проекта root в терминале:

run gradle clean build shadowJar;
java -jar build/simpleaxon.jar;

Stacktrace прилагается здесь . Я ожидаю, что по умолчанию Axon Autocongiguration предоставляет bean-компоненты, такие как CommandBus, Snapshotter и другие.

ВОПРОС: Как автоматически настроить bean-компоненты аксона по умолчанию в толстой банке?

1 Ответ

2 голосов
/ 21 апреля 2020

Итак, мне потребовалось некоторое расследование, чтобы понять, что происходит, но я знаю, в чем проблема. Быстрое замечание, это не вещь, определяемая Axon c, а используемый вами плагин.

Я запустил ваш пример проекта и действительно получил тот же результат; Никакие бобы Аксона никогда не были подключены. Это заставило меня исследовать процесс создания толстой JAR шаг за шагом. Сначала Maven, затем Spring Boot с Maven, затем Gradle с Spring Boot и, наконец, с плагином Shadow, о котором вы тоже говорите. «Проекты, которые требуют использования файлов META-INF, должны добавить this к теневому плагину, и это должно быть задокументировано».

Часть, на которую ссылается this выглядит следующим образом:

import com.github.jengelman.gradle.plugins.shadow.transformers.PropertiesFileTransformer

// Left out all other specifics from your 'build.gradle' file

shadowJar {
    // Required for Spring
    mergeServiceFiles()
    append 'META-INF/spring.handlers'
    append 'META-INF/spring.schemas'
    append 'META-INF/spring.tooling'
    transform(PropertiesFileTransformer) {
        paths = ['META-INF/spring.factories' ]
        mergeStrategy = "append"
    }

    setArchiveFileName("simpleaxon.jar")
    getDestinationDirectory().set(new File(projectDir, "./build"))
}

После добавления этого фрагмента логики c в ваш build.gradle файл я могу запустить ваш пример проекта, как и ожидалось.

...