Статьи

Gradle: модернизация процесса сборки

Многие из вас задаются вопросом, какая система сборки лучше всего подходит для вашего проекта?

Это зависит от многих факторов, включая размер вашего проекта, ваши потребности в настройке, обработку зависимостей, внешние зависимости и несколько других переменных, которые могут помочь вам выбрать. Давайте взглянем.

Gradle — это система автоматизации сборки с полностью открытым исходным кодом, в которой используются концепции других инструментов сборки, таких как Apache Maven и Apache Ant. Он поддерживает разработку и последующее развертывание с использованием Java, Scala и Groovy, а в будущем будут внедрены другие рабочие процессы и языки проекта. Это открытый исходный код и обеспечивает сквозной процесс от разработки до развертывания.

Почему стоит выбрать Gradle, а не Maven или Ant?

Более короткие сценарии

Gradle не использует XML и имеет тенденцию становиться неуправляемо большим, когда используется со всеми проектами, кроме очень маленьких. Вместо этого у него был собственный DSL на основе Groovy (один из языков JVM). В результате скрипты сборки Gradle имеют тенденцию быть намного короче и понятнее, чем написанные для Ant или Maven.

Возможности из коробки

У Gradle есть много задач, уже доступных из коробки или через плагины с открытым исходным кодом. Например, эта простая строка кода добавляет более 20 задач, ожидающих нас.

apply plugin: 'java'

гибкость

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

Быстрее

Три основные функции, которые делают Gradle намного быстрее, чем Maven или Ant:

  • Инкрементальность — Gradle избегает работы, отслеживая ввод и вывод задач и выполняя только то, что необходимо, и обрабатывая только те файлы, которые были изменены, когда это возможно.
  • Build Cache — повторно использует выходные данные сборки любой другой сборки Gradle с теми же входными данными, в том числе между машинами.
  • Gradle Daemon — долгоживущий процесс, который сохраняет информацию о сборке «горячей» в памяти.

Разработчик дружественный

Это приносит удобство основанного на Groovy DSL наряду с преимуществами Ant и Maven. С Gradle вы можете легко управлять процессом сборки и его логикой для создания нескольких версий вашего приложения. Это намного проще в использовании и намного более сжато и гибко, по сравнению с Ant или Maven.

Как создать свой первый Java-проект Gradle?

1. Запустите задачу Init

Gradle поставляется со встроенным плагином Build Init Plugin. Этот плагин выполняет много внутренних задач для создания встроенной структуры вашего Java-проекта. Теперь запустите команду:

mkdir demo-gradle
cd demo-gradle
gradle init –type java-application

init Задача выполняет задачу обертки первой, который генерирует  gradlew и  gradlew.bat оболочку сценариев и создает проект с базовой структурой. Он генерирует  build.gradle,   settings.gradle,   folder для обертки файлов исходной папки Java по умолчанию, папка теста Java по умолчанию.

build.gradle
 gradle
  wrapper
  gradle-wrapper.jar
  gradle-wrapper.properties
gradlew
gradlew.bat
settings.gradle
src
  main
   java
    App.java
test
 java
   AppTest.java

Теперь   settings.gradle присваивает имя корневого проекта  demo-gradle, который по умолчанию.

rootProject.name = 'demo-gradle'

Файл сборки добавляет плагины Java и приложений. Сгенерированный   build.gradle файл имеет много комментариев.

2. Создайте свой собственный файл Build.Gradle

Теперь  build.gradle файл может быть составлен на основе требований проекта.

apply plugin: java
repositories {
jcenter() // or mavenCentral(), google()
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
mainClassName = 'App'
dependencies {
compile 'com.google.guava:guava:21.0'
testCompile  'junit:junit:4.12'
}
jar{
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }}
manifest{
attributes 'Main-Class': ‘App’
}
}

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

В  sourceCompatibility и  targetCompatibilityмы определяем совместимость версий Java.

Управление зависимостями в Gradle

В Gradle зависимости группируются в именованный набор зависимостей. Эти группы называются конфигурациями, и мы используем их для объявления внешних зависимостей нашего проекта. Зависимости, добавленные в конфигурацию компиляции, требуются при компиляции нашего исходного кода нашего проекта. testCompile Конфигурация содержит зависимости, которые необходимы для составления тестов нашего проекта. Эта конфигурация содержит скомпилированные классы нашего проекта и зависимости, добавленные в конфигурацию компиляции.

 configuration group-id:artifact-id:version 

3. Выполнить сборку

Чтобы собрать проект, запустите команду build.

gradle build

Мы можем запустить обычную команду Gradle, но когда проект включает в себя скрипт Gradle, то лучше использовать его вместо этого.

При первом запуске сборки Gradle проверит, есть ли у вас библиотеки Guava и JUnit в вашем кэше в каталоге ~ / .gradle. Если нет, библиотеки будут загружены и сохранены там. При следующем запуске сборки будут использоваться кэшированные версии. Задача сборки компилирует классы, запускает тесты и генерирует отчет о тестировании.

4. Запустите приложение

gradle run

Задача запуска говорит Gradle выполнить метод main в классе, назначенном для  mainClassName свойства.

5. Интеграция с корзиной S3 с помощью пользовательских задач

Задачи являются краеугольным камнем в достижении цели в Gradle. Чтобы создать простую задачу Gradle, нам нужно добавить ее определение в наш  build.gradleфайл:

В блоке buildscript вы определяете параметры, необходимые для сборки вашего проекта, и syncContents создаете задачу с именем   для синхронизации содержимого с s3fs с помощью плагина ‘  jp.classmethod.aws.s3.’

buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath "jp.classmethod.aws:gradle-aws-plugin:0.+"
  }
}
import jp.classmethod.aws.gradle.s3.CreateBucketTask;
import jp.classmethod.aws.gradle.s3.SyncTask;
import com.amazonaws.services.s3.model.ObjectMetadata;
apply plugin: 'jp.classmethod.aws.s3'
aws {
  profileName = "test"
  region = 'ap-northeast-1'
}
// task to create the bucket.
task createBucket(type: CreateBucketTask) {
            bucketName "mybuc132"
            ifNotExists true
}
// task to sync the data.
task syncContents(type: SyncTask) {
            source file("build/libs") // must be directory
            bucketName "mybuc132"
            // to set all file's metadata "no-cache, no-store"
            metadataProvider { bucket, key, file ->
                        ObjectMetadata m = new ObjectMetadata()
                        m.setCacheControl("no-cache, no-store")
                        return m
            }
}

Чтобы выполнить эту конкретную задачу, нам нужно выполнить следующие команды:

gradle createBucket
gradle syncContents

Теперь у вас есть новый проект, который вы сгенерировали, используя плагин сборки Gradle. Наслаждайтесь!