web-dev-qa-db-ja.com

Groovyで実行中のスクリプトのパスを取得するにはどうすればよいですか?

同じフォルダーに保存されているプロパティファイルを介して制御したいgro​​ovyスクリプトを書いています。ただし、どこからでもこのスクリプトを呼び出すことができます。スクリプトを実行すると、スクリプトの場所ではなく、実行元に基づいて常にプロパティファイルが検索されます。

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

64
Dan Woodward

Groovy 2.3.0以降、_@groovy.transform.SourceURI_注釈を使用して、スクリプトの場所のURIを変数に設定できます。このURIを使用して、スクリプトへのパスを取得できます。

_import groovy.transform.SourceURI
import Java.nio.file.Path
import Java.nio.file.Paths

@SourceURI
URI sourceUri

Path scriptLocation = Paths.get(sourceUri)
_

これは、URIが_file:_ URI(または FileSystemProvider がインストールされた別のURIスキームタイプ)のみで機能することに注意してください。そうでない場合は FileSystemNotFoundException がスローされますPaths.get(URI)呼び出し。 groovyshellやnextflowなどの特定のGroovyランタイムは、_data:_ URIを返します。これは通常、インストール済みのFileSystemProviderとは一致しません。

10
M. Justin

new File(".").getCanonicalPath()が機能しないことは正しいです。 作業ディレクトリを返します。

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

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

スクリプトファイルのパスを取得するには

scriptFile = getClass().protectionDomain.codeSource.location.path
75
seansand

これは、Groovyコードをスクリプトとして実行している場合に意味があります。回避策はここにあります: https://issues.Apache.org/jira/browse/GROOVY-1642

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

11
Joshua Davis

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/"
            }
        }
    }
}
0
Liem Le