Создание runnable JAR с Gradle
До сих пор я создал исполняемые файлы JAR через функциональность Eclipse «Export …», но теперь я переключился на IntelliJ IDEA и Gradle для автоматизации сборки.
Некоторые статьи здесь предлагают плагин «приложение», но это не полностью приводит к ожидаемому результату (просто JAR, ни стартовым скриптам, ни тому подобное).
Как я могу достичь того же результата, что и Eclipse с диалогом «Экспорт …»?
- Netty против Apache MINA
- Как вычесть X-день из объекта Date в Java?
- JFrame.setBackground () не работает - почему?
- Java Swing: отображение изображений изнутри Jar
- Чтение определенной строки из текстового файла в Java
- как создать таблицу, если она не существует, используя Derby Db
- Функциональное программирование на Java
- Как сопоставить имена полей JSON для разных имен полей объектов?
- Как вызвать переопределенный метод суперclassа?
- Получить значение unicode символа
- Как проверить, отображается ли один символ в строке?
- Как установить значок в JLabel из образа из папки?
- Анализ спектра звука с использованием алгоритма FFT в Java
Исполняемый файл 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.
Внесите следующие изменения в файл сборки:
-
Указать плагин:
apply plugin: 'eu.appsatori.fatjar'
-
Предоставьте Buildscript:
buildscript { repositories { jcenter() } dependencies { classpath "eu.appsatori:gradle-fatjar-plugin:0.3" } }
-
Обеспечить основной class:
fatJar { classifier 'fat' manifest { attributes 'Main-Class': 'my.project.core.MyMainClass' } exclude 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.SF' }
-
Создайте fatjar:
./gradlew clean fatjar
-
Запустите fatjar из / build / libs /:
java -jar MyFatJar.jar