Кастомный Spring Boot Starter не подтягивает нужные зависимости в используемом проекте
Вводные:
Есть кастомный spring-boot стартер на авторизацию, без @SpringBootApplication класса, с классом @AutoConfiguration. В нем объявлено несколько зависимостей (напр. spring-boot-starter-security и др.). Собирается через gradle в .jar файл, публикуется в нексусе.
Другое веб-приложение с бизнес-логикой подключает данный стартер как зависимость в build.gradle файле.
Проблема:
Если в веб-приложении оставить только две зависимости на веб и стартер
implementation "org.springframework.boot:spring-boot-starter-web"
implementation "ru.example:auth-proxy-starter:1.0.1"
То при запуске Main класса будет ошибка - ClassNotFound для какой-нибудь из библиотек, используемых стартером (напр. из spring-security).
Одно из решений которое я вижу (и сейчас отражено в build.gradle файлах) - добавлять все зависимости, которые использует стартер в build.gradle веб-приложение, но это плохой вариант, т.к. например в новой версии стартера потребуется еще одна библиотека, а она не учтена в основном приложении. А также некоторые классы конфигураций спринга и конфигурация из стартера конфликтуют друг с другом.
Я думал, раз есть dependencyManagement секция, то она должна отвечать за то какие библиотеки подтягивать. Но видимо это не совсем так работает? (build.gradle файлы описал ниже)
auth-proxy-starter build.gradle:
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.18'
id 'io.spring.dependency-management' version '1.1.4'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
dependencies {
implementation "org.springframework.boot:spring-boot-starter-security"
implementation "org.springframework.boot:spring-boot-starter-actuator"
implementation "org.springframework.boot:spring-boot-starter-web"
implementation "org.apache.commons:commons-lang3:3.10"
implementation "io.jsonwebtoken:jjwt:0.9.1"
implementation "jakarta.xml.bind:jakarta.xml.bind-api:2.3.3"
implementation "org.glassfish.jaxb:jaxb-runtime:2.3.3"
implementation "io.github.openfeign:feign-jackson:13.2.1"
compileOnly "org.projectlombok:lombok"
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
annotationProcessor "org.projectlombok:lombok"
testImplementation "org.springframework.boot:spring-boot-starter-test"
}
build.gradle веб-приложения
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.18'
id 'io.spring.dependency-management' version '1.1.4'
}
dependencies {
implementation "ru.example:auth-proxy-starter:1.0.1"
implementation "org.springframework.boot:spring-boot-starter-security"
implementation "org.springframework.boot:spring-boot-starter-actuator"
implementation "org.springframework.boot:spring-boot-starter-web"
implementation "org.apache.commons:commons-lang3:3.10"
implementation "io.jsonwebtoken:jjwt:0.9.1"
implementation "jakarta.xml.bind:jakarta.xml.bind-api:2.3.3"
implementation "org.glassfish.jaxb:jaxb-runtime:2.3.3"
implementation "io.github.openfeign:feign-jackson:13.2.1"
compileOnly "org.projectlombok:lombok"
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
annotationProcessor "org.projectlombok:lombok"
testImplementation "org.springframework.boot:spring-boot-starter-test"
}
Ответы (1 шт):
Решил заменой плагина 'java' на 'java-library' и заменой implementation в зависимостях на api
api("org.springframework.boot:spring-boot-starter-security")
api("org.springframework.boot:spring-boot-starter-actuator")
api("org.springframework.boot:spring-boot-starter-web")