Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

[How-to] создайте zip файл дистрибутива с jar-зависимостями в подкаталоге /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
Основной класс: com.somepackage.MainClass
Путь к классу: lib/commons-lang3-3.3.2.jar

Ответ 4

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

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

Сконфигурируйте задачу jar, чтобы поместить ваш главный класс в манифест

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

Запустите задание Gradle

./gradlew shadowJar

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

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

java -jar app-version-all.jar

Ответ 6

Спасибо, Константин, он работал как шарм с небольшим количеством нюансов. По какой-то причине указание основного класса как части манифеста jar не совсем сработало, и вместо этого ему понадобился атрибут mainClassName. Вот фрагмент из 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.

Ответ 7

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

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

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

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

Ответ 8

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

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

  • Упоминающий плагин:

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

    buildscript {
    repositories {
        jcenter()
    }
    
    dependencies {
        classpath "eu.appsatori:gradle-fatjar-plugin:0.3"
    }
    }
    
  • Предоставьте основной класс:

    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
    

Ответ 9

Вы также можете легко использовать терминал для создания файла .jar! Для проекта gradle вы можете:

$ cd /into/your/project/directory/

$ gradle build #so gradle строит файл (-ы) jar:

$ java -jar build/libs/mymodule-0.0.1-SNAPSHOT.jar # запустите отдельную банку! java

$ java -jar build/libs/mymodule-0.0.1-SNAPSHOT.jar.original # часть реального мяса - на всякий случай!