Наша цель - написать библиотеку 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
в демонстрационном проекте. Тогда наша библиотека работает без нареканий. Однако это не то, как должны работать зависимости! Наши потребители не должны зависеть от нас плюс наши зависимости, чтобы использовать нашу библиотеку. Мы как-то потерпели неудачу в транзитивности.