Я работаю с Gradle и двумя отдельными проектами, где один проект будет библиотекой, которую я хочу скомпилировать в реализуемую банку, которую можно использовать в другом проекте (приложении), а также в других проектах.
В моей библиотеке я использую Java Boot и некоторые библиотеки Google. Что мне нужно указать в файле Gradle моей библиотеки, чтобы при компиляции Java Boot и другие библиотеки не компилировались в эту банку, увеличивая ее размер?
Мое приложение, реализующее мою библиотечную банку, должно предоставлять эти библиотеки. Нужно ли мне указывать что-то конкретное в моем файле Gradle моего приложения в этом сценарии?
Извините, да, я имел в виду весеннюю загрузку
В приложение будут включены все необходимые зависимости Spring Boot. Поэтому библиотека не должна «вносить» какие-либо скомпилированные библиотеки Spring Boot в свой скомпилированный код. Библиотека должна будет использовать загрузочный код Spring во время выполнения.




Вы можете определить зависимости проекта библиотеки как compileOnly:
dependencies {
compileOnly group: 'com.google.guava', name: 'guava', version: '27.0-jre'
}
Таким образом, ваша зависимость не будет экспортирована и не будет упакована в какие-либо артефакты.
Если вам нужна эта зависимость в тестах, вам также нужно добавить ее в конфигурацию testImplementation.
Спасибо, это именно то, что я искал!
Из этой части вашего вопроса:
[...] the Java Boot and other libraries are not compiled into that jar blowing up its size.
Я понимаю, что вы применили плагин Springboot к своей библиотеке (которая по умолчанию создает толстую банку со всеми включенными зависимостями), в то время как вы просто хотите создать простую/простую библиотеку java.
Если мое предположение верно, самое простое решение — использовать плагин Springboot только для управления зависимостями, фактически не применяя его к вашему проекту, как объяснено здесь.
Вы также должны применить Плагин библиотеки Java для Gradle, чтобы воспользоваться функцией разделения API/реализации.
Пример скрипта сборки для проекта библиотеки:
plugins {
id "java-library"
id "org.springframework.boot" version "2.1.4.RELEASE" apply false // do not apply it
}
apply plugin: "io.spring.dependency-management"
dependencies {
// Spring Boot deps
implementation "org.springframework.boot:spring-boot-starter-web"
// libraries you want to "propagate to consumers
// api group: 'com.google.guava', name: 'guava', version: '23.0'
// libraries you don"t want to flow in consumers projects
// implementation ....
// Test deps
testImplementation "org.springframework.boot:spring-boot-starter-test"
}
dependencyManagement {
imports {
mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES
}
}
Можете ли вы предоставить более подробную информацию о проекте библиотеки? вы говорите, что у него есть некоторые зависимости от Java Boot (вы имеете в виду SpringBoot?), если да, хотите ли вы упаковать эту библиотеку в исполняемый файл / fatjar SpringBoot с включенной частью зависимостей?