web-dev-qa-db-fra.com

comment copier les fichiers JAR des bibliothèques de dépendances dans gradle

j'ai un pot exécutable avec ce 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.+'
    )
}

mais il a échoué, car les fichiers de dépendances ne peuvent pas être trouvés.

puis j'ajoute ce code:

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

mais rien ne change ... je ne trouve pas le dossier de sortie/libs ...

comment puis-je copier les fichiers de bibliothèque de dépendances dans un dossier ou un chemin spécifié?

34
jychan

Ajouter:

build.dependsOn(copyToLib)

Lorsque gradle build S'exécute, Gradle crée des tâches et toutes les tâches qui en dépendent (déclarées par dependsOn). Sans définir build.dependsOn(copyToLib), Gradle n'associera pas la tâche de copie à la tâche de génération.

Donc:

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)
41
xielingyun

Je trouve le plugin d'application trop lourd et trop verbeux dans sa sortie. Voici comment j'ai finalement obtenu une configuration dont j'étais satisfait, c'est-à-dire créer un fichier Zip de distribution avec des pots de dépendance dans le sous-répertoire /lib et ajoutez toutes les dépendances à Class-Path entrée dans le fichier manifeste:

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
}

Hébergé comme un Gist ici .

Le résultat se trouve dans build/distributions et le contenu décompressé ressemble à ceci:

lib/commons-lang3-3.3.2.jar
MyJarFile.jar

Contenu de MyJarFile.jar#META-INF/MANIFEST.mf:

Version manifeste: 1.0
Classe principale: com.somepackage.MainClass
Chemin d'accès aux classes: lib/commons-lang3-3.3.2.jar

15
Martin Andersson

Le plugin d'application vous oblige à définir le nom de la classe principale comme ceci:

mainClassName = "com.test.HelloWorld"

Vous devrez l'ajouter à votre script de build. Gardez à l'esprit que si vous essayez d'exécuter votre application avec la commande Java, vous devrez également définir le chemin d'accès aux classes avec -cp.

Le plugin d'application simplifie ce processus en fournissant la tâche distZip . Si vous exécutez cette tâche, une distribution complète est créée pour vous sous build/distributions. La distribution contient des scripts de démarrage et toutes les dépendances. Les scripts de démarrage générés définissent déjà le chemin de classe pour vous, vous n'avez donc plus à vous en occuper.

1
Benjamin Muschko