Библиотека Java, зависимости которой предоставляются реализацией приложения

Я работаю с Gradle и двумя отдельными проектами, где один проект будет библиотекой, которую я хочу скомпилировать в реализуемую банку, которую можно использовать в другом проекте (приложении), а также в других проектах.

В моей библиотеке я использую Java Boot и некоторые библиотеки Google. Что мне нужно указать в файле Gradle моей библиотеки, чтобы при компиляции Java Boot и другие библиотеки не компилировались в эту банку, увеличивая ее размер?

Мое приложение, реализующее мою библиотечную банку, должно предоставлять эти библиотеки. Нужно ли мне указывать что-то конкретное в моем файле Gradle моего приложения в этом сценарии?

Можете ли вы предоставить более подробную информацию о проекте библиотеки? вы говорите, что у него есть некоторые зависимости от Java Boot (вы имеете в виду SpringBoot?), если да, хотите ли вы упаковать эту библиотеку в исполняемый файл / fatjar SpringBoot с включенной частью зависимостей?

M.Ricciuti 15.05.2019 19:05

Извините, да, я имел в виду весеннюю загрузку

MarvinB 15.05.2019 19:17

В приложение будут включены все необходимые зависимости Spring Boot. Поэтому библиотека не должна «вносить» какие-либо скомпилированные библиотеки Spring Boot в свой скомпилированный код. Библиотека должна будет использовать загрузочный код Spring во время выполнения.

MarvinB 15.05.2019 19:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
348
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете определить зависимости проекта библиотеки как compileOnly:

dependencies {
  compileOnly group: 'com.google.guava', name: 'guava', version: '27.0-jre'
}

Таким образом, ваша зависимость не будет экспортирована и не будет упакована в какие-либо артефакты.

Если вам нужна эта зависимость в тестах, вам также нужно добавить ее в конфигурацию testImplementation.

Спасибо, это именно то, что я искал!

MarvinB 16.05.2019 16:17

Из этой части вашего вопроса:

[...] 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
    }
}

Другие вопросы по теме