пятница, 10 июня 2016 г.

Сборка java проектов Gradle

В заметки дано краткое описание как начать собирать java проекты при помощи Gradle.

Установка Gradle

Для установки Gradle, вам нужно установит сам Gradle.

Gradle можно получить, скачав zip-файл с gradle.org/downloads. Необходимы только бинарные файлы, так что ищите ссылку на архив с именем gradle-version-bin.zip. (Вы также можете выбрать gradle-version-all.zip, тем самым получите исходники, документацию и бинарные файлы.)

Распакуйте архив и добавьте путь к каталогу bin в переменную окружения path. Для этого заходим в  Компьютер (правой кнопкой) - Свойства  - Дополнительные параметры системы - Переменные среды – в верхнем окошке нажимаем Создать, вводим имя G_HOME и значение папку установки gradle "d:\gradle-2.13". Далее там же создаем еще одну переменную G со значением %G_HOME%\bin. Так же убеждаемся, что есть переменная JAVA_HOME с путем к JDK. Ее значение должно быть примерно таким «c:\Java\jdk1.8.0_91\». И наконец в том же окошке создаем/модифицируем переменную Path, в нее необходимо просто написать %G%, чтобы наша папочка с исполняемым файлом gradle была видна из командной строки. Теперь необходимо проверить работоспособность нашей установки. Для этого заходим в командную строку и вводим команду

gradle

Если всё было сделано правильно, то вы увидите сообщение:

:help
Welcome to Gradle 2.13.
To run a build, run gradle <task> ...
To see a list of available tasks, run gradle tasks
To see a list of command-line options, run gradle --help
To see more detail about a task, run gradle help --task <task>
BUILD SUCCESSFUL
Total time: 10.124 secs

Теперь у вас есть установленный Gradle. Можно приступить к его настройке.

Настройка proxy Gradle

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

В window нужно перейти в паку c:\Users\<USER_NAME>\.gradle\gradle.properties и в нем прописать
systemProp.http.proxyHost=www.proxyhost.org 
systemProp.http.proxyPort=8080 
systemProp.http.proxyUser=userid 
systemProp.http.proxyPassword=password systemProp.http.nonProxyHosts=*.nonproxyrepos.com|localhost
systemProp.https.proxyHost=www.proxyhost.org 
systemProp.https.proxyPort=8080 
systemProp.https.proxyUser=userid 
systemProp.https.proxyPassword=password systemProp.https.nonProxyHosts=*.nonproxyrepos.com|localhost
socksProxyHost=www.proxyhost.org 
socksProxyPort=8080 

Также используя gradlew можно прописать настройки через команды.

Конфигурация только для HTTP

gradlew -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=3128

Конфигурация только для HTTPS

gradlew -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=3129

Конфигурация только для  HTTP и HTTPS

gradlew -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=3128 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=3129

Использование Gradle 

Прежде чем приступать к разработке проекта и созданию скриптов сборки. Посмотрим стандартные задачи gradle.

Для этого выполним команду

gradle tasks

В результате получим

:tasks
------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------
Build Setup tasks
-----------------
init - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]
Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root projec
t 'gradletest'.
components - Displays the components produced by root project 'gradletest'. [inc
ubating]
dependencies - Displays all dependencies declared in root project 'gradletest'.
dependencyInsight - Displays the insight into a specific dependency in root proj
ect 'gradletest'.
help - Displays a help message.
model - Displays the configuration model of root project 'gradletest'. [incubati
ng]
projects - Displays the sub-projects of root project 'gradletest'.
properties - Displays the properties of root project 'gradletest'.
tasks - Displays the tasks runnable from root project 'gradletest'.
To see all tasks and more detail, run gradle tasks --all
To see more detail about a task, run gradle help --task <task>
BUILD SUCCESSFUL
Total time: 6.936 secs

Создадим скрипт hello world. Для этого создадим каталог проекта testgradle. В нем создадим файл build.gradle и внесем в него
task hello { 
    doLast { 
        println "hello world" 
    } 
}
И запустим его командой

gradle hello

В итоге получим

:hello
hello world

BUILD SUCCESSFUL

Total time: 2.705 secs

Рассмотрим более сложный пример. Создадим в каталоге testgradle следующую структуру:

└── src
         └── main
                  └── java
                           └── hello


Внутри src/main/java/hello создадим Java-классы. Для простоты создадим два класса: HelloWorld.java и Greeter.java.

src/main/java/hello/HelloWorld.java

package hello; 
public class HelloWorld { 
    public static void main(String[] args) { 
        Greeter greeter = new Greeter(); 
        System.out.println(greeter.sayHello()); 
    } 
}
src/main/java/hello/Greeter.java


package hello; 
public class Greeter { 
    public String sayHello() { 
        return "Hello world!"; 
    } 
}



Создадим очень простой build.gradle в корневой папке проекта(там, где src), который содержит только одну строчку:

apply plugin: 'java'

Эта единственная строчка в конфигурации сборки приносит значительную пользу. Запустите gradle tasks снова и вы увидите новые задачи в списке, включая задачи для сборки проекта, создания JavaDoc и запуска тестов.

Задача gradle build будет выполняться достаточно часто. Эта задача компилирует, тестирует и упаковывает код в JAR-файл. Вы можете запустить её таким образом:

gradle build

В результате получим

:compileJava
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build
BUILD SUCCESSFUL
Total time: 8.191 secs

"BUILD SUCCESSFUL" в конце означает, что сборка прошла успешно.

Чтобы увидеть результаты сборки, посмотрите на содержимое каталога build. Здесь вы найдете несколько директорий, среди которых три наиболее значимые:

classes - Скомпилированные .class файлы
reports - Отчеты в течении сборки(такие как отчеты о тестировании)
libs - Библиотеки для сборки проекта(обычно в виде JAR и/или WAR файлов)

Классы в каталоге с .class файлами генерируются во время сборки Java-кода. Соответственно, вы должны найти там HelloWorld.class и Greeter.class.

На данный момент проект не имеет зависимостей от библиотек, поэтому ничего нет в папке dependency_cache.

Каталог отчетов должен содержать отчет о выполнении тестов для проекта. Т.к. проект пока не содержит тестов, данный отчет будет нам неинтересен.

Каталог библиотек должен содержать JAR-файл с названием каталога проекта. В дальнейшем, вы увидите, как указывать имя JAR-файла и его версию.

Простой пример полностью автономный и не зависит от каких-либо дополнительных библиотек. Однако, большинство приложений зависит от внешних библиотек, с реализацией распостраненного и/или сложного функционала.

Добавим в наш пример библиотеку Joda Time для отображения времени.

Во первых, изменим HelloWorld.java, как показано ниже:
package hello; 
import org.joda.time.LocalTime; 
public class HelloWorld { 
    public static void main(String[] args) { 
        LocalTime currentTime = new LocalTime(); 
        System.out.println("The current local time is: " + currentTime); 
        Greeter greeter = new Greeter(); 
        System.out.println(greeter.sayHello()); 
    } 
}
Здесь HelloWorld использует Joda Time LocalTime класс для получения и печати текущего времени.

Если бы вы запустили gradle build для сборки проекта сейчас, то получили бы ошибку сборки, потому что вы не объявили Joda Time компилируемую зависимость в сборке.

Во-вторых, необходимо добавить источники сторонних библиотек build.gradle:
repositories { 
    mavenLocal() 
    mavenCentral() 
}
Блок repositories означает, что сборка должна разрешать зависимости из Maven Central репозитория. Gradle опирается в основном на многие соглашения и возможности, определенные в инструменте сборки Maven, включая использование Maven Central как источник библиотек зависимостей.

Теперь объявим библиотеку joda-time:

dependencies { 
    compile "joda-time:joda-time:2.2" 
}
В блоке dependencies описана единственная зависимость Joda Time. В частности, запрашивается(читаем справа налево) версию 2.2 библиотеки joda-time в joda-time группе.

Ключевого слова compile, обозначающее доступность библиотеки во время компиляции(а если бы собирался WAR файл, то была бы включена /WEB-INF/libs папка в WAR). Также существуют другие заметные ключевые слова, среди которых:
providedCompile - Требуемые зависимости для компиляции кода, но которые будут доступны во время работы кода контейнера(например, Java Servlet API)
testCompile - Зависимости, используемые для компиляции и запуска тестов, но не требуемые для компиляции и запуска кода проекта

И наконец, назначим имя для нашего JAR артефакта.

jar { 
    baseName = 'gs-gradle' 
    version = '0.1.0' 
}
jar блок определяет, как JAR файл будет назван. В данном случае мы получим gs-gradle-0.1.0.jar.

В итоге build.gradle примет вид

apply plugin: 'java'

repositories {
    mavenLocal()
    mavenCentral()
}

dependencies {
    compile "joda-time:joda-time:2.2"
}

jar {
    baseName = 'gs-gradle'
    version =  '0.1.0'
}

Теперь, если мы запустим gradle build, Gradle должен будет загрузить Joda Time зависимость из репозитория Maven Central и успешно собрать проект.

Сборка проекта с Gradle Wrapper

Gradle Wrapper является предпочтительным способом для Gradle сборки. Он содержит bat-скрипты для Windows и shell-скрипты для OS X и Linux. Эти скрипты позволяют запускать сборку с Gradle без необходимости установки самого Gradle в вашу систему. Чтобы это стало возможным, добавьте следующий блок в конец build.gradle:
task wrapper(type: Wrapper) { 
    gradleVersion = '1.11' 
}
Запускаем команду для загрузки и инициализации wrapper-скриптов:
gradle wrapper

После того, как задачи отработают, появится несколько новых файлов. Два скрипта в корневом каталоге, а jar-файл и properties-файл оболочки будут в папке gradle/wrapper.
└── initial 
         └── gradlew
         └── gradlew.bat
         └── gradle
                  └── wrapper
                           └── gradle-wrapper.jar
                           └── gradle-wrapper.properties
Gradle Wrapper теперь доступен для сборки проекта. Добавим его в систему контроля версий и каждый, кто клонирует проект, сможет его собрать точно таким же способом. Gradle Wrapper можно использовать наравне с установленным Gradle. Wrapper-скрипт для выполнения задачи сборки точно так же, как и ранее:

./gradlew build

Ранее, когда запускался wrapper с конкретной версией Gradle, он загружал и кешировал бинарники Gradle для соответствующей версии. Gradle Wrapper спроектирован таким образом, чтобы было возможно сохранить его в репозитории VCS и любой, кто его клонирует, сможет собрать проект без необходимости устанавливать и настраивать Gradle определенной версии.

В результате будет так:
build 
├── classes 
│      └── main 
│               └── hello 
│                        ├── Greeter.class 
│                        └── HelloWorld.class 
├── dependency-cache 
├── libs 
│      └── gs-gradle-0.1.0.jar 
└── tmp 
        └── jar
                └── MANIFEST.MF
В сборке содержатся два класса Greeter и HelloWorld, как и ожидалось, а также JAR-файл. Окиньте беглым взглядом:

$ jar tvf build/libs/gs-gradle-0.1.0.jar 
0 Fri May 30 16:02:32 CDT 2014 META-INF/ 
25 Fri May 30 16:02:32 CDT 2014 META-INF/MANIFEST.MF 
0 Fri May 30 16:02:32 CDT 2014 hello/ 
369 Fri May 30 16:02:32 CDT 2014 hello/Greeter.class 
988 Fri May 30 16:02:32 CDT 2014 hello/HelloWorld.class
Это содержимое пакета файлов классов. Важно отметить, что даже, если вы и объявили joda-time как зависимость, библиотека не включена в пакет. И JAR-файл будет неспособен к выполнению.

Чтобы сделать этот код выполняемым, мы можем использовать плагинapplication. Добавьте его в build.gradleфайл.

apply plugin: 'application' 
 mainClassName = 'hello.HelloWorld'
Затем просто запустим приложение командой gradlew run

:compileJava UP-TO-DATE 
:processResources UP-TO-DATE 
:classes UP-TO-DATE 
:run The current local time is: 16:12:51.978 
Hello world! 
BUILD SUCCESSFUL 
Total time: 5.035 secs

Остановимся подробнее на упаковке зависимостей. К примеру, если бы мы собирали WAR-файл, общепризнанный формат, ассоциирующийся с упаковкой сторонних зависимостей, мы бы могли использовать WAR плагин. Если вы используете Spring Boot и хотите получить исполняемый JAR-файл, тогда вам пригодится spring-boot-gradle-plugin. На данном этапе, gradle недостаточно знает о выбранной вами системе. Но этого достаточно, чтобы приступить к работе с gradle.

В конечном счете, у вас должен получиться такой build.gradle файл:


apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'application'
mainClassName = 'hello.HelloWorld'
repositories {
    mavenLocal()
    mavenCentral()
}
dependencies {
    compile "joda-time:joda-time:2.2"
}
jar {
    baseName = 'gs-gradle'
    version =  '0.1.0'
}
task wrapper(type: Wrapper) {
    gradleVersion = '1.11'
}

Gradle в Eclipse

Поддержкой Gradle в Eclipse занимается SpringSource, предоставляя ее в виде плагина из набора STS (Spring Tool Suite), поэтому надо поставить их. Проще всего это сделать через Eclipse Marketplace, специальную систему распространения плагинов. В запущенном Eclipse:
  1. Help → Eclipse Market place
  2. Ищем gradle sts
  3. В предложенном списке находим версию для используемого Eclipse. В нашем случае это "Gradle (STS) Integration for Eclipse 3.7.3.RELEASE".
  4. Нажимаем кнопку Install
  5. Проходим стандартную процедуру установки плагинов.

После перезагрузки надо поставить поддержку Gradle:
  1. Help → Install New Software 
  2. В выпадающем списке Work with: выбираем "http://dist.springsource.com/release/TOOLS/update/e4.3/"
  3. Отмечаем: Core / Eclipse integration for Gradle и Groovy-Eclipse (все элементы) (поддержка Groovy нужна для редактирования gradle-файлов)
  4. Нажимаем Next и проходим стандартную процедуру установки плагинов.

Перезагружаем Eclipse.

Теперь надо указать используемую версию Gradle, иначе Eclipse будет применять устаревшую 1.7:
  1. Windows → Preferences
  2. На странице настроек Gradle указываем Gradle Distribution, Folder и выбираем папку установки Gradle 
  3. Нажимаем Ok.
Загрузка проекта нашего проекта
  1. File → Import
  2. В списке выбираем Gradle/Gradle Project. Нажимаем Next
  3. Выбираем Root Folder с проектом. В данном случае это samples/eclipse. 
  4. Нажимаем кнопку Build Model. После этого в списке проектов появится проект "eclipse"
  5. Нажимаем Finish
Eclipse загрузить проект. Далее с ним можно работать как с обычным проектом.

Для запуска отдельных задач сборки можно использовать Window - Show view - Other - Gradle Tasks.

Gradle в NetBeans

Для работы с gradle проектами в NetBeans необходимо установить плагин. Для этого Tools - Plugins - Available plugins в поиске вводим gradle. Отмечаем Gradle Support и устанавливаем его.
После установки нужно указать где стоит gradle для этого Tools - Options - Miscellaneous - Gradle - Gradle Installation directory.
Теперь откроем проект для этого Open project и выбираем наш проект. Он появится в дереве проектов.
Теперь правой кнопкой на проект и выбираем Custom tasks - Custom tasks вводим run проект запускается.

Ссылки по теме

http://spring-projects.ru/guides/gradle/ - Сборка Java-проекта с использованием Gradle

https://docs.gradle.org/current/release-notes - Gradle Release Notes

http://codetutr.com/2013/03/27/configuring-gradle-behind-a-proxy/ - Configuring Gradle behind a Proxy

http://stackoverflow.com/questions/5991194/gradle-proxy-configuration - Gradle proxy configuration

http://stackoverflow.com/questions/26523804/global-gradle-proxy-settings - Global gradle proxy settings?

http://programador.ru/in-the-gradle/ - Про Gradle для любопытных

https://www.youtube.com/watch?v=JgaQ3GRdYg0 - gradle netbeans


http://dev-blogs.com/gradle-plugin-for-eclipse/ - Установка gradle плагина

eclipsehttp://javacore.ru/topic/111-gradle.htm - Импорт Gradle проекта в Eclipse

http://vygovskiy.com/xwiki/bin/view/Main/Eclipse+%D0%B8+Gradle - Eclipse и Gradle

https://habrahabr.ru/post/192268/ - Gradle и решение задач автоматизации

3 комментария:

  1. Как Вы думаете если сейчас начинать проект, это лучше сделать на Maven или Gradle?

    ОтветитьУдалить
  2. На мой взгляд Gradle вне конкуренции, лучше на нем.

    ОтветитьУдалить
  3. Блог О Быдло Разработке Программного Обеспечения: Сборка Java Проектов Gradle >>>>> Download Now

    >>>>> Download Full

    Блог О Быдло Разработке Программного Обеспечения: Сборка Java Проектов Gradle >>>>> Download LINK

    >>>>> Download Now

    Блог О Быдло Разработке Программного Обеспечения: Сборка Java Проектов Gradle >>>>> Download Full

    >>>>> Download LINK dY

    ОтветитьУдалить