Как вызвать groovy с помощью 'java' из командной строки

Мне нужно отправить некоторый код groovy некоторым пользователям, у которых есть только java (нет grooy, no $groovy_home и т.д.). Я пытаюсь вызвать groovy из командной строки, но мне не повезло. Вот мой bat файл:

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

И вот мое исключение:

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.

Кто-нибудь знает? У меня есть groovy -all-1.6-beta-1.jar 'в\lib dir.

Ответы

Ответ 1

Мне кажется, вам нужно явно указать jar-кластер groovy в пути к классам

Ответ 2

У вас здесь еще один пример приложения Groovy, вызываемого с Java (в данном случае, из ant, но общая идея то же).

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

Как упоминалось frankowyer, у вас есть точная Groovy jar, явно указанная в аргументах classpath java.

Так как ваши клиенты не имеют специальной переменной среды, просто замените %GROOVY_HOME%/... на полный путь:

  • groovy.jar или
  • goovy-all-VERSION.jar (чтобы свести к минимуму любые конфликты с другими библиотеками)

Ответ 3

Одним из способов избежать проблем с разными путями классов на разных машинах было бы объединение всех необходимых зависимостей в одну банку, что также облегчило бы распределение пользователей. Это можно сделать с помощью этого "GroovyWrapper" script. Баны по умолчанию (embeddable/ groovy -all-.jar и lib/commons.jar) по умолчанию включены в script, и если вам нужны другие JARS, они могут быть легко добавлены.

См. http://docs.codehaus.org/display/GROOVY/WrappingGroovyScript для полного script и инструкций.

Вот пример использования GroovyWrapper:

Скажите, что у вас есть groovy script HelloWorld.groovy, используйте GroovyWrapper для создания HelloWorld.jar следующим образом:

$ groovy GroovyWrapper -c -m HelloWorld

GroovyWrapper скомпилирует script HelloWorld.groovy в HelloWorld.class и создаст самозаписываемую банку HelloWorld.jar.

Теперь вы можете использовать HelloWorld.jar для запуска HelloWorld script, просто выполнив:

$ java -jar HelloWorld.jar

Ответ 4

БОЛЬШОЙ ОТВЕТ от VonC:

....... Поскольку у ваших клиентов нет специальной переменной среды, просто замените %GROOVY_HOME%/... полным путем на:

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

это для Windows Vista:

В свойствах системы | Экологические переменные | Пользовательские переменные:  Имя переменной GROOVY_HOME установлено на C:\groovy\Groovy-1.8.5 а значение Variable Name CLASSPATH установлено как .;%GROOVY_HOME%\embeddable\groovy-all-1.8.5.jar

Не делайте ошибку, которую я делал (немного крутил мои колеса), не форматируя путь "groovy -all" с помощью..; (точка и точка с запятой): поскольку путь требует базовую папку, в которой вы находитесь, для поиска основного класса (как это ни странно)

Ответ 5

Следите за [~]!

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

В первой строке тильда не обрабатывается bash, и java не может ее понять.

Во второй строке тильда заменяется на bash, и все работает нормально.