Я должен отправить отличный код некоторым пользователям, у которых установлена только 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.




Я думаю, вам нужно явно указать Groovy jar в пути к классам
У вас есть здесь, еще один пример приложения Groovy, вызываемого из Java (в данном случае из ant, но общая идея та же).
java -cp [...];%GROOVY_HOME%/embeddable/groovy-all-1.5.4.jar;[..]
Как упомянул frankowyer, у вас есть точный Groovy jar, явно указанный в аргументах пути к классам файла java.
Поскольку у ваших клиентов нет специальной переменной среды, просто замените %GROOVY_HOME%/... полным путем к:
Один из способов избежать проблем с разными путями к классам на разных машинах - это связать все необходимые зависимости в одну банку, что также упростит распространение среди пользователей. Это можно сделать с помощью скрипта GroovyWrapper. Банки по умолчанию (embeddable / groovy-all-.jar и lib / commons.jar) включены по умолчанию в скрипт, и если вам требуются другие JARS, их можно легко добавить.
Полный сценарий и инструкции см. В http://docs.codehaus.org/display/GROOVY/WrappingGroovyScript.
Вот пример использования GroovyWrapper:
Допустим, у вас есть отличный скрипт 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
ОТЛИЧНЫЙ ОТВЕТ от VonC:
....... Since your clients do not have special environment variable, just replace the
%GROOVY_HOME%/... with the complete path to: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
Не делайте той ошибки, которую я совершил (немного покрутив колеса), не подготовив окончание пути "крутого-всего" с ".;" (точка и точка с запятой): так как путь требует базовой папки, в которой вы находитесь для поиска основного класса (как ни странно)
Это должен быть комментарий, а не отдельный ответ!
Остерегайтесь [~]!
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, и все работает нормально.
GroovyWrapperиспользуетAntдля встраивания отличных скриптов в файл jar. Эта сборка также может быть сделана способомGradle. См. этот ответ, если кому-то это нравится.