2012-03-17 18 views
35

Questo è il mio script di gradle build.Creare un JAR eseguibile 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' 
} 

E questo compila bene

Il problema è che non posso correre il JAR creato, ottengo un'eccezione java.lang.NoClassDefFoundError: groovy/lang/GroovyObject

quindi credo che il plugin Groovy non include tutti le classi necessarie all'interno del JAR.

Come posso creare un JAR standalone che posso semplicemente .. ;-) correre

+0

Dopo aver letto tutti i suggerimenti da qui e anche utilizzando http://github.com/AvatarQing/groovy-executable-jar-with-gradle-example, ho creato un file jar che accetta uno script groovy e crea un jar eseguibile: https://github.com/krishnact/uberifier. Il file jar è: https://github.com/krishnact/uberifier/blob/master/bin/Uberifier-1.0.0.jar?raw=true – Krishna

risposta

45

Quello che state cercando è la application plugin che permette di creare un'applicazione standalone JVM comprese tutte le dipendenze e gli script eseguiti.

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

EDIT:

Questo dovrebbe creare l'uberjar si desidera:

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

Questo è bello, mi piace il compito 'distZip', ma cosa ho voglio è come il compito di distJar -> un gusto che crea un JAR eseguibile con tutte le classi necessarie (il mio, groovy rt ...) dentro. – emesx

+1

Si consiglia di mantenere le classi dell'applicazione separate dalle dipendenze esterne. Se avessi davvero voluto creare un uberjar [questo è come puoi farlo] (https://github.com/bmuschko/gradle-tomcat-plugin/blob/master/build.gradle#L26). Ovviamente userete le dipendenze esterne invece dei sottoprogetti. –

+3

Creato un progetto di esempio basato sul codice fornito da @Benjamin: https://github.com/bond-/gradle-groovy-jar-example – Raviteja

1

il seguente codice è anche ok, plug-in uso avvio 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

Vorrei buttarmi dentro a votare per lo shadow gradle plugin. È in grado di costruire gheretti uber ed è abbastanza versatile e capace di cose come il riposizionamento di classe per prevenire dependency hell.

Non riuscirò a confrontare i due plug-in, ma andrò fino a dire che ho gravitato sull'uso dell'ombra dall'aver usato l'applicazione in passato a causa delle funzionalità aggiunte.

Quando mi sono stancato dei tempi di avvio degli script groovy basati su @Grab, tendo a scrivere un file di build gradle usando il plug-in shadow anche per i singoli script groovy di file. Un file di esempio gradle build in grado di creare un jar uber di un file di script groovy nella directory corrente. Il nome della classe principale deve corrispondere al nome del file di 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 = "" 
} 

il vaso uber verrà generato nella directory build/libs.

Problemi correlati