Как вызвать Groovy с «Java» из командной строки - PullRequest
14 голосов
/ 18 декабря 2008

Я должен отправить некоторый отличный код некоторым пользователям, у которых установлена ​​только java (без grooy, без $ groovy_home и т. Д.). Я пытаюсь вызвать Groovy из командной строки, но мне не повезло. Вот мой файл летучей мыши:

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.

Ответы [ 5 ]

14 голосов
/ 18 декабря 2008

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

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

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

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

  • groovy.jar или
  • goovy-all-VERSION.jar (чтобы минимизировать конфликт с другими библиотеками)
9 голосов
/ 18 декабря 2008

Я думаю, вам нужно явно указать Groovy jar в classpath

8 голосов
/ 02 августа 2011

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

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

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

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

$ groovy GroovyWrapper -c -m HelloWorld

GroovyWrapper скомпилирует скрипт HelloWorld.groovy в HelloWorld.class и создаст исполняемый файл jar HelloWorld.jar.

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

$ java -jar HelloWorld.jar
1 голос
/ 04 февраля 2012

БОЛЬШОЙ ОТВЕТ 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 и имя переменной CLASSPATH, в значение которого входит .;%GROOVY_HOME%\embeddable\groovy-all-1.8.5.jar

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

0 голосов
/ 05 августа 2014

Берегись [~]!

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 и все отлично работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...