同じフォルダーに保存されているプロパティファイルを介して制御したいgroovyスクリプトを書いています。ただし、どこからでもこのスクリプトを呼び出すことができます。スクリプトを実行すると、スクリプトの場所ではなく、実行元に基づいて常にプロパティファイルが検索されます。
スクリプト内からスクリプトファイルのパスにアクセスするにはどうすればよいですか?
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
とは一致しません。
new File(".").getCanonicalPath()
が機能しないことは正しいです。 作業ディレクトリを返します。
スクリプトディレクトリを取得するには
scriptDir = new File(getClass().protectionDomain.codeSource.location.path).parent
スクリプトファイルのパスを取得するには
scriptFile = getClass().protectionDomain.codeSource.location.path
これは、Groovyコードをスクリプトとして実行している場合に意味があります。回避策はここにあります: https://issues.Apache.org/jira/browse/GROOVY-1642
基本的に、これにはstartGroovy.shを変更してGroovyスクリプトの場所を環境変数として渡すことが含まれます。
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/"
}
}
}
}