У меня есть многопроектная сборка Gradle для собственного Spring Boot Starter.В соответствии с соглашением Spring Boot Starter все мои классы находятся в проекте «автоконфигурации», и у меня есть отдельный «стартовый» проект, который ТОЛЬКО вводит зависимости, необходимые для использования автоконфигурации.
В результате многопроектной сборки2 неиспользуемых фляги, 1 для подпроекта автоконфигурации и один для подпроекта стартера.Мой новый проект, использующий этот стартер, тянет за собой стартовый сосуд, но когда я использую классы из переходных зависимостей, мой проект не может найти их где-либо на пути к классам.
Когда я копался вЯ обнаружил, что все зависимости, которые он определяет, имеют объем RUNTIME, что объясняет проблему.Я могу «исправить» проблему, установив все зависимости в моем начальном модуле как «compile» вместо «реализовать», но я понимаю, что «compile» находится на выходе, и что зависимости «реализации» должны быть в области компиляциитем не мение.Может кто-нибудь сказать мне, какой дополнительный конфиг может потребоваться для определения зависимостей стартера как «реализации» без их определения в качестве «среды выполнения» в получающемся jar-файле?
Мой многопроектный стартер / автоконфигурация root файл Gradle:
plugins {
id 'org.springframework.boot' version '2.1.4.RELEASE' apply false
id 'io.spring.dependency-management' version '1.0.7.RELEASE' apply false
}
wrapper {
gradleVersion = '5.2.1'
}
repositories {
mavenLocal()
// private repo info omitted
mavenCentral()
jcenter()
}
subprojects {
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'maven-publish'
apply plugin: 'java-library'
group = 'com.mystarter'
repositories {
mavenLocal()
// private repo info omitted
mavenCentral()
jcenter()
}
dependencies {
annotationProcessor "org.springframework.boot:spring-boot-autoconfigure-processor"
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
}
bootJar {
enabled = false
}
jar {
enabled = true
}
javadoc {
failOnError = false
options.addStringOption('Xdoclint:none', '-quiet')
}
task sourcesJar(type: Jar) {
from sourceSets.main.allJava
classifier = 'sources'
}
task javadocJar(type: Jar) {
from javadoc
classifier = 'javadoc'
}
publishing {
publications {
myProjStarterArtifacts(MavenPublication) {
from components.java
artifact sourcesJar
artifact javadocJar
}
}
repositories {
// private repo info omitted
}
}
tasks.build.finalizedBy tasks.publishToMavenLocal
}
Мой начальный подпроект файл сборки:
dependencies {
compile project(':myproj-spring-boot-autoconfig')
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.security:spring-security-cas'
implementation 'org.springframework.security:spring-security-ldap'
}
Если я изменю вышеприведенные строки 'реализации' на 'compile'Строки, вот когда результирующий pom-файл перестает делать эти 4 зависимости "областью выполнения" и вместо этого корректно определяет их как "compile".В качестве примечания отметим, что строка 'compile project' работает просто отлично, это просто строки, являющиеся реализацией, которые, кажется, не работают так, как я ожидал, когда у проекта нет собственных классов.
Зависимость моего нового проекта для моего стартера:
dependencies {
implementation('com.myproj:myproj-spring-boot-starter:1.0.0')
// other dependencies
}