Dans Gradle, comment puis-je intégrer des fichiers JAR dans mon fichier jar de sortie de construction dans le répertoire libd (notamment les bibliothèques lib/enttoolkit.jar et lib/mail.jar)?
Extrait de: http://docs.codehaus.org/display/GRADLE/Cookbook#Cookbook-Creatingafatjar
Gradé 0.9:
jar {
from configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
Gradé 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, pas les dépendances d'exécution transitives. Si vous souhaitez également les fusionner, remplacez configurations.compile par configurations.runtime.
EDIT: ne choisir que les pots dont vous avez besoin
Faites une nouvelle configuration, releaseJars peut-être
configurations {
releaseJars
}
Ajoutez les pots que vous voulez à cette configuration
dependencies {
releaseJars group: 'javax.mail', name: 'mail', version: '1.4'
//etc
}
utilisez ensuite cette configuration dans la tâche jar décrite ci-dessus.
Si vous avez tous les fichiers jar dans un répertoire (appelons-le libs
) dans votre projet, vous n’avez besoin que de ceci:
jar {
into('lib') {
from 'libs'
}
}
Je suppose qu'il est plus probable que ces bocaux soient des dépendances. Ensuite, vous pouvez le 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
}
}
simple:
task copyToLib( type: Copy ) {
into "$buildDir/libs/lib"
from configurations.runtime
}
jar { dependsOn copyToLib }
exécuter:
$ 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
J'avais également besoin de faire quelque chose de similaire et je ne pouvais pas vraiment obtenir ce que Guus et Stigkj suggéraient de travailler, mais je me suis suffisamment rapproché de leur aide pour que cela fonctionne (l'exemple de Guus a explosé sur la fermeture du dependencies { compile { extendsFrom myLibs }}
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
}
}
Ensuite, lancer gradle jar
et examiner le fichier jar créé me donne cette sortie, ce qui montre que le fichier jar contient des fichiers groovy ainsi que tous les fichiers jAR dont il dépend dans le "gros fichier":
% 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
Le code ci-dessous pourrait être essayé. Cela dépend de la tâche du pot et est de type Jar
task createJobJar(dependsOn:jar,type:Jar) {
manifest {
attributes(
"Implementation-Title": 'Job '
,"Implementation-Version": version
)
}
classifier 'job'
destinationDir new File("$buildDir")
into('libs'){
from configurations.compile
}
into('classes'){
from "$buildDir/classes"
}
into('resources'){
from "$projectDir/src/main/resources"
}
into('scripts'){
from "$projectDir/src/main/scripts"
}
}
Le code ci-dessus regrouperait différents contenus dans différents répertoires . Testé au grade 2.2
J'avais besoin de la même chose que vous avez demandé, et utilisé cette méthode. vous n’avez peut-être pas besoin d’une déclaration de configuration personnalisée, mais j’ai eu 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)
Dans mon cas, je devais inclure un contenu du fichier racine Jar dans le sous-projet Jar. Donc, pour que ça marche, on peut utiliser ce template:
jar{
manifest{
attributes 'Main-Class':'<main class>'
}
def conf= configurations.find {it.name.equals('compile') }
File jar= conf.files.find {it.name.contains('<name or part of the name of produced Jar>')}
FileTree fileTree=zipTree(jar)
from fileTree
}
Mon exemple:
jar{
manifest{
attributes 'Main-Class':'alexiy.jace.Jace'
}
description='Make a runnable API Jar'
def conf= configurations.find {it.name.equals('compile') }
File tools= conf.files.find {it.name.contains('Tools')}
FileTree fileTree=zipTree(tools)
from fileTree
}
J'ai eu le même problème. Je l'ai résolu comme ça:
Copiez les fichiers dans le dossier lib avec copyToLib et référencez la dépendance avec le Class-Path
ext.mainClass = 'test.main'
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.google.code.gson:gson:2.8.2'
//....
}
jar {
from "$buildDir/libs/lib"
manifest {
attributes 'Main-Class': 'test.main',
'Class-Path': configurations.compile.collect { 'lib/'+it.getName() }.join(' ')
}
}
task copyToLib(type: Copy) {
into "$buildDir/libs/lib"
from configurations.compile
}
build.dependsOn(copyToLib)