2012-02-22 16 views
6

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.

risposta

4

Rispondendo a me stesso perché ho trovato una soluzione al problema.

stavo usando il groove pacchetti da yum in Fedora di default, tuttavia trovato molti problemi (errori di partenza groovysh ecc, in grado di trovare il pacchetto jline, ecc), e si sono del tutto spostato verso utilizzando le versioni scaricate da codehaus.org, e manualmente specificando GROOVY_HOME e il percorso di modifica per richiamare invece quello scaricato.

Ora tutti i miei esempi funzionano come previsto.

0

Questo è strano. Ho appena provato a ripetere il problema spiegato, ma tutto sembra funzionare correttamente (ho eseguito test con Groovy-Versione 1.8.6, 1.7.7 e 1.7.0 sul mio computer Ubuntu).

Quindi quale versione utilizzi e qual è il tuo sistema operativo?

Nel Groovy Bug Tracker ho trovato il seguente bug: Command line option for classpath (--cp/--classpath) is broken on Windows. Ma questo bug riguarda solo le vecchie versioni di Groovy (1.5.2, 1.5.3 e 1.5.4). Quindi forse un aggiornamento di Groovy ti aiuterà a risolvere il tuo problema ...

PS: Normalmente vorrei solo commentare questo, ma sfortunatamente non ho abbastanza punti per farlo :).

+0

Sto usando Linux, Fedora 15. La versione di Groovy 'Groovy Versione: 1.8.0 JVM: 1.6.0_22'. –

+0

@ 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 –

+0

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. –

3

Sono su MSYS/Win32 + Groovy 2.2 RC1 e hanno un altro colpo di scena:

Groovy -cp "./*" script.groovy // Works!

Groovy -cp some.jar script.groovy // ... non

Per qualche ragione, nessuna delle precedenti avrebbe funzionato nel mio caso.

Problemi correlati