71 votes

gradle - comment construire un jar avec un répertoire lib contenant d'autres jars ?

Dans gradle, comment puis-je incorporer des bocaux dans mon bocal de sortie de construction dans le répertoire lib. (en particulier lib/enttoolkit.jar et lib/mail.jar) ?

0 votes

0 votes

Cela répond-il à votre question ? Créer un JAR exécutable avec Gradle

38voto

stigkj Points 819

Si vous avez tous les bocaux dans un répertoire (appelons-le libs ) dans votre projet, vous n'avez besoin que de ceci :

jar {
    into('lib') {
        from 'libs'
    }
}

Je pense qu'il est plus probable que ces bocaux soient des dépendances de quelque sorte. Alors vous pourriez faire comme ceci :

configurations {
    // configuration that holds jars to copy into lib
    extraLibs
}
dependencies {
    extraLibs 'org.something:something-dep1:version'
    extraLibs 'org.something:something-dep2:version'
}

jar {
    into('lib') {
        from configurations.extraLibs
    }
}

2 votes

Si vous voulez toutes les dépendances, vous pouvez aussi copier à partir de configurations.runtime ce qui vous donne l'option par défaut compile ce qui vous évite de devoir créer vos propres extraLibs configuration.

0 votes

Erreur : Could not find method jar() for arguments [build_bndovev91pu8trwrdngc8qh7i$_run_closure5@3be2321e] on project ':app' of type org.gradle.api.Project.

2 votes

@Thunderforge Pour obtenir toutes les dépendances, j'ai dû copier à partir de configurations.runtimeClasspath plutôt que configurations.runtime tout en évitant le recours à l extraLibs définition.

36voto

lucas Points 4344

Tiré textuellement de : http://docs.codehaus.org/display/GRADLE/Cookbook#Cookbook-Creatingafatjar

Gradle 0.9 :

jar {
    from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}

Gradle 0.8 :

jar.doFirst {
    for(file in configurations.compile) {
        jar.merge(file)
    }
}

Les extraits ci-dessus n'incluent que les dépendances de compilation pour ce projet, et non les dépendances d'exécution transitives. Si vous souhaitez également les fusionner, remplacez configurations.compile par configurations.runtime.

EDIT : choisir uniquement les bocaux dont vous avez besoin

Créez une nouvelle configuration, releaseJars peut-être

configurations {
    releaseJars
}

Ajoutez les bocaux que vous voulez à cette configuration

dependencies {
    releaseJars group: 'javax.mail', name: 'mail', version: '1.4'
    //etc
}

puis utiliser cette configuration dans la tâche jar décrite ci-dessus.

1 votes

Je suis sur 0.9rc1. J'ai donc essayé votre première suggestion. Cela a entraîné toutes sortes de choses que je ne voulais pas......

0 votes

Plus proche je pense...le problème est que j'ai besoin des jars dans un répertoire lib. Cela tire dans les classes à partir des jars. Je veux lib/mail et lib/enttoolkit dans le jar de sortie.

0 votes

Cela fonctionne... en quelque sorte : sourceSets { main { java { srcDir "$wepTrunk/osgi/mycompany.osgi.server/src" } resources { srcDir "/Users/phil/dev/trunk/osgi/mycompany.osgi.server/lib" } } } il place les jars de mon /users/phil/dev/trunk/osgi/mycompany.osgi.server/lib dans mon jar de sortie, mais pas dans un répertoire "lib". Une idée pour les placer dans un répertoire lib ?

22voto

tolitius Points 9816

Simple :

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

jar { dependsOn copyToLib }

exécutez-le :

$ gradle jar
...
$ tree build/libs

build/libs
 your-project-0.0.1.BUILD-SNAPSHOT.jar
 lib
     akka-actor-2.0.jar
     akka-camel-2.0.jar
     ... ... ...
     spring-expression-3.1.0.RELEASE.jar
     zmq-2.1.9.jar

1 directory, 46 files

10 votes

Cela copie les bibliothèques dans le répertoire de sortie, mais pas dans le fichier JAR lui-même - ce qui était la question.

8voto

Ted Naleid Points 13349

J'ai également eu besoin de faire quelque chose de similaire et je n'ai pas réussi à faire fonctionner ce que Guus et stigkj ont suggéré, mais j'ai réussi à m'en approcher suffisamment avec leur aide pour faire fonctionner ceci (l'exemple de Guus a explosé sur l'écran de l'ordinateur). dependencies { compile { extendsFrom myLibs }} fermeture pour moi.

apply plugin: 'groovy'

repositories {
    mavenCentral()
}

configurations {
    // custom config of files we want to include in our fat jar that we send to hadoop
    includeInJar
}

dependencies {
    includeInJar 'org.codehaus.groovy:groovy:1.8.6'

    configurations.compile.extendsFrom(configurations.includeInJar)
}

jar {
    into('lib') {
        println "includeInJar: " + configurations.includeInJar.collect { File file -> file }
        from configurations.includeInJar
    }

}

Puis en courant gradle jar et l'examen du jar créé me donne cette sortie, montrant que j'obtiens le fichier jar pour avoir groovy ainsi que tous les jars dont il dépend à l'intérieur du "fat jar" :

%  gradle jar                                                                                                                         
includeInJar: [/Users/tnaleid/.gradle/caches/artifacts-8/filestore/org.codehaus.groovy/groovy/1.8.6/jar/553ca93e0407c94c89b058c482a404427ac7fc72/groovy-1.8.6.jar, /Users/tnaleid/.gradle/caches/artifacts-8/filestore/antlr/antlr/2.7.7/jar/83cd2cd674a217ade95a4bb83a8a14f351f48bd0/antlr-2.7.7.jar, /Users/tnaleid/.gradle/caches/artifacts-8/filestore/asm/asm/3.2/jar/9bc1511dec6adf302991ced13303e4140fdf9ab7/asm-3.2.jar, /Users/tnaleid/.gradle/caches/artifacts-8/filestore/asm/asm-tree/3.2/jar/cd792e29c79d170c5d0bdd05adf5807cf6875c90/asm-tree-3.2.jar, /Users/tnaleid/.gradle/caches/artifacts-8/filestore/asm/asm-commons/3.2/jar/e7a19b8c60589499e35f5d2068d09013030b8891/asm-commons-3.2.jar, /Users/tnaleid/.gradle/caches/artifacts-8/filestore/asm/asm-util/3.2/jar/37ebfdad34d5f1f45109981465f311bbfbe82dcf/asm-util-3.2.jar, /Users/tnaleid/.gradle/caches/artifacts-8/filestore/asm/asm-analysis/3.2/jar/c624956db93975b7197699dcd7de6145ca7cf2c8/asm-analysis-3.2.jar]
:compileJava UP-TO-DATE
:compileGroovy UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar

BUILD SUCCESSFUL

Total time: 3.387 secs

%  jar tvf build/libs/gradletest.jar                                                                                                  
     0 Mon Mar 12 11:40:00 CDT 2012 META-INF/
    25 Mon Mar 12 11:40:00 CDT 2012 META-INF/MANIFEST.MF
     0 Mon Mar 12 11:40:00 CDT 2012 lib/
5546084 Mon Mar 05 13:13:32 CST 2012 lib/groovy-1.8.6.jar
445288 Mon Mar 05 13:13:38 CST 2012 lib/antlr-2.7.7.jar
 43398 Mon Mar 05 13:13:40 CST 2012 lib/asm-3.2.jar
 21878 Mon Mar 05 13:13:40 CST 2012 lib/asm-tree-3.2.jar
 33094 Mon Mar 05 13:13:40 CST 2012 lib/asm-commons-3.2.jar
 36551 Mon Mar 05 13:13:40 CST 2012 lib/asm-util-3.2.jar
 17985 Mon Mar 05 13:13:40 CST 2012 lib/asm-analysis-3.2.jar

0 votes

Ok, j'ai fait ce qui est décrit ici mais j'obtiens toujours Exception in thread "main" java.lang.NoClassDefFoundError: com/rabbitmq/client/ConnectionFactory . Dois-je configurer le classpath d'une manière ou d'une autre ?

6voto

Guus Points 21

J'avais besoin de la même chose que vous, et j'ai utilisé cette méthode. Vous n'avez peut-être pas besoin d'une déclaration de configuration personnalisée, mais j'avais besoin de séparer les fichiers jar utilisés localement de ceux déclarés dans un fichier super-build.

configurations{
    //declare custom config if necessary, otherwise just use compile
    myLibs
}
dependencies {
    //add lib/*.jar files to myLibs
    myLibs fileTree(dir: 'lib', include: '*.jar')
    compile {
        //set compile configuration to extend from myLibs
        extendsFrom myLibs
    }
}
// task to copy libs to output/lib dir
task copyToLib(type: Copy) {
    into "$buildDir/output/lib"
    from configurations.myLibs
}

jar {
    //include contents of output dir
    from "$buildDir/output"
    manifest {
        //...
    }
}

//set build task to depend on copyToLib
build.dependsOn(copyToLib)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X