Почему библиотека Spring Boot не может добавить свои зависимости в путь к классам родительского приложения? - PullRequest
0 голосов
/ 27 февраля 2020

Наша цель - написать библиотеку Spring Boot, от которой может зависеть приложение Spring Boot.

Если эта библиотека включена как зависимость, она предназначена для обслуживания страницы, созданной с использованием шаблона Thymeleaf из контроллера, который он создает.

Для этого наша библиотека по очереди зависит от следующих библиотек Spring:

dependencies {
    implementation 'org.yaml:snakeyaml'
    api 'org.springframework.boot:spring-boot'
    api 'org.springframework.boot:spring-boot-starter'
    api 'org.springframework.boot:spring-boot-starter-web'
    api 'org.springframework.boot:spring-boot-starter-thymeleaf'

    annotationProcessor 'org.projectlombok:lombok'
    compileOnly 'org.projectlombok:lombok'

    testImplementation 'org.assertj:assertj-core:3.9.1'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.thymeleaf:thymeleaf-testing:3.0.4.RELEASE'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.3.1'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.3.1'
}

Наша библиотека jar собирается просто отлично. Однако, когда мы пытаемся протестировать его с помощью демонстрационного проекта, который включает нашу библиотеку в качестве зависимости, контекст приложения не может загрузиться, поскольку код нашей библиотеки больше не может видеть код, от которого он зависит. Сообщение об ошибке выглядит следующим образом:

Caused by: java.lang.ClassNotFoundException: org.thymeleaf.spring5.SpringTemplateEngine
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583) ~[na:na]
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na]
    ... 34 common frames omitted

SpringTemplateEngine - это класс, который должен быть включен в наш путь к классам через зависимость от 'spring-boot-starter-thymeleaf' выше.

Мы играли со скриптом сборки, переключая implementation для api в различных точках, импортируя пакеты напрямую, вместо использования 'starter's, et c.

Одна вещь, которая "решает проблему" это просто импортировать spring-boot-starter-thymeleaf в демонстрационном проекте. Тогда наша библиотека работает без нареканий. Однако это не то, как должны работать зависимости! Наши потребители не должны зависеть от нас плюс наши зависимости, чтобы использовать нашу библиотеку. Мы как-то потерпели неудачу в транзитивности.

  • Как это могло произойти?

  • Чего нам не хватает в работе цепочки зависимостей в Spring Boot Java библиотеки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...