Создание runnable JAR с Gradle

До сих пор я создал исполняемые файлы JAR через функциональность Eclipse «Export …», но теперь я переключился на IntelliJ IDEA и Gradle для автоматизации сборки.

Некоторые статьи здесь предлагают плагин «приложение», но это не полностью приводит к ожидаемому результату (просто JAR, ни стартовым скриптам, ни тому подобное).

Как я могу достичь того же результата, что и Eclipse с диалогом «Экспорт …»?

Исполняемый файл jar – это только файл jar, содержащий запись Main-Class в манифесте. Поэтому вам просто нужно настроить задачу jar , чтобы добавить эту запись в свой манифест:

jar { manifest { attributes 'Main-Class': 'com.foo.bar.MainClass' } } 

Вам также может потребоваться добавить записи classа в манифест, но это будет сделано точно так же.

См. http://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html.

Ответы JB Nizet и Jorge_B верны.

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

Плагин приложения предоставляет альтернативный подход; вместо создания исполняемого JAR, он обеспечивает:

  • задача run облегчающая простое выполнение приложения непосредственно из сборки
  • задача installDist которая создает структуру каталогов, включая встроенный JAR, все JAR, от которых он зависит, и сценарий запуска, который объединяет все это в программу, которую вы можете запустить
  • distZip и distTar которые создают архивы, содержащие полный дистрибутив приложения (сценарии запуска и JAR)

Третий подход заключается в создании так называемого «живого JAR», который является исполняемым JAR, который включает не только код вашего компонента, но и все его зависимости. Существует несколько различных плагинов, которые используют этот подход. Я включил ссылки на несколько, о которых я знаю; Я уверен, что их больше.

  • тень
  • один-банка
  • весна-загрузка
  • капсула

Как отмечали другие, для того чтобы файл jar был выполнен, точка входа приложения должна быть установлена ​​в атрибуте Main-Class файла манифеста. Если файлы classа зависимостей не размещены, то они должны быть установлены в записи Class-Path файла манифеста.

Я пробовал всевозможные комбинации плагинов и что не для простой задачи создания исполняемого банку и каким-то образом, include зависимости. Кажется, что у всех плагинов так или иначе не хватает, но, наконец, я получил его, как хотел. Никаких таинственных сценариев, а не миллион различных мини-файлов, загрязняющих каталог сборки, довольно чистый файл сценария сборки и, прежде всего: не миллион иностранных файлов сторонних classов, объединенных в мой архив jar.

Ниже приведена копия отсюда для вашего удобства ..

[How-to] создайте zip-файл дистрибутива с баночками зависимостей в подкаталоге /lib и добавьте все зависимости к записи Class-Path в файле манифеста:

 apply plugin: 'java' apply plugin: 'java-library-distribution' repositories { mavenCentral() } dependencies { compile 'org.apache.commons:commons-lang3:3.3.2' } // Task "distZip" added by plugin "java-library-distribution": distZip.shouldRunAfter(build) jar { // Keep jar clean: exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.MF' manifest { attributes 'Main-Class': 'com.somepackage.MainClass', 'Class-Path': configurations.runtime.files.collect { "lib/$it.name" }.join(' ') } // How-to add class path: // https://stackoverflow.com/questions/22659463/add-classpath-in-manifest-using-gradle // https://gist.github.com/simon04/6865179 } 

Здесь размещен как сущность.

Результат можно найти в build/distributions а распакованное содержимое выглядит следующим образом:

Lib / Обще-lang3-3.3.2.jar
MyJarFile.jar

Содержание MyJarFile.jar#META-INF/MANIFEST.mf :

Манифест-версия: 1.0
Основной class: com.somepackage.MainClass
Класс-путь: lib / commons-lang3-3.3.2.jar

Меньше усилий для меня было использовать плагин gradle-shadow-plugin

Помимо применения плагина, все, что нужно сделать, это:

  • Настройте задачу jar, чтобы показать свой основной class

    jar {manifest {attributes ‘Main-Class’: ‘com.my.app.Main’}}

  • запустите задачу gradleиента ./gradlew shadowJar

  • возьмите app-version-all.jar из сборки / libs /

И, наконец, выполните его через:

 java -jar app-version-all.jar 

Вы пробовали задачу installApp? Не создает ли полный каталог с набором стартовых скриптов?

http://www.gradle.org/docs/current/userguide/application_plugin.html

Вы можете определить артефакт jar в настройках модуля (или структуры проекта).

  • Щелкните правой кнопкой мыши модуль> Открыть настройки модуля> Артефакты> +> JAR> из модhive с зависимостями.
  • Установите основной class.

Сделать банку так же просто, как нажать «Сборка артефакта …» в меню «Построение». В качестве бонуса вы можете упаковать все зависимости в одну банку.

Протестировано на IntelliJ IDEA 14 Ultimate.

Спасибо, Константин, он работал как шарм с несколькими нюансами. По какой-то причине указание основного classа как части манифеста jar не совсем сработало, и вместо этого ему понадобился атрибут mainClassName. Вот fragment из build.gradle, который включает все, чтобы заставить его работать:

 plugins { id 'java' id 'com.github.johnrengelman.shadow' version '1.2.2' } ... ... apply plugin: 'application' apply plugin: 'com.github.johnrengelman.shadow' ... ... mainClassName = 'com.acme.myapp.MyClassMain' ... ... ... shadowJar { baseName = 'myapp' } 

После запуска gradle shadowJar вы получите myapp- {version} -all.jar в своей папке сборки, которую можно запустить как java -jar myapp- {version} -all.jar.

Я проверил довольно некоторые ссылки для решения, наконец, сделал следующие шаги, чтобы заставить его работать. Я использую Gradle 2.9.

Внесите следующие изменения в файл сборки:

  1. Указать плагин:

     apply plugin: 'eu.appsatori.fatjar' 
  2. Предоставьте Buildscript:

     buildscript { repositories { jcenter() } dependencies { classpath "eu.appsatori:gradle-fatjar-plugin:0.3" } } 
  3. Обеспечить основной class:

     fatJar { classifier 'fat' manifest { attributes 'Main-Class': 'my.project.core.MyMainClass' } exclude 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.SF' } 
  4. Создайте fatjar:

     ./gradlew clean fatjar 
  5. Запустите fatjar из / build / libs /:

     java -jar MyFatJar.jar 
  • Windows 7 - Как подключить .jar к панели задач?
  • Java: Найти .txt файлы в указанной папке
  • Почему == сравнения с Integer.valueOf (String) дают разные результаты для 127 и 128?
  • Должен ли я вызвать ugi.checkTGTAndReloginFromKeytab () перед каждым действием на hadoop?
  • Вызов метода Spring @Transaction методом одного и того же classа не работает?
  • Как заставить stream Java ждать выхода другого streamа?
  • session.connection () не рекомендуется в Hibernate?
  • Является ли метод ссылки кэширования хорошей идеей в Java 8?
  • Перегрузка с другим возвращаемым типом в Java?
  • Как ограничить setAccessible только «законным» использованием?
  • Доступ к частному полю другого объекта в том же classе
  • Interesting Posts

    Последующий удаленный nohup с tcsh

    Мышь случайно замерзает около 20 секунд в Ubuntu 10.10, пожалуйста, помогите устранить неисправность

    Как можно импортировать только переменные и миксины из таблиц стилей Scss?

    Можно ли удалить системный раздел системы Windows 7 без проблем?

    Строка Parsing на локальную дату не использует желаемый век

    Android: местоположение Google Maps с низким уровнем использования батареи

    Может ли кто-нибудь объяснить RAID-0 на простом английском языке?

    Windows 10 numlock автоматически отключается через 5 секунд бездействия

    Android-хост и скрытые устройства USB

    Какова цель установки ключа в data.table?

    Предотrotation кэширования iframe в браузере

    Могу ли я сделать этот макрос более эффективным или быстрым?

    Правильный способ использования JQuery при использовании MasterPages в ASP.NET?

    Передача данных между fragmentами в действие

    Получите данные Exif от UIImage – UIImagePickerController

    Давайте будем гением компьютера.