Как вы получаете путь запуска сценария в Groovy? - PullRequest
63 голосов
/ 22 июля 2009

Я пишу отличный сценарий, которым я хочу управлять через файл свойств, хранящийся в той же папке. Тем не менее, я хочу иметь возможность вызывать этот скрипт из любого места. Когда я запускаю скрипт, он всегда ищет файл свойств в зависимости от того, откуда он запущен, а не от того, где находится скрипт.

Как я могу получить доступ к пути файла скрипта из скрипта?

Ответы [ 4 ]

74 голосов
/ 23 июля 2009

Вы правы, что new File(".").getCanonicalPath() не работает. Это возвращает рабочий каталог .

Чтобы получить каталог скриптов

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

Чтобы получить путь к файлу скрипта

scriptFile = getClass().protectionDomain.codeSource.location.path
11 голосов
/ 23 февраля 2010

Это имеет смысл, если вы запускаете Groovy-код в виде скрипта , в противном случае вся идея становится немного запутанной, ИМО. Обходной путь здесь: https://issues.apache.org/jira/browse/GROOVY-1642

В основном это включает изменение startGroovy.sh для передачи местоположения скрипта Groovy в качестве переменной среды.

10 голосов
/ 22 мая 2018

Начиная с 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 (или другим типом схемы URI с установленным FileSystemProvider ), в противном случае FileSystemNotFoundException будет выброшено Paths.get(URI) звонок. Некоторые среды выполнения Groovy, такие как groovyshell и nextflow, будут возвращать URI data:, который обычно не соответствует установленному FileSystemProvider.

0 голосов
/ 30 января 2018

Для пользователя 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/"
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...