2012-02-22 13 views
6

Wywoływanie groovy skrypt korzystając CLASSPATH prefiks następująco działa dobrze:Dlaczego nie używasz argumentu classpath?

CLASSPATH=/path/to/classes groovy -e "(new stuff.XMLUtils()).printIt('test string')" 

ale zmieniając go użyć argumentu ścieżce klasy nie:

groovy -classpath /path/to/classes -e "(new stuff.XMLUtils()).printIt('test string')" 

i daje błąd:

script_from_command_line: 1: unable to resolve class stuff.XMLUtils 

Czy ktoś może wyjaśnić, dlaczego tak jest? (The stuff.XMLUtils to tylko niektóre Groovy skrypt I została skompilowana w/ścieżka/do/classes )

robiłem jakieś dochodzenie, a wykorzystujące następujące groovy skrypt zrzucić classloader

def printClassPath(classLoader) { 
    println "$classLoader" 
    classLoader.getURLs().each {url-> 
    println "- ${url.toString()}" 
    } 
    if (classLoader.parent) { 
    printClassPath(classLoader.parent) 
    } 
} 
printClassPath this.class.classLoader 

z -classpath arg, nie widzę wpis w classloader dla przekazany w ścieżce klasy arg, (w rzeczywistości, tylko katalog jest obecny roboczego dir), np:

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

Korzystanie wersję CLASSPATH=... pokazuje, że Wpis PWD abo ve jest zastąpione przez wartość ustawioną w zmiennej.

A jeśli dodaję debugowanie do pliku wykonywalnego powłoki groovy, różnica w wywołaniu java jest taka, że ​​wersja arg -classpath nie dodaje żadnego wpisu do wpisu ścieżki klasy java (co jest ostatecznie powodem, dla którego daje błąd klasy nie znaleziono), ale Wersja CLASSPATH=... dodaje ścieżkę.

Czy to błąd w groovy?

EDIT: prosty przykład braku

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

Jeśli usunąć pakiet i odniesień do stuff przykładem braku będzie działać dobrze.

Odpowiedz

4

Odpowiadając na to pytanie, ponieważ znalazłem rozwiązanie tego problemu.

używałem domyślnego Groovy paczki od yum w Fedorze jednak znaleźć wiele zagadnień (błędy począwszy groovysh etc, nie mogąc znaleźć pakiet jline itp), a nie w całości przeniesione do korzystania pobrane wersje z codehaus.org i ręcznie określając GROOVY_HOME i ścieżkę edycyjną, aby zamiast tego wywołać pobrany plik.

Teraz wszystkie moje przykłady działają zgodnie z oczekiwaniami.

0

To dziwne. Próbowałem tylko powtórzyć twój wyjaśniony problem, ale wszystko wydaje się działać dobrze (zrobiłem testy z Groovy-Version 1.8.6, 1.7.7 i 1.7.0 na moim komputerze Ubuntu).

Więc której wersji używasz i jaki jest twój system operacyjny?

W trackerze Groovy Bug znalazłem następujący błąd: Command line option for classpath (--cp/--classpath) is broken on Windows. Ale ten błąd dotyczy tylko starszych wersji Groovy (1.5.2, 1.5.3 i 1.5.4). Więc może ulepszenie Groovy pomoże rozwiązać twój problem ...

PS: Normalnie po prostu komentuję to, ale niestety nie mam wystarczająco dużo punktów, aby to zrobić :).

+0

Używam systemu Linux, Fedora 15. Wersja groovy 'Groovy Version: 1.8.0 JVM: 1.6.0_22'. –

+0

@Mark Na oficjalnej stronie internetowej nie ma jeszcze wersji 1.8.0, więc nie mogę ci pomóc. Zrobiłem również test z groovy w wersji 1.8.2, ale wszystko działa dobrze. Polecam więc ulepszyć groovy. Pozdrowienia –

+0

Czy próbowałeś dodać pakiet do testowanego skryptu? Udało mi się uruchomić '-classpath' lub' CLASSPATH = ... ', jeśli usunę instrukcję pakietu i będę miał wszystko na domyślnym poziomie pakietu, ale zaraz po dodaniu linii 'pakiet stuff' na górę i kompilacja, groovy nie znajduje go w argumencie "-classpath". Próbowałem tego na innym komputerze z wersją 1.8.4 i nadal ten sam problem. Zaktualizowałem moje pytanie, podając szczegółowy przykład. –

3

jestem na MSYS/Win32 + porywające 2.2 RC1 i mają inny twist:

Groovy Cp "./*" script.groovy // działa!

Groovy cp some.jar script.groovy // ... nie

Z jakiegoś powodu, żaden z powyższych będzie działać w moim przypadku.

Powiązane problemy