2009-07-22 13 views
57

Ich schreibe ein grooviges Skript, das über eine im selben Ordner gespeicherte Eigenschaftendatei gesteuert werden soll. Ich möchte jedoch dieses Skript von überall aufrufen können. Wenn ich das Skript ausführe, sucht es immer nach der Eigenschaftendatei, basierend darauf, woher es ausgeführt wird, nicht wo das Skript ist.Wie bekommst du den Pfad des laufenden Skripts in groovy?

Wie kann ich auf den Pfad der Skriptdatei innerhalb des Skripts zugreifen?

Antwort

68

Sie haben richtig, dass new File(".").getCanonicalPath() nicht funktioniert. Dadurch wird das Arbeitsverzeichnis zurückgegeben.

Um das Skript Verzeichnis

scriptDir = new File(getClass().protectionDomain.codeSource.location.path).parent 

zur Skriptdatei Pfad

scriptFile = getClass().protectionDomain.codeSource.location.path 
+0

Interessant. Es funktioniert nicht so, wie ich es erwartet habe. Aber das liegt daran, dass ich ein Gant-Skript von Gant ausführe. Also die Codequelle ist eigentlich wo Gant ist, nicht wo mein Skript ist. –

+0

Funktioniert nicht für mich. 'getClass(). protectionDomain.codeSource gibt null zurück. Ich benutze Groovy 2.0.1. – quux00

+0

Funktioniert nicht auf Groovy 1.8.5 entweder (auf Windows) – Fels

11

Dies macht Sinn zu erhalten, wenn man den Groovy-Code als Skript, sonst ist die ganze Idee bekommt laufen ein wenig verwirrend, IMO. Die Problemumgehung ist hier: https://issues.apache.org/jira/browse/GROOVY-1642

Im Grunde bedeutet das Ändern von startGroovy.sh, um den Speicherort des Groovy-Skripts als Umgebungsvariable übergeben.

0

Für gradle Benutzer

Ich habe gleiches Problem, wenn ich beginne mit gradle zu arbeiten. Ich möchte meine Sparsamkeit durch Remote-Sparset-Compiler (von meiner Firma custom) kompilieren.

Unten ist, wie ich mein Problem gelöst:

task compileThrift { 
doLast { 
     def projectLocation = projectDir.getAbsolutePath(); // HERE is what you've been looking for. 
     ssh.run { 
      session(remotes.compilerServer) { 
       // Delete existing thrift file. 
       cleanGeneratedFiles() 
       new File("$projectLocation/thrift/").eachFile() { f -> 
        def fileName=f.getName() 
        if(f.absolutePath.endsWith(".thrift")){ 
         put from: f, into: "$compilerLocation/$fileName" 
        } 
       } 
       execute "mkdir -p $compilerLocation/gen-java" 
       def compileResult = execute "bash $compilerLocation/genjar $serviceName", logging: 'stdout', pty: true 
       assert compileResult.contains('SUCCESSFUL') 
       get from: "$compilerLocation/$serviceName" + '.jar', into: "$projectLocation/libs/" 
      } 
     } 
    } 
} 
Verwandte Themen