Вызов отличного сценария с использованием префикса CLASSPATH, как показано ниже, работает нормально:
CLASSPATH=/path/to/classes groovy -e "(new stuff.XMLUtils()).printIt('test string')"
но изменение его на использование аргумента пути к классам не работает:
groovy -classpath /path/to/classes -e "(new stuff.XMLUtils()).printIt('test string')"
и дает ошибку:
script_from_command_line: 1: unable to resolve class stuff.XMLUtils
Может ли кто-нибудь объясните почему это? (Файл stuff.XMLUtils - это просто отличный скрипт, который я скомпилировал в / path / to / classes )
Я провел небольшое расследование и использовал следующий отличный скрипт для сброса загрузчика классов
def printClassPath(classLoader) {
println "$classLoader"
classLoader.getURLs().each {url->
println "- ${url.toString()}"
}
if (classLoader.parent) {
printClassPath(classLoader.parent)
}
}
printClassPath this.class.classLoader
С аргументом -classpath
arg, я не вижу записи в загрузчике классов для переданного в classpath arg, (фактически, единственный каталог - это текущий рабочий каталог), например:
groovy.lang.GroovyClassLoader$InnerLoader@4911b910
groovy.lang.GroovyClassLoader@18203c31
sun.misc.Launcher$AppClassLoader@35a16869
- file:/usr/share/java/ant.jar
- ... (removed for brevity)
- file:/home/admin/groovy/
sun.misc.Launcher$ExtClassLoader@77cde100
- file:/usr/java/jdk1.6.0_23/jre/lib/ext/sunjce_provider.jar
- ...
Использование CLASSPATH = ...Версия
показывает, что указанная выше запись PWD заменена значением, которое я установил в переменной.
И если я добавлю отладку в исполняемый файл оболочки groovy, разница в вызове java будет в том, что версия аргумента -classpath
arg не добавляет записи в запись пути к классам java (что в конечном итоге является причиной того, что класс не обнаружена ошибка), но версия CLASSPATH = ...
добавляет путь.
Это ошибка в Groovy?
РЕДАКТИРОВАТЬ: простой пример с ошибкой
- - - - xu.groovy
package stuff
def printIt(string) { println string }
- - - -
groovyc -d classes xu.groovy
groovy -cp classes -e "(new stuff.xu()).printIt('test')" # fails
CLASSPATH=classes groovy -e "(new stuff.xu()).printIt('test')" # works
Если я удалю пакет и ссылки на материал
, пример с ошибкой будет работать нормально.