Зависимости в Gradle — это прямые зависимости, зависимости проекта и локальные зависимости jar.
В Gradle управление зависимостями является очень важной частью, которая позволяет вам указывать различные библиотеки и модули, необходимые вашему проекту. В вашем случае упоминаются три распространенных типа зависимостей: зависимости проекта, локальные зависимости JAR и прямые зависимости из удаленных репозиториев. Ниже я объясню эти три типа зависимостей соответственно и предоставлю соответствующие методы настройки.
Прямые зависимости — это зависимости, полученные из удаленных репозиториев (например, Maven Central). В Gradle вы можете объявить эти зависимости напрямую по координатам, следующим образом:
dependencies {
// Прямая Сокращенная форма зависимостииз
implementation 'cn.hutool:hutool-all:5.8.27'
// Прямая зависимостьиз полной формы
iimplementation group: 'cn.hutool', name: 'hutool-all', version: '5.8.27'
}
существоватьMavenизpom.xml
в файле,Это эквивалентно:
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.27</version>
</dependency>
</dependencies>
существоватьGradleсередина,implementation
даполагаться Конфигурация№1,это эквивалентноMavenсерединаизcompile
делатьиспользоватьдомен。
Под зависимостью проекта подразумевается существование в многомодульном проекте.,Один модуль зависит от другого модуля. существованиеGradle,ты можешь сделатьиспользоватьproject
метод объявить этополагаться,Как показано ниже:
dependencies {
// Зависимости проекта
implementation project(':subject01')
}
существоватьsettings.gradle
в файле,Вам нужен подмодуль Конфигурация по пути,чтобы Gradle их распознал:
rootProject.name = 'root'
include 'subject01' // Содержит подмодуль с именем дляsubject01iz.
Локальные файлы JAR относятся к файлу JAR, который напрямую ссылается на каталог используемого проекта. существованиеGradle,ты можешь сделатьиспользоватьfiles
методилиfileTree
методобъявить об этомполагаться:
dependencies {
// Прямая зависимостьидентификацияизJARдокумент implementation files('libs/foo.jar', 'libs/bar.jar')
// Конфигурация папки как элемента дляполагаться, автоматически включает все файлы JAR в папку.
implementation fileTree(dir: 'libs', include: ['*.jar'])
}
делатьиспользоватьfileTree
методчас,Gradle автоматически включит все файлы JAR в указанный каталог как можнополагаться.
Для каждого типа зависимостей существуют свои применимые сценарии, и вы можете выбрать подходящий метод управления зависимостями в соответствии с конкретными потребностями проекта.
Когда команда сборки будет выполнена, gradle загрузит соответствующий Jar из настроенного хранилища зависимостей и применит его к проекту.
Подобно тегу области Maven, gradle также предоставляет типы зависимостей, как показано ниже:
Варианты конфигурации | описывать | Применимые плагины |
---|---|---|
compileOnly | Зависимости, которые необходимы во время компиляции, но не упаковываются. Был кратко назван предоставленным. | Java |
runtimeOnly | Зависимости, которые необходимы во время выполнения, но не требуются во время компиляции, например драйверы базы данных. | Java |
implementation | Зависимости, необходимые как для компиляции, так и для среды выполнения. | Java |
testCompileOnly | Зависимости используются только для компиляции и тестирования и не требуются во время выполнения. | Java |
testRuntimeOnly | Зависимости необходимы только при запуске тестов. | Java |
testImplementation | Для зависимостей тестового кода замените testCompile в старой версии. | Java |
providedCompile | Плагин WAR предназначен для компиляции и тестирования, а среда выполнения предоставляется контейнером. | WAR |
compile | Он был удален в Gradle 7.0. Первоначально он представлял собой зависимость, необходимую как во время компиляции, так и во время упаковки. | Ява (удалено) |
runtime | Он был удален в Gradle 7.0. Первоначально он представлял собой зависимость, необходимую для запуска и тестирования. | Ява (удалено) |
api | Зависимости, которые необходимы как во время компиляции, так и во время выполнения и могут транзитивно экспортироваться пользователями. | java-library |
compileOnlyApi | Зависимости, которые необходимы только во время компиляции, а не во время выполнения, могут быть транзитивно экспортированы пользователем. | java-library |
пожалуйста, обрати внимание,compile
иruntime
Варианты конфигурациисуществоватьGradle 7.0серединабыл удален,рекомендоватьделатьиспользоватьimplementation
иruntimeOnly
делатьдлязаменять。также,api
иcompileOnlyApi
даjava-library
плагинпоставлятьиз,use используется для более детального управления отношениями между модулями.
Официальная ссылка на документ: https://docs.gradle.org/current/userguide/java_library_plugin.html#java_library_plugin: Отношения и описания каждой области зависимостей https://docs.gradle.org/current/userguide/upgrading_version_6.html#sec:configuration_removal : Обновление и удаление области зависимостей https://docs.gradle.org/current/userguide/java_library_plugin.html#java_library_plugin:API и implemention разница https://docs.gradle.org/current/userguide/java_plugin.html#java_plugin: осуществлять java Какие зависимости используются в команде.
намекать:java Функции, предоставляемые плагинами, java-библиотекой Плагины предоставляются
Вот что вы можете предложить о Gradle конфигурацииapi
иimplementation
изсравнительная таблица,Я оптимизировал и систематизировал это:
Особенности/Сценарии | apiВарианты конфигурации | implementationВарианты конфигурации |
---|---|---|
время компиляции | - Зависимости могут передаваться пользователям модуля. | — Зависимости не передаются пользователям модуля. |
— При изменении базовых зависимостей все модули, которые зависят от этих базовых зависимостей, необходимо перекомпилировать, что может привести к замедлению скорости компиляции. | - При изменении базовых зависимостей необходимо перекомпилировать только те модули, которые напрямую зависят от этих базовых зависимостей, а скорость компиляции относительно высокая. | |
время выполнения | - Будут загружены все классы модуля. | - Будут загружены все классы модуля. |
Сценарии применения | - Подходит для многомодульных проектов, особенно если вы хотите избежать повторных зависимостей от одного и того же модуля. | — Используется в большинстве случаев, особенно если вы не хотите, чтобы зависимости передавались потребителям модуля. |
api
иimplementation
даGradleсерединачастоиспользоватьиз Два видаполагаться Варианты конфигурации,онисуществоватьвремя компиляцииивремя выполненияиз ХОРОШОдлядругой。api
Варианты конфигурациипозволятьполагатьсяпередача,Этот существующий мультимодуль из проекта очень полезен.,Можно гарантировать, что модульизполагатьсяреляционная согласованность。иimplementation
Варианты конфигурациине будетполагатьсяпередача Даватьделатьиспользовать ВОЗ,Такое существование в большинстве случаев рекомендуется использоватьиз,Потому что для этого можно сократить ненужные изполагаться при прохождении,Тем самым повышая эффективность строительства объекта.
Ниже приводится подробное объяснение двух типов опор и их различных эффектов:
api
опираться, когда изменения в содержании вызовут все прямые и косвенные предположения, которые он проектирует. (например, libA и projectX) необходимо переустановить. Это потому, что для api
Изменения в опоре могут затронуть всех пользователей использования. API код.
api
Зависимые библиотеки (например, libC, libA) и, в конечном итоге, программа (например, ProjectX) будут загружены загрузчиком классов.
api
Он подходит для управления многомодульными проектами, особенно если вы хотите избежать дублирования. Например, если moduleA полагаться модуль B,в то время как moduleB сноваполагаться модуль C, в то же время moduleA Также необходимо moduleC В некоторых методах класса вы можете moduleC делатьдля api
полагатьсядобавить в moduleB середина. Таким образом,модуль A Просто нужнополагаться модуль B, в то время как moduleC изполагаться будет передано.
implementation
Когда опорся, опора из транзитивности ограничена. Если библиотека, такая как libD) объявлен для implementation
Опирается, и это из содержания меняется, только Прямая зависимостьэтоиз Библиотека(нравиться libB)Нужно повторнокомпилировать。Нетполагаться В libD проекты (например, libA и projectX) не нужно переустанавливать, что может ускорить процесс.
implementation
полагаться Нетбудетпередача,носуществоватьвремя выполнение, все прошло implementation
опорся вводит из библиотек (таких как libD, libB) и, в конечном итоге, программа (например, Все классы в projectX) будут загружены.
implementation
use подходит для программ, которые не должны использоваться другими модулями напрямую с использованием библиотеки useiz. Обычно это внутренняя деталь реализации, не раскрываемая общественности. API из.
api и implementation Тематическое исследование :
В многомодульном проекте используйте api
и implementation
Зависимостями между модулями можно эффективно управлять:
api
:Если вам нужен модульизполагатьсястановитьсядлядругой модульизобщественный API час,делатьиспользовать api
。так,Любой опирающийся проект с этим модулем может получить доступ к этим API.implementation
:Если вы хотите скрыть модульиз Детали реализации,Когда только необходимая функциональность подвергается воздействию других модулей,делатьиспользовать implementation
。это помогает Вуменьшатьвремя компиляциязполагаться передаче для повышения эффективности сборки.
Короче говоря, если не задействованы многомодульные зависимости, чтобы избежать повторных зависимостей, мы будем использовать API. В других случаях мы отдаем приоритет реализации. Наличие большого количества зависимостей API значительно увеличит время сборки.
Конфликт зависимостей означает, что «в процессе компиляции, если существует несколько версий определенной зависимости, система сборки должна выбрать, какую из них собирать», как показано ниже:
A, B и C — это локальные модули подпроекта, а log4j — удаленная зависимость.
время компиляции: B использовать 1.4.2 версия log4j,C использовать 2.2.4 версия log4j,B и C никакого конфликта между
При упаковке: Может быть только один код версии, который в конечном итоге будет упакован в окончательную версию, соответствующую jar или военный пакет, для Gradle Здесь конфликт
Вводим зависимые библиотеки в build.gradle
Изменить build.gradle
Как показано выше: по умолчанию Gradle встречаделатьиспользоватьдо настоящего времениверсия jar Пакет【учитывать новую версию jar Пакеты, как правило, обратно совместимы].
дапредположениеделатьиспользовать Официально привезеноизэто решение。Конечно, помимо этого, Gradle также предоставляет ряд методов для разрешения конфликтов зависимости от: exclude
Удаление зависимости,Транзитивные зависимости не допускаются.,Принудительно использовать определенную версию。
При добавлении зависимостей, если вы установите transitive для false, означает отключение поддержки доставки. т.е. все предположения внутри из не будут добавлены в компилироватьвремя выполнение classpath.
В Gradle, если вы хотите избежать конфликтов зависимостей и обеспечить предсказуемость сборки, вы можете настроить процесс сборки на немедленный сбой при возникновении конфликта зависимостей. Это может помочь вам быстро выявить и устранить несоответствия версий.
Вот пример того, как настроить Gradle на немедленный сбой при возникновении конфликта зависимостей:
configurations.all {
resolutionStrategy.failOnVersionConflict()
}
Этот код должен быть размещен в вашем build.gradle
изпроекта Конфигурация части файла. Делаяиспользовать configurations.all
метод,ты можешьдляпроектсерединавсеиз Конфигурацияотвечатьиспользоватьэта стратегия。resolutionStrategy.failOnVersionConflict()
позволит Gradle Если при разрешении зависимостей возникают какие-либо конфликты версий, сборка будет немедленно остановлена и будет выдано сообщение об ошибке.
таким образом,Вы лучше контролируете проект, изполагаться,Обеспечьте опору на последовательность и проектирование на стабильность.