2009-07-22 10 views
57

Sto scrivendo uno script groovy che voglio controllare tramite un file di proprietà memorizzato nella stessa cartella. Tuttavia, voglio essere in grado di chiamare questo script da qualsiasi luogo. Quando eseguo lo script, cerca sempre il file delle proprietà in base a dove viene eseguito, non dove è lo script.Come si ottiene il percorso della sceneggiatura in esecuzione?

Come accedere al percorso del file di script dall'interno dello script?

risposta

68

È corretto che new File(".").getCanonicalPath() non funzioni. Restituisce la directory di lavoro .

Per ottenere la directory di script

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

Per ottenere il percorso del file di script

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

Interessante. Non funziona come mi aspettavo. Ma questo è dovuto al fatto che sto eseguendo uno script gant di Gant. Quindi il codeSource è in realtà dove gant è, non dove è il mio script. –

+0

Non funziona per me. 'getClass(). protectionDomain.codeSource' restituisce null. Sto usando Groovy 2.0.1. – quux00

+0

Non funziona su Groovy 1.8.5 (su Windows) – Fels

11

Questo ha un senso se si esegue il codice Groovy come uno script, altrimenti l'idea ottiene un po 'di confusione, IMO. La soluzione è qui: https://issues.apache.org/jira/browse/GROOVY-1642

Fondamentalmente ciò comporta la modifica di startGroovy.sh per passare nella posizione dello script Groovy come variabile di ambiente.

0

Per l'utente Gradle

Ho lo stesso problema quando sto iniziando a lavorare con Gradle. Voglio compilare il mio parsimonia con il compilatore di parsimonia remoto (personalizzato dalla mia azienda).

seguito è riportato come ho risolto il mio problema:

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/" 
      } 
     } 
    } 
} 
Problemi correlati