2008-12-18 7 views
14

Je dois envoyer du code groovy à certains utilisateurs qui n'ont que Java installé (pas de grooy, pas de $ groovy_home, etc). J'essaye d'invoquer groovy de la ligne de commande mais je n'ai aucune chance. Voici mon fichier bat:Comment invoquer groovy avec 'java' depuis la ligne de commande

java -classpath .;lib;bin;bin-groovy introspector.AclCollector 

Et voici mon exception:

Exception in thread "main" java.lang.NoClassDefFoundError: groovy/lang/GroovyObject 
     at java.lang.ClassLoader.defineClass1(Native Method) 
     at java.lang.ClassLoader.defineClass(ClassLoader.java:621) 
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124) 
     at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) 
     at java.net.URLClassLoader.access$000(URLClassLoader.java:56) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:195) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:252) 
     at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) 
Caused by: java.lang.ClassNotFoundException: groovy.lang.GroovyObject 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
     at java.lang.ClassLoader.loadClass(ClassLoader.java:252) 
     at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) 
     ... 12 more 
Could not find the main class: introspector.AclCollector. Program will exit. 

Quelqu'un at-il un indice? J'ai "groovy-all-1.6-beta-1.jar" dans le répertoire \ lib.

Répondre

9

Je pense que vous devez lister explicitement le pot groovy dans le classpath

14

Vous avez here un autre exemple d'application appelé Groovy de Java (dans ce cas, de fourmi, mais l'idée générale est la même).

java -cp [...];%GROOVY_HOME%/embeddable/groovy-all-1.5.4.jar;[..] 

Comme mentionné par frankowyer, vous avez le pot groovy exacte explicitement sur la liste des arguments classpath de la java.

Étant donné que vos clients n'ont pas variable d'environnement spécial, il suffit de remplacer le %GROOVY_HOME%/... avec le chemin complet vers:

8

une façon d'éviter des problèmes avec différents chemins de classe sur différentes machines serait de regrouper toutes les dépendances nécessaires en un seul pot, ce serait également la distribution aux utilisateurs plus facile. Cela peut être fait avec ce script 'GroovyWrapper'. Les pots par défaut (intégrable/groovy-tout-.jar et lib/communes .jar) sont inclus par défaut dans le script et si vous avez besoin d'autres POTS ils peuvent facilement être ajoutés.

Voir http://docs.codehaus.org/display/GROOVY/WrappingGroovyScript pour le script complet et les instructions.

Voici un exemple de la façon d'utiliser GroovyWrapper:

Supposons que vous avez le script groovy HelloWorld.groovy, utilisez GroovyWrapper pour la construction HelloWorld.jar, comme suit:

$ groovy GroovyWrapper -c -m HelloWorld 

GroovyWrapper compilera les script HelloWorld.groovy à HelloWorld.class et crée un fichier jarre auto-exécutable HelloWorld.jar.

Maintenant, vous pouvez utiliser le HelloWorld.jar pour lancer le script HelloWorld, simplement en exécutant:

$ java -jar HelloWorld.jar 
+1

'GroovyWrapper' utilise' Ant' pour construire des scripts groovy dans un fichier jar.Ce build peut également être fait de façon 'Gradle'. Voir [cette réponse] (http://stackoverflow.com/a/9749869/2011291) si quelqu'un l'aime. – AvatarQing

1

Grande réponse par VonC:

....... Depuis vos clients ne pas variable d'environnement spécial, remplacer juste le %GROOVY_HOME%/ ...avec le chemin complet vers:

groovy.jar or 
goovy-all-VERSION.jar (to minimize any conflict with other libraries)........ 

ceci est pour Windows Vista:

Dans Propriétés système | Variables environnementales | Variables utilisateur: Nom de la variable GROOVY_HOME ensemble à C:\groovy\Groovy-1.8.5 et le Nom de la variable de jeu de CLASSPATH valeur d'inclure .;%GROOVY_HOME%\embeddable\groovy-all-1.8.5.jar

Ne faites pas l'erreur que je l'ai fait (tourner mes roues un peu), de ne pas prép fin le chemin du "groovy-all" avec ".;" (point et point-virgule): comme le chemin a besoin du dossier de base pour trouver la classe principale (aussi étrange que cela puisse paraître)

+1

Cela devrait être un commentaire, pas une réponse séparée! – durron597

0

Watch out of [~]!

java -cp .:~/path-to-groovy-all.jar YourClassName  # does not work 
java -cp ~/path-to-groovy-all.jar:. YourClassName  # works 
java -cp .:/full/path/to/goovy-all.jar YourClassName # works 

En première ligne tilde est pas traitée par bash et Java ne peut pas le comprendre.

En deuxième tilde ligne est remplacé par bash et tout fonctionne très bien.

Questions connexes