2008-12-18 20 views
14

Tengo que enviar algunos códigos groovy a algunos usuarios que solo tienen instalado java (no grooy, no $ groovy_home, etc.). Intento invocar groovy desde la línea de comandos pero no tengo suerte. Aquí está mi archivo bat:Cómo invocar a groovy con 'java' desde la línea de comandos

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

Y aquí está mi excepción:

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. 

¿Alguien tiene una pista? Tengo 'groovy-all-1.6-beta-1.jar' en \ lib dir.

Respuesta

9

creo que es necesario incorporar explícitamente el tarro maravilloso en la ruta de clase

14

Tienes here otro ejemplo de maravillosa aplicación llamada desde Java (en este caso, a partir de hormigas, pero la idea general es la misma).

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

Como se ha mencionado por frankowyer, que tienen el tarro maravilloso exacta aparece explícitamente en los argumentos de ruta de clases de Java.

Ya que los clientes no tienen variable de entorno especial, basta con sustituir el %GROOVY_HOME%/... con la ruta completa a:

8

Una forma de evitar problemas con diferentes rutas de clases en diferentes máquinas sería agrupar todas las dependencias necesarias en un único contenedor, esto también facilitaría la distribución a los usuarios. Esto se puede hacer con este script 'GroovyWrapper'. Los archivos jar predeterminados (embeddable/groovy-all- .jar y lib/commons .jar) se incluyen de forma predeterminada en el script y, si necesita otros JARS, se pueden agregar fácilmente.

Para obtener la secuencia de comandos completa y las instrucciones, consulte http://docs.codehaus.org/display/GROOVY/WrappingGroovyScript.

Aquí hay un ejemplo de cómo utilizar GroovyWrapper:

Digamos que tiene guión maravilloso HelloWorld.groovy, utilice GroovyWrapper para la construcción de HolaATodos.jar, de la siguiente manera:

$ groovy GroovyWrapper -c -m HelloWorld 

GroovyWrapper compilará la script HelloWorld.groovy a HelloWorld.class, y crea un archivo jar auto-ejecutable HelloWorld.jar.

Ahora puede utilizar el HolaATodos.jar para el lanzamiento de la secuencia de comandos HelloWorld, simplemente ejecutando:

$ java -jar HelloWorld.jar 
+1

'GroovyWrapper' utiliza' Ant' para construir scripts maravillosos en un archivo jar. Esta construcción también se puede hacer en 'Gradle' way.See [esta respuesta] (http://stackoverflow.com/a/9749869/2011291) si a alguien le gusta. – AvatarQing

1

gran respuesta por VonC:

....... Ya que los clientes no tiene variable de entorno especial, simplemente reemplace el %GROOVY_HOME%/ ...con la ruta completa a:

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

esto es para Windows Vista:

En Propiedades del sistema | Variables ambientales | Las variables de usuario: Nombre de la variable GROOVY_HOME conjunto a C:\groovy\Groovy-1.8.5 y un conjunto de variables del valor Nombre CLASSPATH que incluya .;%GROOVY_HOME%\embeddable\groovy-all-1.8.5.jar

No cometa el error que yo (girar mis ruedas un poco), de no PREP poner fin a la trayectoria de la 'groovy-all' con ".;" (punto y punto y coma): como la ruta necesita la carpeta base para encontrar la clase principal (por extraño que parezca)

+1

¡Esto debería ser un comentario, no una respuesta separada! – durron597

0

¡Cuidado con [~]!

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 primera línea tilde no es procesada por bash, y java no puede entenderlo.

En segunda línea tilde es reemplazada por bash y todo funciona bien.

Cuestiones relacionadas