Konstantin Shibkov

Ситуация — есть проект с Gradle надо создать jar со всеми зависимостями и запускать командой java -jar file . Еще называют такие сборки Fat Jar.
- Подключаем библиотеку Shadow
В файле build.gradle добавляйте в список плагинов Gradle Shadow. В readme в гитхабе уточните нужную вам версию.
id("com.github.johnrengelman.shadow") version "7.1.0"
plugins id 'java' id("com.github.johnrengelman.shadow") version "7.1.0" >
- Добавляем конфигурацию запуска
Минимально, в значении Main-Class необходимо указать, какой класс содержит main метод для запуска:
jar manifest attributes( 'Main-Class': 'ru.sendel.Main' ) > >
- Собираем jar
Осталось выполнить команду:
gradle clean shadowJar
и в директории build/libs/ появится fat jar.
Возможные ошибки
Если возникает ошибка:
FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':xxxxx:shadowJar'. > org.apache.tools.zip.Zip64RequiredException: archive contains more than 65535 entries. To build this archive, please enable the zip64 extension. See: http://gradle.org/docs/2.1/dsl/org.gradle.api.tasks.bundling.Zip.html#org.gradle.api.tasks.bundling.Zip:zip64
Причина этого — использование zip32 и у него ограничение на 65535 записей внутри архива. Необходимо в build.gradle добавить параметр для shadowJar включающий zip64:
shadowJar zip64 true >
Сборка Java-проекта с помощью Gradle
В этом посте мы создадим простейшее приложение на Java и соберем его с помощью системы сборки Gradle. Для этого от вас потребуется:
- Около 15 минут времени
- Любимый текстовый редактор
- JDK версии 6+
- Настройка проекта
- Установка Gradle
- Что может Gradle
- Сборка Java-проекта
- Работа с зависимостями
Настройка проекта
Сперва создадим простейшее приложение на Java, которое нам нужно будет собрать. Создайте следующую структуру каталогов в вашей папке с проектами:
simple_java_project_with_gradle/src/main/java/hello
И поместите туда два файла (HelloWorld.java и Greeter.java):
package hello; public class HelloWorld public static void main(String[] args) Greeter greeter = new Greeter(); System.out.println(greeter.sayHello()); > >
package hello; public class Greeter public String sayHello() return "Hello world!"; > >
Установка Gradle
Теперь, когда у нас есть простейший Java-проект, который мы хотим собрать, настало время установить Gradle. Gradle можно скачать в виде zip-архива тут. Нам нужны только бинарники, так что ищите ссылку на скачивание вида gradle-version-bin.zip. Также вы можете скачать gradle-version-all.zip, чтобы получить исходники и документацию в дополнение к бинарникам.
Распакуйте файл и добавьте путь к каталогу /bin в cистемную переменную PATH. Для того, чтобы протестировать установку, запустите из командной строки следующую команду:
gradle
Если все пойдет хорошо, вы увидите приветственное сообщение:
:help Welcome to Gradle 2.0. To run a build, run gradle . To see a list of available tasks, run gradle tasks To see a list of command-line options, run gradle --help BUILD SUCCESSFUL Total time: 2.675 secs You now have Gradle installed.
Это значит, что Gradle успешно установился на вашем компьютере.
Что может Gradle
Теперь, когда Gradle установлен, посмотрим, что он может. Для этого вам нужно спросить у Gradle, какие задачи вам доступны:
gradle tasks
Выполнив эту команду, вы сможете увидеть список доступных задач. Если вы запустите эту команду не из каталога, где есть build.gradle файл, скорее всего, вы увидите примерно такой список:
: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 ---------- dependencies - Displays all dependencies declared in root project 'user'. dependencyInsight - Displays the insight into a specific dependency in root proj ect 'user'. help - Displays a help message projects - Displays the sub-projects of root project 'user'. properties - Displays the properties of root project 'user'. tasks - Displays the tasks runnable from root project 'user'. To see all tasks and more detail, run with --all. BUILD SUCCESSFUL Total time: 2.718 secs
Сборка Java-проекта
Создадим простейший текстовый файл build.gradle, который поместим в корень нашего проекта. Добавим туда только лишь одну строку:
apply plugin: 'java'
Эта единственная строка в нашей конфигурации сборки проекта привносит огромное количество возможностей. Запустите команду ‘gradle tasks‘ снова и вы увидите новые задачи, добавленные в список, включая задачи для сборки проекта, создания Javadoc и выполнения unit-тестов.
Часто вы будете использовать задачу ‘gradle build‘. Эта задача компилирует программный код, запускает unit-тесты и собирает результаты компиляции в JAR-файлы. Вы можете запустить ее следующим образом:
gradle build
Через несколько секунд вы увидите сообщение “BUILD SUCCESSFUL”, подтверждающее, что сборка была завершена успешно. Для того, чтобы увидеть результаты сборки, загляните в каталог /build – вы увидите там несколько директорий, включая следующие:
- /classes – содержит cкомпилированные .class файлы проекта (включая наши HelloWorld.class и Greeter.class);
- /reports – содержит отчеты, созданные в результате сборки (например отчеты по выполнению unit-тестов);
- /libs – содержит создаваемые проектные библиотеки (обычно JAR- и/или WAR-файлы);
- /dependency_cache – содержит зависимости, необходимые для сборки (на данный момент проект не содержит никаких зависимостей и поэтому здесь ничего нет).
Работа с зависимостями
Наше простейшее приложение ‘Hello world!‘ полностью независимо от сторонних и дополнительных библиотек. Однако большинство приложений часто имеют зависимости от внешних библиотек при использовании уже готовой функциональности.
Для примера представим, что вы хотите, чтобы наше приложение в дополнение к строчке “Hello World!” печатало текущую дату и время. Для этих целей вы, конечно, можете использовать возможности JDK, но давайте используем возможности библиотеки 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 используется класс LocalTime из библиотеки Joda Time для получения текущего времени. Если вы сейчас запустите сборку с помощью задачи ‘gradle build‘, то увидите, что она завершится ошибкой. Это произойдет из-за того, что вы не объявили библиотеку Joda Time как компилируемую зависимость в файле build.gradle. Чтобы исправить это, вам нужно сперва добавить в build.gradle источник для сторонних библиотек (так называемых 3rd party libraries):
repositories
Блок repositories показывает, что при сборке все зависимости должны быть взяты из репозитория Maven Central. Gradle очень много взял от системы сборки Maven, включая возможность использовать Maven Central как источник зависимостей.
Теперь, когда мы готовы к использованию сторонних библиотек, давайте их объявим:
dependencies
В блоке dependencies вы объявляете единственную зависимость от Joda Time. Если говорить точнее, вы указываете (читая справа налево), что вам нужна версия 2.2 библиотеки joda-time в группе joda-time.
Еще стоит заметить, что данная зависимость имеет тип compile. Это означает, что она будет доступна во время компиляции (если вы будете собирать WAR-файл, она будет включена в соответствующий каталог /WEB-INF/libs).
Другие возможные типы зависимостей:
- providedCompile – зависимость требуется для компиляции, но предполагается, что в дальнейшем она будет поставляться контейнером, исполняющим код;
- testCompile – зависимость используется для компиляции и выполнения тестов, но не требуется на этапе выполнения программы.
Наконец, давайте зададим блок jar:
Блок jar определяет, как будет называться итоговый JAR-файл. В нашем случае сгенерится gs-gradle-0.1.0.jar. Если вы сейчас запустите сборку с помощью команды ‘gradle build‘, Gradle должен использовать зависимость Joda Time из репозитория Maven Central. В результате, сборка пройдет без ошибок.
Поздравляю вас – вы попробовали систему сборки Gradle в деле. Чтобы погрузиться в тему более обстоятельно, вы можете почитать официальное руководство.
Updated: May 06, 2015
Сборка Java-проекта с использованием Gradle
Этот урок освещает создание вами простого Java-приложения с использованием Gradle.
Что вы создадите
Вы создадите простое приложение и соберете его с помощью Gradle.
Что вам потребуется
- Примерно 15 минут свободного времени
- Любимый текстовый редактор или IDE
- JDK 6 и выше
Как проходить этот урок
Как и большинство уроков по Spring, вы можете начать с нуля и выполнять каждый шаг, либо пропустить базовые шаги, которые вам уже знакомы. В любом случае, вы в конечном итоге получите рабочий код.
Чтобы начать с нуля, перейдите в Настройка проекта.
- Загрузите и распакуйте архив с кодом этого урока, либо кнонируйте из репозитория с помощью Git: git clone https://github.com/spring-guides/gs-gradle.git
- Перейдите в каталог gs-gradle/initial
- Забегая вперед, установите Gradle
Когда вы закончите, можете сравнить получившийся результат с образцом в gs-gradle/complete .
Настройка проекта
Для начала вам необходимо настроить Java-проект перед тем, как собрать его Gradle’ом. Т.к. урок посвящен Gradle, сделаем проект максимально простым, насколько это возможно.
Создание структуры каталогов
В выбранном вами каталоге проекта создайте следующую структуру каталогов; к примеру, командой mkdir -p src/main/java/hello для *nix систем:
└── src └── main └── java └── hello
Внутри src/main/java/hello директории вы можете создать любые Java-классы, какие вы хотите. Для простоты и согласованности с остальной частью урока, Spring рекомендует вам создать два класса: HelloWorld.java и Greeter.java .
package hello; public class HelloWorld < public static void main(String[] args) < Greeter greeter = new Greeter(); System.out.println(greeter.sayHello()); >>
package hello; public class Greeter < public String sayHello() < return "Hello world!"; >>
Установка Gradle
Теперь, когда у вас есть проект, который вы можете собрать с Gradle, вам нужно установит сам Gradle.
Gradle можно получить, скачав zip-файл с gradle.org/downloads. Необходимы только бинарные файлы, так что ищите ссылку на архив с именем gradle-version-bin.zip. (Вы также можете выбрать gradle-version-all.zip, тем самым получите исходники, документацию и бинарные файлы.)
Распакуйте архив и добавьте путь к каталогу bin в переменную окружения path.
Чтобы протестировать правильность установки Gradle, запустите в командной строке:
gradle
Если всё было сделано правильно, то вы увидите сообщение:
:help Welcome to Gradle 1.8. To run a build, run gradle . To see a list of available tasks, run gradle tasks To see a list of command-line options, run gradle --help BUILD SUCCESSFUL Total time: 2.675 secs
Теперь у вас есть установленный Gradle.
Что может делать Gradle
Теперь, когда Gradle установлен, посмотрим, что он может делать. Прежде, чем вы создадите build.gradle для проекта, выможете проверить, какие доступны задачи:
gradle tasks
Вы должны увидеть список доступных задач. Если вы запустите Gradle в каталоге, в котором нет ещё файла build.gradle, то увидите несколько самых элементарных задач:
:tasks == All tasks runnable from root project == Build Setup tasks setupBuild - Initializes a new Gradle build. [incubating] wrapper - Generates Gradle wrapper files. [incubating] == Help tasks dependencies - Displays all dependencies declared in root project 'gs-gradle'. dependencyInsight - Displays the insight into a specific dependency in root project 'gs-gradle'. help - Displays a help message projects - Displays the sub-projects of root project 'gs-gradle'. properties - Displays the properties of root project 'gs-gradle'. tasks - Displays the tasks runnable from root project 'gs-gradle'. To see all tasks and more detail, run with --all. BUILD SUCCESSFUL Total time: 3.077 secs
Не смотря на то, что эти задачи доступны, они не представляют большого значения без конфигурации для сборки проекта. С build.gradle файлом, некоторые задачи будут более полезны. Список задач будет увеличиваться при добавлении плагинов в build.gradle , таким образом вы будете время от времени запускать tasks, чтобы проверить, какие задачи доступны.
Говоря о добавлении плагинов, в следующей части урока вы добавите плагин, который отвечает за базовую функциональность сборки Java-проектов.
Сборка Java кода
Начнем с простого, создадим очень простой build.gradle в корневой папке проекта(там, где src), который содержит только одну строчку:
apply plugin: 'java'
Эта единственная строчка в конфигурации сборки приносит значительную пользу. Запустите gradle tasks снова и вы увидите новые задачи в списке, включая задачи для сборки проекта, создания JavaDoc и запуска тестов.
Вы будете изпользовать задачу gradle build достаточно часто. Эта задача компилирует, тестирует и упаковывает код в JAR-файл. Вы можете запустить её таким образом:
gradle build
Через несколько секунд, «BUILD SUCCESSFUL» будет означать, что сборка прошла успешно.
- classes. Скомпилированные .class файлы
- reports. Отчеты в течении сборки(такие как отчеты о тестировании)
- libs. Библиотеки для сборки проекта(обычно в виде JAR и/или WAR файлов)
Классы в каталоге с .class файлами генерируются во время сборки Java-кода. Соответственно, вы должны найти там HelloWorld.class и Greeter.class.
На данный момент проект не имеет зависимостей от библиотек, поэтому ничего нет в папке dependency_cache.
Каталог отчетов должен содержать отчет о выполнении тестов для проекта. Т.к. проект пока не содержит тестов, данный отчет будет нам неинтересен.
Каталог библиотек должен содержать JAR-файл с названием каталога проекта. В дальнейшем, вы увидите, как указывать имя JAR-файла и его версию.
Объявление зависимостей
Простой «Hello World» пример полностью автономный и не зависит от каких-либо дополнительных библиотек. Однако, большинство приложений зависит от внешних библиотек, с реализацией распостраненного и/или сложного функционала.
К примеру, предположим, что в дополнение к «Hello World!» вы хотите, чтобы приложение печатало текущую дату и время. Вы могли бы использовать функциональность из стандартных(native) Java библиотек, но мы можем сделать это и другими интересными способами, например с помощью 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 компилируемую зависимость в сборке.
Во-вторых, вам необходимо добавить источники сторонних библиотек:
repositories
Блок repositories означает, что сборка должна разрешать зависимости из Maven Central репозитория. Gradle опирается в основном на многие соглашения и возможности, определенные в инструменте сборки Maven, включая использование Maven Central как источник библиотек зависимостей.
Теперь, когда мы готовы к приему сторонних библиотек, объявим их:
dependencies
В блоке dependencies вы описываете единственную зависимость Joda Time. В частности, вы запрашиваете(читаем справа на лево) версию 2.2 библиотеки joda-time в joda-time группе.
Другое, что хотелось бы отметить, это необходимость указания ключевого слова compile , обозначающее доступность библиотеки во время компиляции(а если бы вы собирали WAR файл, то была бы включена /WEB-INF/libs папка в WAR). Также существуют другие заметные ключевые слова, среди которых:
- providedCompile . Требуемые зависимости для компиляции кода, но которые будут доступны во время работы кода контейнера(например, Java Servlet API)
- testCompile . Зависимости, используемые для компиляции и запуска тестов, но не требуемые для компиляции и запуска кода проекта
И наконец, назначим имя для нашего JAR артефакта.
jar блок определяет, как JAR файл будет назван. В данном случае мы получим gs-gradle-0.1.0.jar .
Теперь, если мы запустим 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)
Запустите следующую команду для загрузки и инициализации wrapper-скриптов:
gradle wrapper
После того, как задачи отработают, вы заметите несколько новых файлов. Два скрипта в корневом каталоге, а jar-файл и properties-файл оболочки будут в папке gradle/wrapper .
└── initial └── gradlew └── gradlew.bat └── gradle └── wrapper └── gradle-wrapper.jar └── gradle-wrapper.properties
Gradle Wrapper теперь доступен вам для сборки проекта. Добавьте его в вашу систему контроля версий и каждый, кто клонирует ваш проект, сможет его собрать точно таким же способом. Gradle Wrapper можно использовать наравне с установленным Gradle. Pfgecnbnt 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:16:20.544 Hello world! BUILD SUCCESSFUL Total time: 3.798 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' // tag::repositories[] repositories < mavenLocal() mavenCentral() >// end::repositories[] // tag::jar[] jar < baseName = 'gs-gradle' version = '0.1.0' >// end::jar[] // tag::dependencies[] dependencies < compile "joda-time:joda-time:2.2" >// end::dependencies[] // tag::wrapper[] task wrapper(type: Wrapper) < gradleVersion = '1.11' >// end::wrapper[]
Здесь присутствует много закомментированных открывающихся и закрывающихся вставок. Они позволяют разделить на части файл сборки для наглядного объяснения данного урока. Их необязательно использовать в вашем рабочем файле сборки.
Итог
Поздравляем! Вы создали простой, но эффективный файл сборки Gradle для сборки Java проектов.
С оригинальным текстом урока вы можете ознакомиться на spring.io.
Gradle — создайте файл Jar с зависимостями
В этом уроке мы покажем вам, как использовать инструмент сборки Gradle для создания одного Jar-файла с зависимостями.
- Gradle 2.0
- JDK 1,7
- Logback 1.1.2
1. Каталог проектов
Создайте следующую структуру папок проекта:

По умолчанию Gradle использует стандартную структуру проекта Maven.
- $ / SRC / главная / Java /
- $ / SRC / основные / ресурсы /
- $ / SRC / тест / Java /
2. Java-файлы
Единственный файл Java для распечатки текущей даты и времени, и регистрирует сообщение с logback.
package com.mkyong; import java.util.Date; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DateUtils< private static final Logger logger = LoggerFactory.getLogger(DateUtils.class); public static void main(String[] args) < logger.debug("[MAIN] Current Date : <>", getCurrentDate()); System.out.println(getCurrentDate()); > private static Date getCurrentDate() < return new Date(); >>
%-5level %logger - %msg%n
3. build.gradle
build.gradle Образец для создания файла Jar вместе с зависимостями logback.
apply plugin: 'java' apply plugin: 'eclipse' version = '1.0' sourceCompatibility = 1.7 targetCompatibility = 1.7 // создаем один Jar со всеми зависимостями task fatJar(type: Jar) < manifest < attributes 'Implementation-Title': 'Gradle Jar File Example', 'Implementation-Version': version, 'Main-Class': 'com.csharpcoderr.DateUtils' >baseName = project.name + '-all' from < configurations.compile.collect < it.isDirectory() ? it : zipTree(it) >> with jar > // Получаем зависимости из центрального репозитория Maven repositories < mavenCentral() >// Зависимости проекта dependencies
4. Создайте файл Jar
$ gradle clean
Запустите Градл fatJar задача.
$ gradle fatJar :compileJava :processResources :classes :fatJar BUILD SUCCESSFUL Total time: 6.4 secs
Баночка создана под $project/build/libs/ папка.

5. Запустите его
Запустить его — java -jar hello-all-1.0.jar ,
$Projectbuildlibs> java -jar hello-all-1.0.jar 16:22:13,249 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy] 16:22:13,249 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml] // . DEBUG com.csharpcoderr.DateUtils - [MAIN] Current Date : Wed Aug 27 16:22:13 SGT 2014 Wed Aug 27 16:22:13 SGT 2014
Скачать исходный код
Рекомендации
- Gradle: Jar Task
- Википедия: Gradle