40 votes

Charger le script à partir du script groovy

File1.groovy

def method() {
   println "test"
}

File2.groovy

method()

Je veux charger/inclure les fonctions/méthodes de File1.groovy pendant l'exécution, égal à la charge de rubys/rake. Ils sont dans deux répertoires différents.

32voto

tim_yates Points 63521

Si cela ne vous dérange pas que le code dans le fichier 2 se trouve dans un bloc with, vous pouvez faire :

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

Une autre méthode possible serait de changer file1.groovy en :

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

Et puis dans file2.groovy vous pouvez utiliser mixin pour ajouter les méthodes de file1

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

method()

19voto

Arturo Herrero Points 3676

Vous pouvez évaluer n'importe quelle expression ou script dans Groovy en utilisant GroovyShell.

File2.groovy

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

14voto

clmarquart Points 4426

Il sera plus facile si file1.groovy est une classe réelle class File1 {...}.

Ceci étant dit, une autre façon de le faire est de charger le fichier dans le GroovyClassLoader :

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

File1.method() 

File1.newInstance().anotherMethod()

10voto

OK999 Points 723

Je suis en retard à ce sujet, mais. C'est ainsi que nous avons réalisé ce que vous demandiez. Donc, j'ai un fichier1.gsh comme ça :

Fichier1 :

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;

Et dans l'autre fichier, on peut accéder à ces fonctions en instanciant d'abord. Donc dans le fichier 2.

Fichier2 :

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

somename.Sometask(param1, param2, param3)

3voto

filamoon Points 83

Voilà ce que j'utilise.

1 : Écrivez any_path_to_the_script.groovy en classe

2 : Dans le script d'appel, utilisez :

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

Il fonctionne dans la console de script Jenkins Groovy. Je n'ai pas essayé les méthodes non statiques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X