2009-04-07 9 views
2

Ich versuche, einen Eclipse-Code-Builder zu erweitern (zum Generieren von DTOs aus Hibernate-VOs) - und es verwendet Groovy für sein Template-System.Wie lege ich einen eingebetteten Groovy-Skript-Klassenpfad fest?

Der Code das groovy Script erstellen verwendet, ist ein wenig seltsam (nicht das, was ich in dem Groovy docs sehen), aber es funktioniert, vor allem:

GroovyShell shell = new GroovyShell(); 
script = shell.parse(source); 

Dann später:

Binding binding = (bindings == null ? new Binding() : new Binding(bindings)); 
Script scriptInstance = InvokerHelper.createScript(script.getClass(), binding); 
scriptInstance.setProperty("out", out); 
scriptInstance.run(); 
out.flush(); 

Jetzt funktioniert das ganz gut, bis es einen Verweis auf ein Objekt trifft, das nicht direkt im Projekt ist. Im Skript durchläuft es die Eigenschaften der Klasse, die es verarbeitet - wenn es das tut, betrachtet Groovy alle Methoden und wenn es eine Klassendefinition für einen der Methodenparameter nicht finden kann, wird es kaputt gemacht. In diesem Fall stirbt es, wenn es irgendwelche Hinweise auf Hibernate findet, aber ich bin mir sicher, dass es mit viel mehr auskommen wird. Es muss ihnen nichts tun, aber es kann nicht leben, ohne zu wissen, was sie offensichtlich sind.

Script scheint keinen Classloader zu haben, den ich Klassenpfad Informationen liefern kann, also habe ich versucht, es an die GroovyShell - kein Unterschied.

Was ist der richtige Weg, um dies zu beheben, so dass der Groovy-Interpreter meine Projekte finden kann, referenziert Jars?

Antwort

2

Ich hatte genau dieses Problem und löste es durch meine eigene URLClassLoader zu schaffen, und die Reflexion eines geschützten Methode aufrufen, einen neuen Weg zum ClassPath

// Specify the path you want to add 
URL url = new URL("file://path/to/classes/here"); 

// Create a new class loader as a child of the default system class loader 
ClassLoader loader = new URLClassLoader(System.getClass().getClassLoader()); 

// Get the AddURL method and call it 
Method method = URLClassLoader.class.getDeclaredMethod("addURL",new Class[]{URL.class}); 
method.setAccessible(true); 
method.invoke(loader,new Object[]{ url }); 

GroovyShell shell = new GroovyShell(loader); 
+0

Konnte etwas Ähnliches direkt mit .groovy Akten getan werden? (dh ohne sie zuerst zu kompilieren) – hithwen

0

Ich habe das gleiche Problem zu versuchen, hinzufügen automatisieren Sie Gant-Skripte. Die Lösung, die ich gefunden ist:

  1. Kopie gant-starter.conf (oder groovy-starter.conf wenn es nur groovy) von $ GROOVY_HOME/conf auf Ihre eigenen dir;

  2. "load [Verzeichnis]" oder "load [jar]" dort hinzufügen, wie in javadocs zu org.codehaus.groovy.tools.LoaderConfiguration beschrieben, in Groovy Quellenverteilung gefunden;

  3. vor groovy Satz groovy.starter.conf.override System Eigenschaft auf den Namen der Datei starten, wie -Dgroovy.starter.conf.override = [Dateiname]

2

Die selbe wie @James kann getan werden, ohne Reflexion zu verwenden, das Laden aller Jar-Dateien von einem bestimmten Ordner: