Зависимости расширенного обучения Gradle [Зависимости]
Зависимости расширенного обучения Gradle [Зависимости]

1. Путь зависимости

Зависимости в Gradle — это прямые зависимости, зависимости проекта и локальные зависимости jar.

В Gradle управление зависимостями является очень важной частью, которая позволяет вам указывать различные библиотеки и модули, необходимые вашему проекту. В вашем случае упоминаются три распространенных типа зависимостей: зависимости проекта, локальные зависимости JAR и прямые зависимости из удаленных репозиториев. Ниже я объясню эти три типа зависимостей соответственно и предоставлю соответствующие методы настройки.

1.1 Прямая зависимость (зависимость от удаленного склада)

Прямые зависимости — это зависимости, полученные из удаленных репозиториев (например, Maven Central). В Gradle вы можете объявить эти зависимости напрямую по координатам, следующим образом:

Язык кода:javascript
копировать
dependencies {
    // Прямая Сокращенная форма зависимостииз
    implementation 'cn.hutool:hutool-all:5.8.27'

    // Прямая зависимостьиз полной формы
    iimplementation group: 'cn.hutool', name: 'hutool-all', version: '5.8.27'
}
image-20240420194013517
image-20240420194013517

существоватьMavenизpom.xmlв файле,Это эквивалентно:

Язык кода:javascript
копировать
<dependencies>
    <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.8.27</version>
	</dependency>
</dependencies>

существоватьGradleсередина,implementationдаполагаться Конфигурация№1,это эквивалентноMavenсерединаизcompileделатьиспользоватьдомен。

1.2 Зависимости проекта

Под зависимостью проекта подразумевается существование в многомодульном проекте.,Один модуль зависит от другого модуля. существованиеGradle,ты можешь сделатьиспользоватьprojectметод объявить этополагаться,Как показано ниже:

Язык кода:javascript
копировать
dependencies {
    // Зависимости проекта
    implementation project(':subject01')
}
image-20240420194227026
image-20240420194227026

существоватьsettings.gradleв файле,Вам нужен подмодуль Конфигурация по пути,чтобы Gradle их распознал:

Язык кода:javascript
копировать
rootProject.name = 'root'
include 'subject01' // Содержит подмодуль с именем дляsubject01iz.
1.3 Локальные зависимости JAR

Локальные файлы JAR относятся к файлу JAR, который напрямую ссылается на каталог используемого проекта. существованиеGradle,ты можешь сделатьиспользоватьfilesметодилиfileTreeметодобъявить об этомполагаться:

Язык кода:javascript
копировать
dependencies {
    // Прямая зависимостьидентификацияизJARдокумент    implementation files('libs/foo.jar', 'libs/bar.jar')

    // Конфигурация папки как элемента дляполагаться, автоматически включает все файлы JAR в папку.
    implementation fileTree(dir: 'libs', include: ['*.jar'])
}

делатьиспользоватьfileTreeметодчас,Gradle автоматически включит все файлы JAR в указанный каталог как можнополагаться.

Подвести итог
  • Прямая зависимость:Получить с удаленного складаизполагаться,Оператор координат Makeuse.
  • Зависимости проекта:существовать Многомодульный проектсередина,Один модуль к другому модулю изполагаться.
  • Локальные зависимости JAR:Прямая цитатаиспользоватьместныйдокументсистемасерединаизJARдокумент。

Для каждого типа зависимостей существуют свои применимые сценарии, и вы можете выбрать подходящий метод управления зависимостями в соответствии с конкретными потребностями проекта.

2. Зависимые загрузки

Когда команда сборки будет выполнена, gradle загрузит соответствующий Jar из настроенного хранилища зависимостей и применит его к проекту.

3. Тип зависимости

Подобно тегу области 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-библиотекой Плагины предоставляются

4. Разница между API и реализацией

Вот что вы можете предложить о Gradle конфигурацииapiиimplementationизсравнительная таблица,Я оптимизировал и систематизировал это:

Особенности/Сценарии

apiВарианты конфигурации

implementationВарианты конфигурации

время компиляции

- Зависимости могут передаваться пользователям модуля.

— Зависимости не передаются пользователям модуля.

— При изменении базовых зависимостей все модули, которые зависят от этих базовых зависимостей, необходимо перекомпилировать, что может привести к замедлению скорости компиляции.

- При изменении базовых зависимостей необходимо перекомпилировать только те модули, которые напрямую зависят от этих базовых зависимостей, а скорость компиляции относительно высокая.

время выполнения

- Будут загружены все классы модуля.

- Будут загружены все классы модуля.

Сценарии применения

- Подходит для многомодульных проектов, особенно если вы хотите избежать повторных зависимостей от одного и того же модуля.

— Используется в большинстве случаев, особенно если вы не хотите, чтобы зависимости передавались потребителям модуля.

apiиimplementationдаGradleсерединачастоиспользоватьиз Два видаполагаться Варианты конфигурации,онисуществоватьвремя компиляцииивремя выполненияиз ХОРОШОдлядругой。apiВарианты конфигурациипозволятьполагатьсяпередача,Этот существующий мультимодуль из проекта очень полезен.,Можно гарантировать, что модульизполагатьсяреляционная согласованность。иimplementationВарианты конфигурациине будетполагатьсяпередача Даватьделатьиспользовать ВОЗ,Такое существование в большинстве случаев рекомендуется использоватьиз,Потому что для этого можно сократить ненужные изполагаться при прохождении,Тем самым повышая эффективность строительства объекта.

Ниже приводится подробное объяснение двух типов опор и их различных эффектов:

4.1 Зависимости API
  • время компиляции:Когда библиотека(нравиться libC) объявлен для api опираться, когда изменения в содержании вызовут все прямые и косвенные предположения, которые он проектирует. (например, libA и projectX) необходимо переустановить. Это потому, что для api Изменения в опоре могут затронуть всех пользователей использования. API код.
  • время выполнения:существоватьвремя выполнение, все прошло api Зависимые библиотеки (например, libC, libA) и, в конечном итоге, программа (например, ProjectX) будут загружены загрузчиком классов.
  • подходящийиспользоватьсценаapi Он подходит для управления многомодульными проектами, особенно если вы хотите избежать дублирования. Например, если moduleA полагаться модуль B,в то время как moduleB сноваполагаться модуль C, в то же время moduleA Также необходимо moduleC В некоторых методах класса вы можете moduleC делатьдля api полагатьсядобавить в moduleB середина. Таким образом,модуль A Просто нужнополагаться модуль B, в то время как moduleC изполагаться будет передано.
4.2 зависимости реализации
  • время компиляции:делатьиспользовать implementation Когда опорся, опора из транзитивности ограничена. Если библиотека, такая как libD) объявлен для implementation Опирается, и это из содержания меняется, только Прямая зависимостьэтоиз Библиотека(нравиться libB)Нужно повторнокомпилировать。Нетполагаться В libD проекты (например, libA и projectX) не нужно переустанавливать, что может ускорить процесс.
  • время выполнения:хотясуществоватьвремя компиляции implementation полагаться Нетбудетпередача,носуществоватьвремя выполнение, все прошло implementation опорся вводит из библиотек (таких как libD, libB) и, в конечном итоге, программа (например, Все классы в projectX) будут загружены.
  • подходящийиспользоватьсценаimplementation use подходит для программ, которые не должны использоваться другими модулями напрямую с использованием библиотеки useiz. Обычно это внутренняя деталь реализации, не раскрываемая общественности. API из.
4.3 расширять

api и implementation Тематическое исследование :

В многомодульном проекте используйте api и implementation Зависимостями между модулями можно эффективно управлять:

  • делатьиспользовать api:Если вам нужен модульизполагатьсястановитьсядлядругой модульизобщественный API час,делатьиспользовать api。так,Любой опирающийся проект с этим модулем может получить доступ к этим API.
  • делатьиспользовать implementation:Если вы хотите скрыть модульиз Детали реализации,Когда только необходимая функциональность подвергается воздействию других модулей,делатьиспользовать implementation。это помогает Вуменьшатьвремя компиляциязполагаться передаче для повышения эффективности сборки.

Короче говоря, если не задействованы многомодульные зависимости, чтобы избежать повторных зависимостей, мы будем использовать API. В других случаях мы отдаем приоритет реализации. Наличие большого количества зависимостей API значительно увеличит время сборки.

5. Конфликты зависимостей и их решения

Конфликт зависимостей означает, что «в процессе компиляции, если существует несколько версий определенной зависимости, система сборки должна выбрать, какую из них собирать», как показано ниже:

image-20240420195402674
image-20240420195402674

A, B и C — это локальные модули подпроекта, а log4j — удаленная зависимость.

время компиляции: B использовать 1.4.2 версия log4j,C использовать 2.2.4 версия log4j,B и C никакого конфликта между

При упаковке: Может быть только один код версии, который в конечном итоге будет упакован в окончательную версию, соответствующую jar или военный пакет, для Gradle Здесь конфликт

5.1 Демонстрация случая:

Вводим зависимые библиотеки в build.gradle

image-20240420195849916
image-20240420195849916

Изменить build.gradle

image-20240420195949082
image-20240420195949082

Как показано выше: по умолчанию Gradle встречаделатьиспользоватьдо настоящего времениверсия jar Пакет【учитывать новую версию jar Пакеты, как правило, обратно совместимы].

дапредположениеделатьиспользовать Официально привезеноизэто решение。Конечно, помимо этого, Gradle также предоставляет ряд методов для разрешения конфликтов зависимости от: exclude

Удаление зависимости,Транзитивные зависимости не допускаются.,Принудительно использовать определенную версию

5.2 Исключить исключает зависимость

image-20240420200138605
image-20240420200138605

5.3 Передача зависимостей не разрешена [обычно не используется]

image-20240420200227442
image-20240420200227442

При добавлении зависимостей, если вы установите transitive для false, означает отключение поддержки доставки. т.е. все предположения внутри из не будут добавлены в компилироватьвремя выполнение classpath.

5.4 Принудительное использование определенной версии [Официальная рекомендация]

image-20240420200349538
image-20240420200349538

расширять

В Gradle, если вы хотите избежать конфликтов зависимостей и обеспечить предсказуемость сборки, вы можете настроить процесс сборки на немедленный сбой при возникновении конфликта зависимостей. Это может помочь вам быстро выявить и устранить несоответствия версий.

Вот пример того, как настроить Gradle на немедленный сбой при возникновении конфликта зависимостей:

Язык кода:javascript
копировать
configurations.all {
    resolutionStrategy.failOnVersionConflict()
}

Этот код должен быть размещен в вашем build.gradle изпроекта Конфигурация части файла. Делаяиспользовать configurations.all метод,ты можешьдляпроектсерединавсеиз Конфигурацияотвечатьиспользоватьэта стратегия。resolutionStrategy.failOnVersionConflict() позволит Gradle Если при разрешении зависимостей возникают какие-либо конфликты версий, сборка будет немедленно остановлена ​​и будет выдано сообщение об ошибке.

Преимущества проверки конфликта зависимостей
  • Оперативно находите проблемы:Сборка не удаласьпоставлятьясныйиз Сигнал,Указывает на то, что существуют несовместимые версии между опорся и существованием.,Это предотвращает случайное включение несовместимых изполаганий в сборку.
  • Упрощение отладки:Это нормально – потерпеть неудачу сразу Упрощение процесс отладки, потому что вам не нужно гадать, что построить успешно, но время выполнение, но есть проблема.
  • избегатьвремя выполненияошибка:обеспечивая всеполагаться Вседасовместимыйиз,можно уменьшитьвремя выполнение Непредвиденная ошибка из-за несоответствия опор.
На что следует обратить внимание
  • существуют. В командной работе эта стратегия может помочь каждому участнику осознать важность опорверсия.
  • Для крупных проектов со сложными отношениями зависимостей эта стратегия может вызывать частые сбои сборки, поэтому для использования использования может потребоваться сотрудничество с другими стратегиями управления опорами.
  • В реальной эксплуатации может возникнуть необходимость принятия решения о том, использовать ли этот вариант, исходя из конкретных потребностей проекта и стратегии управления.

таким образом,Вы лучше контролируете проект, изполагаться,Обеспечьте опору на последовательность и проектирование на стабильность.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose