Распределение конфигурации: build.gradle, settings.gradle, gradle.properties
build.gradle:
Содержит конфигурацию сборки: плагины, зависимости, задачи.
Один файл на модуль в многомодульных проектах.
Роль: Определяет, как собирать проект или модуль.
settings.gradle:
Определяет структуру проекта: корневое имя, подмодули, настройки кэширования.
Пример:
Роль: Управляет инициализацией многомодульного проекта.
gradle.properties:
Хранит свойства для настройки Gradle, JVM и проекта.
Пример:
Роль: Централизует глобальные настройки, доступные всем модулям.
Распределение конфигурации:
Общие настройки: Храните в gradle.properties (например, JVM-аргументы, версии).
Структура проекта: Определяйте в settings.gradle (модули, кэш).
Логика сборки: Описывайте в build.gradle (задачи, зависимости).
Нюансы:
Для многомодульных проектов используйте allprojects или subprojects в build.gradle для общих настроек:
Храните чувствительные данные (например, ключи API) в ~/.gradle/gradle.properties с ограниченными правами доступа.
Управление памятью:
Gradle загружает модель проекта, задачи и зависимости в JVM. Для крупных проектов с сотнями задач и зависимостей потребление памяти может достигать 1-2 ГБ.
Groovy/Kotlin DSL увеличивают overhead из-за динамической/статической компиляции.
Gradle Daemon сохраняет JVM между сборками, ускоряя выполнение, но увеличивая базовое потребление памяти (около 200-300 МБ).
Оптимизируйте с помощью org.gradle.jvmargs=-Xmx2048m и --no-daemon для одноразовых сборок.
Кэширование:
Локальный кэш (~/.gradle/caches) хранит зависимости, плагины и результаты задач, снижая сетевые запросы.
Build Cache (локальный или удаленный) минимизирует повторные вычисления, но требует настройки и дискового пространства.
Очистка кэша: ./gradlew --stop и rm -rf ~/.gradle/caches.
Производительность:
Инкрементальная сборка пропускает неизмененные задачи, проверяя хэши входных/выходных данных.
Параллельное выполнение (--parallel) ускоряет многомодульные проекты, но увеличивает пиковое потребление памяти.
Используйте --configure-on-demand для сокращения времени конфигурации.
Отладка:
Флаг --info или --debug выводит подробные логи:./gradlew build --debug
Используйте ./gradlew tasks для списка задач или ./gradlew dependencies для анализа зависимостей.
Build Scans предоставляют визуальный анализ сборки.
Многомодульные проекты:
Gradle эффективно управляет модулями через settings.gradle, строя DAG для определения порядка сборки.
Выполняйте задачи для конкретного модуля: ./gradlew :module-name:build.
Совместимость:
Gradle требует JDK 8+ (рекомендуется 11+). Убедитесь, что JAVA_HOME указывает на правильный JDK.
Некоторые Maven-плагины требуют аналогов в Gradle (например, nebula-release-plugin вместо maven-release-plugin).
#Java #middle #Gradle #Build_gradle
build.gradle:
Содержит конфигурацию сборки: плагины, зависимости, задачи.
Один файл на модуль в многомодульных проектах.
Роль: Определяет, как собирать проект или модуль.
В памяти: Парсится в модель проекта, включая DAG задач и граф зависимостей.
settings.gradle:
Определяет структуру проекта: корневое имя, подмодули, настройки кэширования.
Пример:
rootProject.name = 'my-project'
include 'module-api', 'module-core'
Роль: Управляет инициализацией многомодульного проекта.
В памяти: Загружается первым, формируя модель проекта и граф модулей. Меньше по объему, чем build.gradle.
gradle.properties:
Хранит свойства для настройки Gradle, JVM и проекта.
Пример:
org.gradle.parallel=true
myVersion=1.0.0
Роль: Централизует глобальные настройки, доступные всем модулям.
В памяти: Загружается как часть конфигурации Gradle, минимально влияя на память.
Распределение конфигурации:
Общие настройки: Храните в gradle.properties (например, JVM-аргументы, версии).
Структура проекта: Определяйте в settings.gradle (модули, кэш).
Логика сборки: Описывайте в build.gradle (задачи, зависимости).
Нюансы:
Для многомодульных проектов используйте allprojects или subprojects в build.gradle для общих настроек:
allprojects {
repositories {
mavenCentral()
}
}
Храните чувствительные данные (например, ключи API) в ~/.gradle/gradle.properties с ограниченными правами доступа.
В памяти: Конфигурационные файлы загружаются последовательно: gradle.properties → settings.gradle → build.gradle. Gradle кэширует результаты парсинга в ~/.gradle/caches, снижая overhead при повторных сборках.
Нюансы и внутренние механизмы
Управление памятью:
Gradle загружает модель проекта, задачи и зависимости в JVM. Для крупных проектов с сотнями задач и зависимостей потребление памяти может достигать 1-2 ГБ.
Groovy/Kotlin DSL увеличивают overhead из-за динамической/статической компиляции.
Gradle Daemon сохраняет JVM между сборками, ускоряя выполнение, но увеличивая базовое потребление памяти (около 200-300 МБ).
Оптимизируйте с помощью org.gradle.jvmargs=-Xmx2048m и --no-daemon для одноразовых сборок.
Кэширование:
Локальный кэш (~/.gradle/caches) хранит зависимости, плагины и результаты задач, снижая сетевые запросы.
Build Cache (локальный или удаленный) минимизирует повторные вычисления, но требует настройки и дискового пространства.
Очистка кэша: ./gradlew --stop и rm -rf ~/.gradle/caches.
Производительность:
Инкрементальная сборка пропускает неизмененные задачи, проверяя хэши входных/выходных данных.
Параллельное выполнение (--parallel) ускоряет многомодульные проекты, но увеличивает пиковое потребление памяти.
Используйте --configure-on-demand для сокращения времени конфигурации.
Отладка:
Флаг --info или --debug выводит подробные логи:./gradlew build --debug
Используйте ./gradlew tasks для списка задач или ./gradlew dependencies для анализа зависимостей.
Build Scans предоставляют визуальный анализ сборки.
Многомодульные проекты:
Gradle эффективно управляет модулями через settings.gradle, строя DAG для определения порядка сборки.
Выполняйте задачи для конкретного модуля: ./gradlew :module-name:build.
Совместимость:
Gradle требует JDK 8+ (рекомендуется 11+). Убедитесь, что JAVA_HOME указывает на правильный JDK.
Некоторые Maven-плагины требуют аналогов в Gradle (например, nebula-release-plugin вместо maven-release-plugin).
#Java #middle #Gradle #Build_gradle
👍4
Что выведет код?
#Tasks
public class Task230725 {
private static volatile boolean flag = true;
public static void main(String[] args) {
new Thread(() -> {
while (flag) {
// empty loop
}
System.out.println("Thread stopped");
}).start();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = false;
System.out.println("Main stopped");
}
}
#Tasks
👍2
Варианты ответа:
Anonymous Quiz
5%
"Main stopped"
53%
"Thread stopped" и "Main stopped"
37%
Бесконечный цикл
5%
Ничего не выведет
👍1
Продолжаем выбирать темы для разбора и голосовать за рассмотрение предложенных! 🤓
Голосуем за тему к рассмотрению в эти выходные!
Предлагаем новую тему!
(можете предложить что-то из того, что предлагали на прошлой и позапрошлых неделях и что проиграло в голосовании!)
Не стесняемся!✌️
Голосуем за тему к рассмотрению в эти выходные!
Предлагаем новую тему!
(можете предложить что-то из того, что предлагали на прошлой и позапрошлых неделях и что проиграло в голосовании!)
Не стесняемся!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Чем отличается LinkedHashMap от HashMap? 🤓
Ответ:
LinkedHashMap сохраняет порядок добавления элементов (или порядок доступа с настройкой), в отличие от HashMap, где порядок не гарантирован.
Пример:
LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
map.put("A", 1);
map.put("B", 2);
System.out.println(map.keySet()); // [A, B]
LinkedHashMap медленнее HashMap из-за дополнительной структуры списка.
#собеседование
Ответ:
Пример:
LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
map.put("A", 1);
map.put("B", 2);
System.out.println(map.keySet()); // [A, B]
LinkedHashMap медленнее HashMap из-за дополнительной структуры списка.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
"Технологии должны служить прогрессу, а не разрушению."
Сергей Капица, ученый и популяризатор науки, сказал это в 2000 году в интервью о роли IT.
Биография
#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
Wikipedia
Капица, Сергей Петрович
Серге́й Петро́вич Капи́ца (14 февраля 1928, Кембридж, Англия — 14 августа 2012, Москва) — советский и российский учёный-физик, просветитель и телеведущий, а также демограф.mw-parser-output .ts-fix-template{font-style:normal;font-weight:normal;white-space:nowrap}.mw…
👍2
Как установить JDK
Что такое JDK и зачем он нужен?
JDK (Java Development Kit) — это комплект инструментов для разработки, компиляции и отладки Java-программ.
Он включает:
Компилятор (javac) для преобразования кода в байт-код.
Среда выполнения Java (JRE), которая содержит JVM для запуска программ.
Утилиты, такие как javadoc (для документации) и jar (для создания архивов).
LTS-версии (17, 21, 24) рекомендуются для обучения и работы, так как они поддерживаются Oracle и сообществом в течение многих лет. На момент июля 2025 года Java 24 — самая новая LTS-версия, но Java 17 и 21 также популярны в проектах.
Шаг 1: Выберите и скачайте JDK
Существует два основных варианта JDK: Oracle JDK и OpenJDK. Для новичков я рекомендую OpenJDK, так как он бесплатный, open-source и подходит для большинства задач.
Вот как скачать JDK:
Перейдите на сайт
Для OpenJDK: посетите https://jdk.java.net.
Для Oracle JDK: посетите https://www.oracle.com/java/technologies/javase-downloads.html.
Выберите версию:
На сайте OpenJDK найдите разделы для Java 17, 21 или 24 (LTS). Например, для Java 21 это может быть OpenJDK 21.
Для Oracle JDK выберите нужную версию из списка загрузок.
Выберите вашу операционную систему:
Windows: .zip или .exe (для Oracle JDK).
macOS: .tar.gz или .dmg.
Linux: .tar.gz или пакеты для дистрибутивов (например, .deb для Ubuntu).
Скачайте файл:
Для OpenJDK выберите архив или установщик для вашей системы.
Для Oracle JDK вам может потребоваться создать учетную запись Oracle и принять лицензионное соглашение.
Шаг 2: Установка JDK
Для Windows
Скачайте и запустите установщик:
Если вы выбрали Oracle JDK, запустите .exe и следуйте инструкциям мастера установки. Обычно достаточно нажать «Next» и выбрать папку установки (например, C:\Program Files\Java\jdk-17).
Для OpenJDK скачайте .zip, распакуйте его в папку, например, C:\Program Files\Java\jdk-17.
Настройте переменную PATH:
Найдите папку, где установлен JDK (например, C:\Program Files\Java\jdk-17\bin).
Добавьте её в системную переменную PATH:
Нажмите Win + R, введите sysdm.cpl и нажмите Enter.
Перейдите во вкладку «Дополнительно» → «Переменные среды».
В разделе «Системные переменные» найдите или создайте переменную PATH, добавьте путь к папке bin вашего JDK (например, C:\Program Files\Java\jdk-17\bin).
Создайте переменную JAVA_HOME:
В «Системных переменных» нажмите «Создать», укажите имя JAVA_HOME и значение — путь к папке JDK (например, C:\Program Files\Java\jdk-17).
Проверьте установку:
Откройте командную строку (Win + R → cmd).
Введите java -version и javac -version. Вы должны увидеть информацию о версии Java и компилятора, например:
Для macOS
Скачайте и установите JDK:
Для Oracle JDK: запустите .dmg и следуйте инструкциям установщика.
Для OpenJDK: скачайте .tar.gz, распакуйте его в папку, например, /Library/Java/JavaVirtualMachines/jdk-17.
Настройте переменную PATH:
Откройте терминал.
Отредактируйте файл профиля (например, ~/.zshrc для zsh или ~/.bashrc для bash):
Добавьте строки:
Сохраните файл и выполните:
Проверьте установку:
В терминале введите java -version и javac -version. Вы должны увидеть информацию о версии, например:
#Java #для_новичков #beginner #JDK_install
Что такое JDK и зачем он нужен?
JDK (Java Development Kit) — это комплект инструментов для разработки, компиляции и отладки Java-программ.
Он включает:
Компилятор (javac) для преобразования кода в байт-код.
Среда выполнения Java (JRE), которая содержит JVM для запуска программ.
Утилиты, такие как javadoc (для документации) и jar (для создания архивов).
LTS-версии (17, 21, 24) рекомендуются для обучения и работы, так как они поддерживаются Oracle и сообществом в течение многих лет. На момент июля 2025 года Java 24 — самая новая LTS-версия, но Java 17 и 21 также популярны в проектах.
Шаг 1: Выберите и скачайте JDK
Существует два основных варианта JDK: Oracle JDK и OpenJDK. Для новичков я рекомендую OpenJDK, так как он бесплатный, open-source и подходит для большинства задач.
Вот как скачать JDK:
Перейдите на сайт
Для OpenJDK: посетите https://jdk.java.net.
Для Oracle JDK: посетите https://www.oracle.com/java/technologies/javase-downloads.html.
Выберите версию:
На сайте OpenJDK найдите разделы для Java 17, 21 или 24 (LTS). Например, для Java 21 это может быть OpenJDK 21.
Для Oracle JDK выберите нужную версию из списка загрузок.
Выберите вашу операционную систему:
Windows: .zip или .exe (для Oracle JDK).
macOS: .tar.gz или .dmg.
Linux: .tar.gz или пакеты для дистрибутивов (например, .deb для Ubuntu).
Скачайте файл:
Для OpenJDK выберите архив или установщик для вашей системы.
Для Oracle JDK вам может потребоваться создать учетную запись Oracle и принять лицензионное соглашение.
Совет: Если вы не уверены, какую версию выбрать, начните с OpenJDK 17 — она наиболее распространена в учебных и рабочих проектах.
Шаг 2: Установка JDK
Для Windows
Скачайте и запустите установщик:
Если вы выбрали Oracle JDK, запустите .exe и следуйте инструкциям мастера установки. Обычно достаточно нажать «Next» и выбрать папку установки (например, C:\Program Files\Java\jdk-17).
Для OpenJDK скачайте .zip, распакуйте его в папку, например, C:\Program Files\Java\jdk-17.
Настройте переменную PATH:
Найдите папку, где установлен JDK (например, C:\Program Files\Java\jdk-17\bin).
Добавьте её в системную переменную PATH:
Нажмите Win + R, введите sysdm.cpl и нажмите Enter.
Перейдите во вкладку «Дополнительно» → «Переменные среды».
В разделе «Системные переменные» найдите или создайте переменную PATH, добавьте путь к папке bin вашего JDK (например, C:\Program Files\Java\jdk-17\bin).
Создайте переменную JAVA_HOME:
В «Системных переменных» нажмите «Создать», укажите имя JAVA_HOME и значение — путь к папке JDK (например, C:\Program Files\Java\jdk-17).
Проверьте установку:
Откройте командную строку (Win + R → cmd).
Введите java -version и javac -version. Вы должны увидеть информацию о версии Java и компилятора, например:
openjdk version "17.0.8" 2023-07-18
OpenJDK Runtime Environment (build 17.0.8+7)
javac 17.0.8
Для macOS
Скачайте и установите JDK:
Для Oracle JDK: запустите .dmg и следуйте инструкциям установщика.
Для OpenJDK: скачайте .tar.gz, распакуйте его в папку, например, /Library/Java/JavaVirtualMachines/jdk-17.
Настройте переменную PATH:
Откройте терминал.
Отредактируйте файл профиля (например, ~/.zshrc для zsh или ~/.bashrc для bash):
nano ~/.zshrc
Добавьте строки:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-17
export PATH=$JAVA_HOME/bin:$PATH
(Замените путь на актуальный, если он отличается.)
Сохраните файл и выполните:
source ~/.zshrc
Проверьте установку:
В терминале введите java -version и javac -version. Вы должны увидеть информацию о версии, например:
openjdk version "17.0.8" 2023-07-18
OpenJDK Runtime Environment (build 17.0.8+7)
javac 17.0.8
#Java #для_новичков #beginner #JDK_install
👍4
Для Linux (на примере Ubuntu)
Установите JDK:
Через пакетный менеджер (рекомендуется для простоты):
Для Java 21 или 24 замените openjdk-17-jdk на openjdk-21-jdk или openjdk-24-jdk, если они доступны в репозитории.
Через архив:
Скачайте .tar.gz с сайта OpenJDK.
Распакуйте в /usr/lib/jvm/:
Настройте переменную JAVA_HOME:
Добавьте:
Обновите PATH:
Добавьте:
Примените изменения:
Проверьте установку:
В терминале выполните:
Ожидаемый вывод:
Шаг 3: Проверка и первые шаги
Напишите простую программу:
Создайте файл HelloWorld.java:
Скомпилируйте и запустите:
В терминале или командной строке перейдите в папку с файлом:
Скомпилируйте:
Запустите:
Ожидаемый вывод:
Если возникли ошибки:
Убедитесь, что JAVA_HOME и PATH настроены правильно.
Проверьте, что вы используете правильную версию JDK (java -version и javac -version).
Убедитесь, что файл называется точно HelloWorld.java (с учётом регистра).
#Java #для_новичков #beginner #JDK_install
Установите JDK:
Через пакетный менеджер (рекомендуется для простоты):
sudo apt update
sudo apt install openjdk-17-jdk
Для Java 21 или 24 замените openjdk-17-jdk на openjdk-21-jdk или openjdk-24-jdk, если они доступны в репозитории.
Через архив:
Скачайте .tar.gz с сайта OpenJDK.
Распакуйте в /usr/lib/jvm/:
sudo tar -xzf jdk-17.tar.gz -C /usr/lib/jvm/
Настройте переменную JAVA_HOME:
sudo nano /etc/environment
Добавьте:
JAVA_HOME="/usr/lib/jvm/jdk-17"
Обновите PATH:
nano ~/.bashrc
Добавьте:
export PATH=$JAVA_HOME/bin:$PATH
Примените изменения:
source ~/.bashrc
Проверьте установку:
В терминале выполните:
java -version
javac -version
Ожидаемый вывод:
openjdk version "17.0.8" 2023-07-18
OpenJDK Runtime Environment (build 17.0.8+7)
javac 17.0.8
Шаг 3: Проверка и первые шаги
Напишите простую программу:
Создайте файл HelloWorld.java:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
Скомпилируйте и запустите:
В терминале или командной строке перейдите в папку с файлом:
cd путь/к/папке
Скомпилируйте:
javac HelloWorld.java
Запустите:
java HelloWorld
Ожидаемый вывод:
Hello, World!
Если возникли ошибки:
Убедитесь, что JAVA_HOME и PATH настроены правильно.
Проверьте, что вы используете правильную версию JDK (java -version и javac -version).
Убедитесь, что файл называется точно HelloWorld.java (с учётом регистра).
#Java #для_новичков #beginner #JDK_install
🔥4
Что выведет код?
#Tasks
public class Task240725 {
private static synchronized void print(String msg) {
System.out.print(msg + " ");
}
public static void main(String[] args) {
Thread t1 = new Thread(() -> print("Hello"));
Thread t2 = new Thread(() -> print("World"));
t1.start();
t2.run();
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
#Tasks
👍2
Варианты ответа:
Anonymous Quiz
10%
Только "World "
45%
Только "Hello "
25%
"World Hello "
20%
"Hello World "
👍2
Что такое StackOverflowError? 🤓
Ответ:
StackOverflowError возникает при чрезмерной глубине рекурсии, когда стек вызовов переполняется.
Пример:
void recursive() { recursive(); } // Вызовет StackOverflowError
Решение: оптимизировать рекурсию (например, через итерацию) или увеличить размер стека (-Xss).
#собеседование
Ответ:
Пример:
void recursive() { recursive(); } // Вызовет StackOverflowError
Решение: оптимизировать рекурсию (например, через итерацию) или увеличить размер стека (-Xss).
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
"Алгоритмы — это язык, на котором природа говорит с нами."
Андрей Колмогоров, математик, сказал это в 1960-х годах на лекции в МГУ, вдохновляя IT.
Биография
#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
Wikipedia
Колмогоров, Андрей Николаевич
Андре́й Никола́евич Колмого́ров (12 (25) апреля 1903, Тамбов — 20 октября 1987, Москва) — советский математик, один из крупнейших математиков XX века. Один из основоположников современной теории вероятностей, им получены фундаментальные результаты в топологии…
👍3
Зависимости и конфигурации в Gradle
Dependency Configurations
Конфигурации в Gradle определяют группы зависимостей, используемых для разных целей (компиляция, выполнение, тестирование). Они заменяют концепцию scope в Maven, предоставляя более гибкий подход.
Основные конфигурации
implementation:
Используется для зависимостей, необходимых для компиляции и выполнения кода проекта.
Не транзитивны для потребителей (в отличие от api).
Пример:
api:
Используется для зависимостей, которые становятся частью публичного API модуля и транзитивно передаются потребителям.
Применяется в основном в плагине java-library.
Пример:
compileOnly:
Зависимости, необходимые только для компиляции, но не для выполнения.
Аналог provided в Maven.
Пример:
runtimeOnly:
Зависимости, необходимые только для выполнения, но не для компиляции.
Аналог runtime в Maven.
Пример:
testImplementation:
Зависимости для компиляции и выполнения тестов.
Не транзитивны для основного кода.
Пример:
Конфигурации в деталях: configurations {}
Gradle позволяет определять кастомные конфигурации через блок configurations для специфических нужд.
Пример:
Расширение конфигураций: Конфигурации могут наследовать друг от друга:
#Java #middle #Gradle #Configuration_gradle
Dependency Configurations
Конфигурации в Gradle определяют группы зависимостей, используемых для разных целей (компиляция, выполнение, тестирование). Они заменяют концепцию scope в Maven, предоставляя более гибкий подход.
Основные конфигурации
implementation:
Используется для зависимостей, необходимых для компиляции и выполнения кода проекта.
Не транзитивны для потребителей (в отличие от api).
Пример:
dependencies {
implementation 'org.springframework:spring-core:5.3.20'
}
Использование: Для внутренних зависимостей, которые не должны быть видны внешним модулям.
api:
Используется для зависимостей, которые становятся частью публичного API модуля и транзитивно передаются потребителям.
Применяется в основном в плагине java-library.
Пример:
plugins {
id 'java-library'
}
dependencies {
api 'org.apache.commons:commons-lang3:3.12.0'
}
Использование: Для библиотек, которые должны быть доступны в classpath потребителей (например, интерфейсы или DTO).
compileOnly:
Зависимости, необходимые только для компиляции, но не для выполнения.
Аналог provided в Maven.
Пример:
dependencies {
compileOnly 'javax.servlet:javax.servlet-api:4.0.1'
}
Использование: Для API, предоставляемых контейнером (например, Servlet API в веб-приложениях).
runtimeOnly:
Зависимости, необходимые только для выполнения, но не для компиляции.
Аналог runtime в Maven.
Пример:
dependencies {
runtimeOnly 'mysql:mysql-connector-java:8.0.28'
}
Использование: Для драйверов баз данных или библиотек, используемых только во время выполнения.
testImplementation:
Зависимости для компиляции и выполнения тестов.
Не транзитивны для основного кода.
Пример:
dependencies {
testImplementation 'junit:junit:4.13.2'
}
Использование: Для тестовых фреймворков и библиотек.
В памяти: Каждая конфигурация представлена как объект в модели Gradle, содержащий список зависимостей и их метаданные. Gradle хранит граф зависимостей в памяти как Directed Acyclic Graph (DAG), что увеличивает потребление памяти пропорционально количеству зависимостей и конфигураций.
Конфигурации в деталях: configurations {}
Gradle позволяет определять кастомные конфигурации через блок configurations для специфических нужд.
Пример:
configurations {
customConfig
}
dependencies {
customConfig 'com.example:library:1.0'
}
tasks.register('useCustomConfig') {
doLast {
configurations.customConfig.each { file ->
println "Using ${file.name}"
}
}
}
Назначение: Кастомные конфигурации позволяют группировать зависимости для нестандартных задач, таких как интеграционные тесты или обработка ресурсов.
Расширение конфигураций: Конфигурации могут наследовать друг от друга:
configurations {
customConfig.extendsFrom implementation
}
Это добавляет все зависимости implementation в customConfig.
В памяти: Кастомные конфигурации увеличивают объем графа зависимостей, так как Gradle создает дополнительные объекты для каждой конфигурации. Это требует больше памяти, особенно если конфигурации содержат много транзитивных зависимостей.
#Java #middle #Gradle #Configuration_gradle
👍3
Dependency Resolution
Gradle автоматически разрешает зависимости, загружая их из репозиториев (например, Maven Central) и управляя конфликтами версий.
Версионирование, конфликты, форсинг, exclusions
Версионирование:
Зависимости указываются с версией: group:artifact:version.
Поддерживаются динамические версии (например, 1.+) или диапазоны ([1.0,2.0)).
Пример:
Конфликты:
Gradle использует стратегию newest-wins (новейшая версия побеждает) для разрешения конфликтов версий.
Пример: Если модуль A требует spring-core:5.3.20, а модуль B — spring-core:5.3.22, Gradle выберет 5.3.22.
Форсинг:
Для принудительного использования конкретной версии используйте force:
Exclusions:
Исключение транзитивных зависимостей для избежания конфликтов или ненужных библиотек:
BOM (Bill of Materials)
BOM — это файл, определяющий согласованные версии зависимостей, аналогично Maven. Gradle поддерживает BOM через платформы (platform).
Пример:
Как работает:
BOM импортируется как платформа, предоставляя версии для всех зависимостей без необходимости их указания.
Gradle загружает BOM (POM-файл) из репозитория и применяет его версии к зависимостям.
Модули и классы зависимостей
Модули: Gradle поддерживает зависимости от других Gradle-проектов (модулей) в многомодульных проектах:
Модули добавляются в settings.gradle:include 'module-core', 'module-api'
Классы зависимостей: Gradle разрешает зависимости до уровня JAR-файлов, включаемых в classpath. Для Java-проектов это управляется плагином java или java-library.
Dependency Cache и Offline режим
Dependency Cache:
Gradle кэширует зависимости в ~/.gradle/caches/modules-2.
Кэш включает JAR-файлы, POM-файлы и метаданные, что минимизирует сетевые запросы.
Очистка кэша:rm -rf ~/.gradle/caches
Offline режим:
Запустите Gradle с флагом --offline:./gradlew build --offline
Gradle использует только локальный кэш, что полезно для сборок без интернета.
Нюанс: Если зависимость отсутствует в кэше, сборка завершится с ошибкой.
#Java #middle #Gradle #Configuration_gradle
Gradle автоматически разрешает зависимости, загружая их из репозиториев (например, Maven Central) и управляя конфликтами версий.
Версионирование, конфликты, форсинг, exclusions
Версионирование:
Зависимости указываются с версией: group:artifact:version.
Поддерживаются динамические версии (например, 1.+) или диапазоны ([1.0,2.0)).
Пример:
dependencies {
implementation 'org.springframework:spring-core:5.+'
}
Конфликты:
Gradle использует стратегию newest-wins (новейшая версия побеждает) для разрешения конфликтов версий.
Пример: Если модуль A требует spring-core:5.3.20, а модуль B — spring-core:5.3.22, Gradle выберет 5.3.22.
В памяти: Gradle строит граф зависимостей и разрешает конфликты во время фазы конфигурации, храня временные структуры для сравнения версий.
Форсинг:
Для принудительного использования конкретной версии используйте force:
configurations.all {
resolutionStrategy {
force 'org.springframework:spring-core:5.3.20'
}
}
В памяти: Форсинг добавляет правила в граф зависимостей, что минимально влияет на память, но требует дополнительных вычислений.
Exclusions:
Исключение транзитивных зависимостей для избежания конфликтов или ненужных библиотек:
dependencies {
implementation('org.springframework:spring-core:5.3.20') {
exclude group: 'commons-logging'
}
}
В памяти: Исключения уменьшают размер графа зависимостей, снижая потребление памяти и вероятность конфликтов.
BOM (Bill of Materials)
BOM — это файл, определяющий согласованные версии зависимостей, аналогично Maven. Gradle поддерживает BOM через платформы (platform).
Пример:
dependencies {
implementation platform('org.springframework.boot:spring-boot-dependencies:2.7.18')
implementation 'org.springframework.boot:spring-boot-starter'
}
Как работает:
BOM импортируется как платформа, предоставляя версии для всех зависимостей без необходимости их указания.
Gradle загружает BOM (POM-файл) из репозитория и применяет его версии к зависимостям.
В памяти: BOM увеличивает объем графа зависимостей, так как Gradle загружает и парсит дополнительный POM-файл. Однако это упрощает управление версиями, снижая вероятность конфликтов.
Модули и классы зависимостей
Модули: Gradle поддерживает зависимости от других Gradle-проектов (модулей) в многомодульных проектах:
dependencies {
implementation project(':module-core')
}
Модули добавляются в settings.gradle:include 'module-core', 'module-api'
Классы зависимостей: Gradle разрешает зависимости до уровня JAR-файлов, включаемых в classpath. Для Java-проектов это управляется плагином java или java-library.
В памяти: Зависимости от модулей добавляются в граф как узлы, увеличивая его размер. Gradle кэширует артефакты модулей в ~/.gradle/caches, снижая сетевые запросы, но требуя места на диске
Dependency Cache и Offline режим
Dependency Cache:
Gradle кэширует зависимости в ~/.gradle/caches/modules-2.
Кэш включает JAR-файлы, POM-файлы и метаданные, что минимизирует сетевые запросы.
Очистка кэша:rm -rf ~/.gradle/caches
Offline режим:
Запустите Gradle с флагом --offline:./gradlew build --offline
Gradle использует только локальный кэш, что полезно для сборок без интернета.
Нюанс: Если зависимость отсутствует в кэше, сборка завершится с ошибкой.
В памяти: Кэширование снижает потребность в сетевых операциях, но увеличивает использование диска. Gradle загружает метаданные зависимостей в память только для активных конфигураций, оптимизируя ресурсы.
#Java #middle #Gradle #Configuration_gradle
👍3
Lockfiles (Dependency Locking)
Lockfiles фиксируют точные версии зависимостей для воспроизводимости сборки.
Включение:
Генерация:
Создает файлы gradle.lockfile в gradle/ для каждой конфигурации.
Пример lockfile:
Gradle Dependency Report (gradle dependencies)
Команда ./gradlew dependencies генерирует отчет о зависимостях для всех конфигураций:
Вывод (пример):
Флаги:
--configuration <name>: Для конкретной конфигурации, например, ./gradlew dependencies --configuration implementation.
-q: Для компактного вывода.
Использование: Анализ транзитивных зависимостей, выявление конфликтов.
Variant-aware Resolution
Gradle поддерживает вариантно-ориентированное разрешение зависимостей, что позволяет выбирать разные варианты артефакта в зависимости от атрибутов (например, версия Java, платформа).
Пример:
Назначение:
Выбор артефакта для конкретной версии Java или платформы (например, Android vs JVM).
Поддержка мультиплатформенных библиотек (например, Kotlin Multiplatform).
#Java #middle #Gradle #Configuration_gradle
Lockfiles фиксируют точные версии зависимостей для воспроизводимости сборки.
Включение:
dependencyLocking {
lockAllConfigurations()
}
Генерация:
./gradlew dependencies --write-locks
Создает файлы gradle.lockfile в gradle/ для каждой конфигурации.
Пример lockfile:
org.springframework:spring-core:5.3.20
org.junit:junit:4.13.2
Использование: Gradle использует версии из lockfile, игнорируя динамические версии или новейшие доступные.
В памяти: Lockfiles загружаются как часть модели зависимостей, добавляя минимальный overhead. Они уменьшают время разрешения зависимостей, так как Gradle не проверяет удаленные репозитории.
Gradle Dependency Report (gradle dependencies)
Команда ./gradlew dependencies генерирует отчет о зависимостях для всех конфигураций:
./gradlew dependencies
Вывод (пример):
implementation - Implementation dependencies for the main source set.
\--- org.springframework:spring-core:5.3.20
\--- commons-logging:commons-logging:1.2
testImplementation - Implementation dependencies for the test source set.
\--- junit:junit:4.13.2
Флаги:
--configuration <name>: Для конкретной конфигурации, например, ./gradlew dependencies --configuration implementation.
-q: Для компактного вывода.
Использование: Анализ транзитивных зависимостей, выявление конфликтов.
В памяти: Gradle загружает полный граф зависимостей в память для генерации отчета, что может быть ресурсоемким для крупных проектов. Кэширование метаданных в ~/.gradle/caches ускоряет повторные вызовы.
Variant-aware Resolution
Gradle поддерживает вариантно-ориентированное разрешение зависимостей, что позволяет выбирать разные варианты артефакта в зависимости от атрибутов (например, версия Java, платформа).
Пример:
dependencies {
implementation 'org.example:library:1.0' {
attributes {
attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 11)
}
}
}
Назначение:
Выбор артефакта для конкретной версии Java или платформы (например, Android vs JVM).
Поддержка мультиплатформенных библиотек (например, Kotlin Multiplatform).
В памяти: Gradle хранит атрибуты и варианты в графе зависимостей, что увеличивает сложность и потребление памяти, особенно для библиотек с множеством вариантов.
#Java #middle #Gradle #Configuration_gradle
👍3
Что выведет код?
#Tasks
import java.util.concurrent.locks.ReentrantLock;
public class Task250725 {
public static void main(String[] args) {
ReentrantLock lock = new ReentrantLock();
try {
lock.lock();
System.out.println("First lock");
lock.lock();
System.out.println("Second lock");
} finally {
lock.unlock();
}
}
}
#Tasks
👍1
Продолжаем выбирать темы для разбора и голосовать за рассмотрение предложенных! 🤓
Голосуем за тему к рассмотрению в эти выходные!
Предлагаем новую тему!
(можете предложить что-то из того, что предлагали на прошлой и позапрошлых неделях и что проиграло в голосовании!)
Не стесняемся!✌️
Голосуем за тему к рассмотрению в эти выходные!
Предлагаем новую тему!
(можете предложить что-то из того, что предлагали на прошлой и позапрошлых неделях и что проиграло в голосовании!)
Не стесняемся!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1