2010-08-10 10 views

Respuesta

34

Lifted textualmente 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) 
    } 
} 

Los fragmentos anteriores sólo incluirán las dependencias de compilación para ese proyecto, no cualquier tiempo de ejecución transitivo dependencias. Si también desea fusionarlos, reemplace configurations.compile con configurations.runtime.

EDIT: solamente la elección de los frascos que necesita

realizar una nueva configuración, releaseJars quizá

configurations { 
    releaseJars 
} 

Añadir los frascos que desea que la configuración

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

luego usar esa configuración en la tarea jar que se describe arriba.

+1

Estoy en 0.9rc1. así que probé tu primera sugerencia. Tiré todo tipo de cosas que no quería ... –

+0

más cerca, creo ... el problema es que necesito los frascos en un directorio lib. Esto atrae las clases de los frascos. Quiero lib/lib electrónico y/enttoolkit en el frasco de salida –

+0

esto funciona ... más o menos: sourceSets {{ principal de Java { SRCDIR "wepTrunk $/osgi/mycompany.osgi.server/src" } recursos { SRCDIR "/Users/phil/dev/trunk/osgi/mycompany.osgi.server/lib" }} } pone los frascos de mi/usuarios/phil/dev/trunk/osgi /mycompany.osgi.server/lib en mi jar de salida, pero no en el directorio "lib". ¿Alguna idea de cómo obtenerlos en una lib dir? –

6

Necesitaba lo mismo que me pidió y usé este método. es posible que no necesite una declaración de configuración personalizada, pero necesitaba separar los archivos jar usados ​​localmente de los declarados en un archivo de superconstrucción.

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) 
28

Si tiene todos los frascos dentro de un directorio (permite llamarlo libs) en su proyecto, sólo necesita esto:

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

supongo que es más probable que estos frascos son dependencias de algún tipo. Posteriormente, se podría hacerlo de esta manera:

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 
    } 
} 
+1

Si desea todas las dependencias, también puede copiar de 'configurations.runtime', que le da las dependencias' compile' predeterminadas, ahorrándole la molestia de crear su propia configuración 'extraLibs'. – Thunderforge

+0

Error: No se pudo encontrar el método jar() para los argumentos [build_bndovev91pu8trwrdngc8qh7i $ _run_closure5 @ 3be2321e] en el proyecto ': app' del tipo org.gradle.api.Project. – naXa

7

también que tenía que hacer algo similar y no estaba muy capaz de conseguir lo Guus y stigkj sugirieron trabajar, pero lo suficientemente cerca con su ayuda a conseguir este trabajo (Guus 'ejemplo explotó sobre el cierre dependencies { compile { extendsFrom myLibs }} para mí.

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 
    } 

} 

Entonces el correr gradle jar y examinando el frasco creado me da esta salida, demostrando que puedo conseguir el archivo jar de tener maravilloso, así como todos los frascos que es dependiente dentro del "tarro de grasa":

% 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

Ok, he hecho lo que aquí se describe, pero sigo recibiendo 'Exception in thread 'main" java.lang.NoClassDefFoundError: com/rabbitmq/client/ConnectionFactory'. ¿Debo configurar classpath de alguna manera? – omikron

17

simple:

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

jar { dependsOn copyToLib } 

plazo es:

$ 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 
+6

Esto copia las bibliotecas en el directorio de salida, pero no en el archivo JAR, que era la pregunta. – TheOperator

6

A continuación código podría ser juzgado.Depende de la tarea jar y es de tipo 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" 
    } 
} 

El código anterior incluiría diferentes contenidos dentro de directorios diferentes. Probado en gradle 2.2

+0

Trabajando perfecto – nikhil

0

En mi caso, necesitaba incluir un contenido del proyecto raíz Jar en el subproyecto Jar. Así que, para que funcione, se puede utilizar esta plantilla:

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 
} 

Mi ejemplo:

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 
} 
-1
task <taskname>(type: Jar) { 
    archiveName 'nameofjar.jar' 
    doFirst { 
    manifest { 
      attributes 'Class-Path': configurations.compile.files.collect{ project.uri(it) }.join(' ') 
     } 
    } 
} 
+1

¿Alguna explicación acerca de lo que hace este código podría ayudar a explicar algunos de los bits específicos? – Tom

Cuestiones relacionadas