2009-07-22 6 views
57

私は同じフォルダに格納されたプロパティファイルを使って制御したいグルーヴィースクリプトを書いています。しかし、どこからでもこのスクリプトを呼び出せるようにしたい。スクリプトを実行すると、スクリプトの場所ではなく、実行される場所に基づいて常にプロパティファイルが検索されます。実行スクリプトのパスをgroovyでどのように取得しますか?

スクリプト内からスクリプトファイルのパスにアクセスするにはどうすればよいですか?

答えて

68

new File(".").getCanonicalPath()は正しく動作しません。これにより、作業ディレクトリが返されます。

は、そうでない場合は全体的なアイデアを取得、スクリプトとしてのGroovyコード を実行している場合、これは理にかなって、スクリプトファイルのパス

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

興味深い:以下

は、私は私の問題を解決する方法です。それは私が期待したように動作しません。しかし、それはガントからガントスクリプトを実行しているという事実によるものです。だから、codeSourceは実際にgantがどこにあり、私のスクリプトがどこにあるのかわからない。 –

+0

私のためには機能しません。 'getClass()。protectionDomain.codeSource'はnullを返します。私はGroovy 2.0.1を使用しています。 – quux00

+0

Groovy 1.8.5でも(ウィンドウ上で)動作しません – Fels

11

に取得するには、スクリプトディレクトリ

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

を取得するには少し紛らわしい、IMO。回避策は次のとおりです。https://issues.apache.org/jira/browse/GROOVY-1642

基本的には、startGroovy.shを変更して環境変数としてGroovyスクリプトの場所を渡します。

0

Gradleのユーザーのために

私はGradleので動作するように始めているとき、私は同じ問題を持っています。私は遠隔の倹約コンパイラ(私の会社のカスタム)によって私の倹約をコンパイルしたい。

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