Как скопировать библиотеки зависимостей JAR в gradle

У меня есть runnable jar с этим build.gradle

apply plugin: 'java'
apply plugin: 'application'

manifest.mainAttributes("Main-Class" : "com.test.HelloWorld")

repositories {
    mavenCentral()
}

dependencies {
    compile (
        'commons-codec:commons-codec:1.6',
        'commons-logging:commons-logging:1.1.1',
        'org.apache.httpcomponents:httpclient:4.2.1',
        'org.apache.httpcomponents:httpclient:4.2.1',
        'org.apache.httpcomponents:httpcore:4.2.1',
        'org.apache.httpcomponents:httpmime:4.2.1',
        'ch.qos.logback:logback-classic:1.0.6',
        'ch.qos.logback:logback-core:1.0.6',
        'org.slf4j:slf4j-api:1.6.0',
        'junit:junit:4.+'
    )
}

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

а затем добавьте этот код:

task copyToLib(type: Copy) {
    into "$buildDir/output/libs"
    from configurations.runtime
}

но ничего не изменится... я не могу найти выход папок /libs...

как я могу скопировать зависимости libs jars в указанную папку или путь?

Ответ 1

Добавлять:

build.dependsOn(copyToLib)

Когда gradle build Gradle, Gradle создает задачи и все зависящие от них задачи (объявленные в dependsOn от dependsOn). Без настройки build.dependsOn(copyToLib) Gradle не будет связывать задачу копирования с задачей сборки.

Так:

apply plugin: 'java'
apply plugin: 'application'

manifest.mainAttributes('Main-Class': 'com.test.HelloWorld')

repositories {
    mavenCentral()
}

dependencies {
    compile (
        'commons-codec:commons-codec:1.6',
        'commons-logging:commons-logging:1.1.1',
        'org.apache.httpcomponents:httpclient:4.2.1',
        'org.apache.httpcomponents:httpclient:4.2.1',
        'org.apache.httpcomponents:httpcore:4.2.1',
        'org.apache.httpcomponents:httpmime:4.2.1',
        'ch.qos.logback:logback-classic:1.0.6',
        'ch.qos.logback:logback-core:1.0.6',
        'org.slf4j:slf4j-api:1.6.0',
        'junit:junit:4.+'
    )
}

task copyToLib(type: Copy) {
    into "${buildDir}/output/libs"
    from configurations.runtime
}

build.dependsOn(copyToLib)

Ответ 2

Я нахожу плагин приложения слишком громоздким и слишком многословным в своем выводе. Вот как я, наконец, получил настройку, которая мне понравилась: создать 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:
    //     http://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

Ответ 3

Плагин приложения требует, чтобы вы задали имя основного класса следующим образом:

mainClassName = "com.test.HelloWorld"

Вам нужно добавить это в свою сборку script. Имейте в виду, что если вы попытаетесь запустить приложение с помощью команды java, вам также необходимо установить путь к классу с помощью -cp.

Плагин приложений упрощает этот процесс, предоставляя задачу distZip. Если вы запустите эту задачу, вам будет создан полный дистрибутив под build/distributions. Распространение содержит стартовые скрипты и все зависимости. Сгенерированные стартовые скрипты уже установили для вас путь к классам, поэтому вам больше не придется иметь дело с этим.