2009-07-22 18 views
57

Piszę groovy skrypt, który chcę kontrolować za pośrednictwem pliku właściwości przechowywane w tym samym folderze. Jednak chcę móc wywoływać ten skrypt z dowolnego miejsca. Po uruchomieniu skryptu zawsze szuka pliku właściwości na podstawie tego, skąd jest uruchamiany, a nie gdzie znajduje się skrypt.Jak uzyskać ścieżkę do uruchomionego skryptu w groovy?

Jak uzyskać dostęp do ścieżki skryptu z poziomu skryptu?

Odpowiedz

68

Masz rację, że new File(".").getCanonicalPath() nie działa. To zwraca katalog roboczy .

Aby uzyskać katalogu skryptu

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

uzyskać ścieżkę pliku skryptu

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

Interesujące. Nie działa tak, jak tego oczekiwałem. Ale wynika to z faktu, że używam skryptu z Ganta. Tak więc kodSource jest w rzeczywistości tym, gdzie jest Gant, a nie gdzie jest mój skrypt. –

+0

Nie działa dla mnie. 'getClass(). protectionDomain.codeSource' zwraca null. Używam Groovy 2.0.1. – quux00

+0

Nie działa na Groovy 1.8.5 (na windows) – Fels

11

Ma to sens, jeśli używasz kodu Groovy jako skrypt, inaczej cała idea staje trochę mylące, IMO. Sposób obejścia tego problemu: https://issues.apache.org/jira/browse/GROOVY-1642

Zasadniczo wiąże się to ze zmianą parametru startGroovy.sh w celu przekazania lokalizacji skryptu Groovy jako zmiennej środowiskowej.

0

Dla Gradle użytkownik

Mam ten sam problem, kiedy zaczynam pracę z Gradle. Chcę skompilować moją oszczędność przez zdalny kompilator oszczędzania (na zamówienie mojej firmy).

Poniżej jak to rozwiązać mój problem:

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/" 
      } 
     } 
    } 
} 
Powiązane problemy