2012-03-17 24 views
35

Este es mi script de compilación gradle.Crear un JAR ejecutable Groovy con Gradle

apply plugin: 'groovy' 

project.group = "test.tree" 
archivesBaseName = "tree" 
project.version = "1.0" 
manifest.mainAttributes("Main-Class" : "test.tree.App") 

sourceCompatibility=1.6 
targetCompatibility=1.6 

repositories { 
    mavenCentral() 
} 

dependencies { 
    groovy group: 'org.codehaus.groovy', name: 'groovy', version: '1.8.6' 
    testCompile group: 'junit', name: 'junit', version: '4.8.2' 
} 

Y esto compila bien

El problema es que no puedo ejecutar el JAR creado, me sale una excepción java.lang.NoClassDefFoundError: groovy/lang/GroovyObject

así que supongo que el plugin maravilloso no incluye todos las clases necesarias dentro del JAR.

Cómo puedo crear un JAR independiente que simplemente puedo correr .. ;-)

+0

Después de leer todos los consejos de aquí y también usando http://github.com/AvatarQing/groovy-executable-jar-with-gradle-example, creé un archivo jar que toma una secuencia de comandos groovy y crea un archivo ejecutable jar: https://github.com/krishnact/uberifier. El archivo jar es: https://github.com/krishnact/uberifier/blob/master/bin/Uberifier-1.0.0.jar?raw=true – Krishna

Respuesta

45

Lo que se busca es la application plugin que le permite crear una aplicación JVM independiente que incluye todas las dependencias y ejecutar secuencias de comandos.

apply plugin:'application' 
mainClassName = 'test.tree.App' 

EDIT:

Esto debería crear la uberjar desea:

task uberjar(type: Jar) { 
    from files(sourceSets.main.output.classesDir) 
    from configurations.runtime.asFileTree.files.collect { zipTree(it) } 

    manifest { 
     attributes 'Main-Class': 'test.tree.App' 
    } 
} 
+0

Esto es agradable, me gusta la tarea 'distZip', pero lo que want es smt como tarea 'distJar' -> un tast que crea un JAR ejecutable con todas las clases necesarias (mía, gro rt ...) dentro. – emesx

+1

Recomiendo mantener sus clases de aplicaciones separadas de las dependencias externas. Si realmente quisiera crear un uberjar [así es como puede hacerlo] (https://github.com/bmuschko/gradle-tomcat-plugin/blob/master/build.gradle#L26). Por supuesto, usaría las dependencias externas en lugar de los subproyectos. –

+3

Creé un proyecto de muestra basado en el código proporcionado por @Benjamin: https://github.com/bond-/gradle-groovy-jar-example – Raviteja

1

el siguiente código es también aceptable, plugin de uso de botas de primavera

buildscript { 
    ext { 
     springBootVersion = '1.2.6.RELEASE' 
    } 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") 
    } 
} 

apply plugin: 'groovy' 
apply plugin: 'eclipse' 
apply plugin: 'spring-boot' 


sourceCompatibility = 1.8 
targetCompatibility = 1.8 

repositories { 
    mavenCentral() 
} 


sourceSets { 
    main { 
     groovy { 
      srcDirs = ['src'] 
     } 
    } 

    /*test { 
     groovy { 
      srcDirs = ['test/groovy'] 
     } 
    }*/ 
} 

dependencies { 
    compile "com.alibaba:fastjson:1.1.34" 
    compile 'org.codehaus.groovy:groovy-all:2.4.5' 
    //testCompile group: 'junit', name: 'junit', version: '4.8.2' 
} 
springBoot { 
    backupSource = false 
    mainClass = "com.zhb.hello.Hello" 
} 
jar{ 
    baseName = 'hellogroovy' 
    version = '1.1.0' 
} 
0

Yo lanzaría una vote por el shadow gradle plugin. Es capaz de construir jarrones súper y es bastante versátil y capaz de cosas como la reubicación de clase para evitar dependency hell.

No voy a entrar en la comparación de los dos complementos, pero llegaré a decir que me he inclinado hacia el uso de shadow por haber usado aplicaciones en el pasado debido a las características adicionales.

Cuando me canso de los tiempos de inicio de las secuencias de comandos groovy basadas en @Grab, tiendo a escribir un archivo de compilación de gradle usando el plugin de sombra incluso para las secuencias de comandos groovy de un solo archivo. Un ejemplo de archivo de compilación gradle capaz de construir un archivo uber de un archivo de script groovy en el directorio actual. El nombre de la clase principal debe corresponder con el nombre de archivo de script:

repositories { 
    jcenter() 
    mavenCentral() 
} 

defaultTasks = ['shadowJar'] 
version  = "1.0" 

dependencies { 
    compile "org.codehaus.groovy:groovy:2.4.7", 
      "commons-cli:commons-cli:1.2" 
} 

sourceSets { 
    main { 
    groovy { 
     srcDirs = [rootDir] 
    } 
    } 
} 

project.tasks.remove jar 

shadowJar { 
    manifest { 
    attributes 'Main-Class': 'MyGroovyScriptName' 
    } 

    classifier = "" 
} 

el frasco súper será generado en el directorio build/libs.

Cuestiones relacionadas