2016-01-18 3 views
5

Ho uno script groovy Automate.groovy. Lo script non ha una definizione di classe o un metodo principale. Sto cercando il modo più semplice per creare un jar contenente lo script. Ho provato a compilare lo script Groovy utilizzando il seguente comando:Creazione di un jar eseguibile con script groove

groovyc Automate.groovy 

Ho anche un manifesto-addition.txt Manifest file che specifica la classe principale

Main-Class: Automate 

e ho creato il barattolo con il comando:

jar cvfm Automate.jar mainfest-addition.txt *.class 

questo mi ha dato un vaso con Automate.class e automatizzare $ 1.class e un file manifesto con la classe principale. Ma quando ho cercato di correre il vaso utilizzando java -jar Automate.jar ottengo sempre l'errore

cannot find or load main class Automate. 

Che cosa sto facendo male qui?

Ci dovrebbe essere un modo semplice come questo per creare il barattolo. Ho solo questo file di script che voglio nel mio barattolo e non voglio usare maven/ant/gradle per fare questo lavoro. Non c'è un modo semplice e diretto per fare questo?

risposta

7

Il file di classe ha dipendenze su Groovy. L'uso del vaso incorporabile risolverà il problema.

Utilizzando Groovy 2.4.5, se ho questo script per Automate.groovy

println "Hello from Automate.groovy" 

e uso questo manifest.txt:

Main-class: Automate 
Class-path: jar/groovy-all-2.4.5.jar 

e questo semplice script di build:

rm *.class 
groovyc Automate.groovy 
jar cvfm Automate.jar manifest.txt Automate.class 

e, nella directory di esecuzione, eseguo questo:

bash$ mkdir jar 
bash$ cp $GROOVY_HOME/embeddable/groovy-all-2.4.5.jar jar 

allora questo funziona:

bash$ java -jar Automate.jar 
Hello from Automate.groovy 

La soluzione sarà molto meglio se il barattolo embeddable è incluso nel Automate.jar stesso. Un esempio di ciò, usando Gradle, è this project.

+0

Perché è una soluzione migliore includere il jar groovy-all all'interno di Automate.jar? – RaGe

+0

In realtà ho provato ad includere jar groovy-all in classpath usando java -cp groovy-all.jar Automate.jar. Anche allora ho avuto lo stesso errore. In realtà avevo un'annotazione @Grab e questo è ciò che stava effettivamente causando il problema. Quando l'ho rimosso, è stato in grado di individuare la classe principale – Harini

-1

Il problema reale era l'annotazione @Grab presente nel mio script. Ho creato un progetto Gradle e aggiunto uno script molto semplice HelloWorld.groovy con una sola istruzione println, ma ho anche utilizzato un @Grab per importare qualcosa. Quando ho costruito il barattolo non troverei la classe principale. Quando ho cercato su Google ho scoperto che l'annotazione @Grab è pensata per essere utilizzata in script standalone e non per script precompilati. Quindi, se hai bisogno di avere @Grab nella tua compilation groovy, devi aggiungere una dipendenza da edera aggiuntiva o scegliere di non avere @Grab e usare un altro modo per includere le dipendenze. Ho rimosso @Grab dal mio script e poi lo ho creato. Il barattolo è andato bene allora.

Mi dispiace per aver deviato dal fatto che non volevo usare Gradle/Maven. Ho passato quasi due giorni a provare tutte le cose che ho potuto trovare su stackoverflow e google e ho finito per provare Gradle. Non sono sicuro che questa sia l'unica soluzione al problema, ma questo ha funzionato per me.