2012-01-25 9 views

Odpowiedz

24

Jeśli nie przeszkadza kod w plik2 Będąc w with bloku, można zrobić:

new GroovyShell().parse(new File('file1.groovy')).with { 
    method() 
} 

Innym możliwym sposobem byłoby zmień file1.groovy na:

class File1 { 
    def method() { 
    println "test" 
    } 
} 

A potem w file2.groovy można użyć mixin dodać metody od file1

def script = new GroovyScriptEngine('.').with { 
    loadScriptByName('file1.groovy') 
} 
this.metaClass.mixin script 

method() 
+0

Użyłem metaClass.mixin działa idealnie. Dziękuję – ptomasroos

+0

Kolejne pytanie, krótkie związane. Jeśli chcę uruchomić skrypt zgodnie z jego przeznaczeniem, skrypt nie jest klasą. Nie można wywołać metody. Lika uruchamia lub wykonuje metodę. – ptomasroos

+0

Prawdopodobnie chcesz [GroovyShell.evaluate] (http://groovy.codehaus.org/api/groovy/lang/GroovyShell.html#evaluate (java.io.File)) –

11

Możesz ocenić dowolne wyrażenie lub scenariusz w Groovy używając GroovyShell.

File2.groovy

GroovyShell shell = new GroovyShell() 
def script = shell.parse(new File('/path/file1.groovy')) 
script.method() 
+0

Czy wiesz, jeśli jego możliwości aby uzyskać metody jak w bieżącym skrypcie. ten + = skrypt. Jeśli rozumiesz. To jest bardziej, o co mi chodzi. – ptomasroos

+1

Metoda wywołania jest nieprawidłowa. powinno to być script.invokeMethod ("method", args) przy założeniu, że "metoda" jest statyczna. – codeDr

+0

To działa dobrze dla mnie. 'file1.groovy' nie musi być klasą rzeczywistą ani metodami statycznymi. –

13

najłatwiej będzie jeśli file1.groovy jest rzeczywista klasa class File1 {...}.

Biorąc pod uwagę, że innym sposobem na to jest, aby załadować plik do GroovyClassLoader:

this.class.classLoader.parseClass("src/File1.groovy") 

File1.method() 

File1.newInstance().anotherMethod() 
+2

można również powiedzieć def script = this.class.classLoader.parseClass ("..."); def object = script.newInstance() – codeDr

+0

Używałem tego również (w Jenkins) i wygląda na to, że zjada się PermSpace. Zobacz tutaj: http://stackoverflow.com/questions/24169976/understanding-groovy-grails-classloader-leak http://stackoverflow.com/questions/712187/troubleshooting-grails-groovy-memory-leaks Zastanawiam się, czy to naprawdę powinno być zalecane dla aplikacji serwerowych. –

+0

To jest dziwactwo: więc byłoby btter rozważyć inny sposób wywołania parseClass i użyć tego z '.parseClass (nowy plik (" .. "))' Patrz http://stackoverflow.com/questions/13993611/why-cant-i-instancja-a-groovy-klasa-od-innej-groovy-klasa – Kuzeko

3

Oto co używam.

1: Napisz any_path_to_the_script.groovy jako klasa

2: skryptu wywołującego, przeznaczenie:

def myClass = this.class.classLoader.parseClass(new File("any_path_to_the_script.groovy")) 
myClass.staticMethod() 

To działa w konsoli skryptu Jenkins Groovy. Nie próbowałem metod niestatycznych.

+0

(ten sam komentarz co do podobnej odpowiedzi powyżej) Używam tego również (w Jenkins) i wygląda na to, że to jest zjedzenie PermSpace. Zobacz tutaj: http://stackoverflow.com/questions/24169976/understanding-groovy-grails-classloader-leak http://stackoverflow.com/questions/712187/troubleshooting-grails-groovy-memory-leaks Zastanawiam się, czy to naprawdę powinno być zalecane dla aplikacji serwerowych. –

6

Spóźniam się na to, ale. W ten sposób osiągnęliśmy to, o co prosiłeś. Tak, mam file1.gsh tak:

pliku Plik1:

println("this is a test script") 

def Sometask(param1, param2, param3) 
{ 
    retry(3){ 
     try{ 
      ///some code that uses the param 
     } 
     catch (error){ 
      println("Exception throw, will retry...") 
      sleep 30 
      errorHandler.call(error) 
     } 
    } 
} 

return this; 

A w innym pliku, funkcje te mogą być dostępne przez pierwszą instancję. Tak więc w file2.

File2:

def somename 
somename = load 'path/to/file1.groovy' 
//the you can call the function in file1 as 

somename.Sometask(param1, param2, param3) 
+2

Działa doskonale na rurociągu Jenkinsa! (Uwaga: Na początku zapomniałem 'return this' na końcu mojego skryptu, więc' load' zwróciło 'null'). – JonesV

+0

Ścieżka 'load '/ do/file'' działa bezbłędnie, nie wiem, dlaczego tak trudno było znaleźć, chociaż jeśli dobrze pamiętam, to nie działało, gdy poprzedzono przedrostkiem'./' –

+0

Co to" zwraca " ? Powinno to być jak obiekt skryptowy lub coś w świetnym SDK. (Sprawdziłem już obiekt "Script", ale nie ma w nim metody "load"). – zgulser