2016-06-22 13 views
1

Ich versuche, ein Groovy-Skript von Java unter Verwendung GroovyClassLoader auszuführen. Im Grunde, was ich tue, ist dies:Hat ein Groovy-Skript, das von Java ausgeführt wird, den gleichen Klassenpfad?

GroovyClassLoader groovyLoader = new GroovyClassLoader(Thread.currentThread().getContextClassLoader()); 
clazz = groovyLoader.parseClass(myFile); 
GroovyObject go = (GroovyObject) go.newInstance(); 
return go.invokeMethod("MyMethod", myObject); 

Das Problem, das ist, wenn ich die groovy Datei bin Parsen, meine Importe nicht aufgelöst werden, obwohl die Klassen sind in den Java Classpath. Wenn ich eine Zeile mit hinzuzufügen:

groovyLoader.addClasspath("MyclassPath"); 

dann funktioniert alles einwandfrei (das ist unser letzter Ausweg, falls wir nicht in der Lage sind, dies herauszufinden). Das lässt mich denken, dass es zwei verschiedene Klassenpfade gibt, einen für Java und einen für Groovy. Da ich jedoch den Java-Klassenlader als Konstruktorargument für den GroovyClassloader übergebe, würde ich denken, dass, wenn die Klassen nicht im Groovy-Klassenpfad gefunden werden, sie in Java nachgeschlagen werden sollten.

Bin ich falsch? Kann jemand etwas Licht darauf werfen?

Vielen Dank.

+2

Ändert sich etwas, wenn Sie keinen eigenen Classloader übergeben, sondern nur den groovyClassLoader-Konstruktor no-arg verwenden? – Gimby

Antwort

0

Nach vielen Tests habe ich herausgefunden, dass der von Java gestartete Groovy in der Tat den gleichen Klassenpfad des startenden Java hat. Das Problem am OP wurde durch ein Konfigurationsproblem auf unserer Seite verursacht.

Für zukünftige Leser empfehle ich diese Frage How to get classpath in Groovy?, die eine Menge Hilfe während des Debugging-Prozesses gab.