Invocare uno script Groovy con prefisso CLASSPATH come segue funziona bene:Perché groovy non usa l'argomento classpath?
CLASSPATH=/path/to/classes groovy -e "(new stuff.XMLUtils()).printIt('test string')"
ma cambiando in modo da utilizzare l'arg classpath non lo fa:
groovy -classpath /path/to/classes -e "(new stuff.XMLUtils()).printIt('test string')"
e dà l'errore:
script_from_command_line: 1: unable to resolve class stuff.XMLUtils
Qualcuno può spiegare perché questo è? (Lo stuff.XMLUtils è solo alcuni script Groovy Ho compilato in/path/to/classes )
ho fatto qualche indagine, e utilizzando il seguente script Groovy per scaricare il programma di caricamento classe
def printClassPath(classLoader) {
println "$classLoader"
classLoader.getURLs().each {url->
println "- ${url.toString()}"
}
if (classLoader.parent) {
printClassPath(classLoader.parent)
}
}
printClassPath this.class.classLoader
Con il -classpath
ARG, non vedo alcuna voce nel classloader per il passato in classpath arg, (in realtà, l'unica directory è la directory di lavoro corrente), ad esempio:
[email protected]
[email protected]
[email protected]
- file:/usr/share/java/ant.jar
- ... (removed for brevity)
- file:/home/admin/groovy/
[email protected]
- file:/usr/java/jdk1.6.0_23/jre/lib/ext/sunjce_provider.jar
- ...
Utilizzando la versione CLASSPATH=...
mostra che la Abo PWD ve è sostituito dal valore che ho impostato nella variabile.
E se aggiungo il debug all'eseguibile shell Groovy, la differenza nella chiamata Java è che la versione -classpath
arg aggiunge alcuna voce per voce di classpath di Java (che è in ultima analisi, il motivo per cui sta dando una classe non trovato errore), ma il La versione CLASSPATH=...
aggiunge il percorso.
Si tratta di un bug in Groovy?
EDIT: semplice esempio in mancanza
- - - - 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
Se rimuovo il pacchetto e riferimenti al stuff
l'esempio in mancanza funzionerà bene.
Sto usando Linux, Fedora 15. La versione di Groovy 'Groovy Versione: 1.8.0 JVM: 1.6.0_22'. –
@ Mark Non esiste ancora una versione 1.8.0 groovy disponibile sul sito ufficiale, quindi non posso aiutarti. Ho anche fatto un test con Groovy versione 1.8.2, ma tutto funziona bene. Quindi ti consiglio di aggiornare Groovy. Saluti –
Hai provato ad aggiungere un pacchetto allo script che stavi testando? Sono stato in grado di eseguire correttamente '-classpath' o' CLASSPATH = ... 'se rimuovo l'istruzione del pacchetto e ho tutto a livello di pacchetto predefinito, ma non appena aggiungo la riga' package stuff' alla parte superiore e compilare, groovy non sembra trovarlo con l'argomento '-classpath'. Ho provato questo su un'altra macchina con 1.8.4 e ancora lo stesso problema. Ho aggiornato la mia domanda con un esempio dettagliato. –