你如何在groovy中获得正在运行的脚本的路径?

时间:2009-07-22 04:39:11

标签: groovy

我正在编写一个groovy脚本,我希望通过存储在同一文件夹中的属性文件来控制它。但是,我希望能够从任何地方调用此脚本。当我运行脚本时,它总是根据运行的位置查找属性文件,而不是脚本所在的位置。

如何从脚本中访问脚本文件的路径?

6 个答案:

答案 0 :(得分:73)

new File(".").getCanonicalPath()不起作用是对的。返回工作目录

获取脚本目录

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

获取脚本文件路径

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

答案 1 :(得分:11)

如果您将Groovy代码作为脚本运行,这是有道理的,否则整个想法会有点混乱,IMO。解决方法如下:https://issues.apache.org/jira/browse/GROOVY-1642

基本上这涉及更改startGroovy.sh以将Groovy脚本的位置作为环境变量传递。

答案 2 :(得分:10)

从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方案类型),否则Paths.get(URI)将被data:抛出调用。某些Groovy运行时(例如groovyshell和nextflow)将返回FileSystemProvider URI,该URI通常不会与已安装的DocumentRoot "/var/www/site" <Directory "/var/www/site"> Options Indexes FollowSymLinks Includes AllowOverride All Require all granted </Directory> <IfModule dir_module> DirectoryIndex index.php </IfModule> 匹配。

答案 3 :(得分:1)

另一种解决方案。即使您使用GrovyConsole运行脚本,它也可以完美运行

File getScriptFile(){
    new File(this.class.classLoader.getResourceLoader().loadGroovySource(this.class.name).toURI())
}

println getScriptFile()

答案 4 :(得分:0)

对于gradle用户

当我开始使用gradle时,我遇到同样的问题。我想通过远程thrift编译器编译我的thrift(由我的公司定制)。

以下是我解决问题的方法:

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

答案 5 :(得分:0)

解决方法:对我们来说,它运行在ANT环境中,并且在Java环境属性(Unable to process template language expressions for resource '/subscriptions/2c9ecdfxxxxx/resourceGroups/moglum-test1-RG-cagtkca6aky5o/providers/Microsoft.Resources/deployments/moglum-test1-NDEPL-cagtkca6aky5o' at line '52' and column '5'. 'Unable to evaluate template language function 'resourceId': function requires fully qualified resource type 'Microsoft.Network/networkSecurityGroups' as one of first three arguments for resource at resource group scope, or first two arguments for resource at subscription scope. Please see https://aka.ms/arm-template-expressions/#resourceid for usage details. 中存储了一些位置父项(知道子路径),我们可以通过以下方式访问目录祖先Groovy的System.setProperty( "dirAncestor", "/foo" )
也许这对这里提到的某些情况会有所帮助。