2009-07-22 7 views
57

J'écris un script groovy que je veux être contrôlé via un fichier de propriétés stocké dans le même dossier. Cependant, je veux être capable d'appeler ce script de n'importe où. Lorsque j'exécute le script, il recherche toujours le fichier de propriétés en fonction de l'endroit où il est exécuté, et non pas où se trouve le script.Comment obtenez-vous le chemin du script en cours d'exécution dans groovy?

Comment puis-je accéder au chemin du fichier script à partir du script?

Répondre

68

Vous avez raison: new File(".").getCanonicalPath() ne fonctionne pas. Cela renvoie le répertoire de travail.

Pour obtenir le répertoire script

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

Pour obtenir le chemin du fichier script

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

Intéressant. Cela ne fonctionne pas comme je le souhaitais. Mais c'est dû au fait que je cours un script gant de Gant. Donc le codeSource est réellement où gant est, pas où mon script est. –

+0

Ne fonctionne pas pour moi. 'getClass(). protectionDomain.codeSource' renvoie null. J'utilise Groovy 2.0.1. – quux00

+0

Ne fonctionne pas sur Groovy 1.8.5 non plus (sur Windows) – Fels

11

Cela est logique si vous exécutez le code Groovy comme un script, sinon l'idée obtient un peu déroutant, OMI. La solution de contournement est ici: https://issues.apache.org/jira/browse/GROOVY-1642

Fondamentalement, cela implique de changer startGroovy.sh pour passer à l'emplacement du script Groovy en tant que variable d'environnement.

0

Pour les utilisateurs gradle

J'ai même problème quand je commence à travailler avec gradle. Je veux compiler mon épargne par compilateur d'épargne à distance (personnalisé par mon entreprise).

est ci-dessous comment je résolu mon problème:

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/" 
      } 
     } 
    } 
} 
Questions connexes