Ну, это кажется простой задачей, но мне не удалось заставить его работать.
У меня есть отличный сценарий, который хорошо работает под Windows Vista при вызове от подсказки:
> cd MY_GAILS_PROJECT_DIR
> groovy cp src/groovy scripts/myscript.groovy
Теперь, я хочу выполнить этот сценарий (и передающий ему некоторые входные параметры) через мой мой Класс Услуги по сопровождению (названный от контроллера) как ниже,
class MaintenanceService {
def executeMyScript() {
"groovy cp src/groovy scripts/myscript.groovy".execute()
}
}
Это не работает вообще! Мне даже не удается иметь выполнение () метод, распознающий любую команду (как "cd .".execute()
) выдача исключения:
Error 500: java.io.IOException: Cannot run program "cd": CreateProcess error=2, The system cannot find the file specified
1-, Как я могу выполнить отличный сценарий из своего приложения чаш Грааля?
2-, Каковы лучшие практики здесь? Например, я должен использовать QuartzPlugin и затем triggerNow метод для выполнения сценария? я должен использовать Задачу Gant? Если да, как сделать это?
Спасибо.
Если вы не возражаете против того, чтобы ваш скрипт работал асинхронно (в отдельном процессе от метода службы), следующее должно работать, если groovy
находится в вашей переменной PATH:
def cmd = ['groovy.bat', 'cp', 'src/groovy scripts/myscript.groovy']
cmd.execute()
Если вы хотите просмотреть вывод процесса в консоли приложения, попробуйте вместо этого что-то вроде этого
// Helper class for redirecting output of process
class StreamPrinter extends Thread {
InputStream inputStream
StreamPrinter(InputStream is) {
this.inputStream = is
}
public void run() {
new BufferedReader(new InputStreamReader(inputStream)).withReader {reader ->
String line
while ((line = reader.readLine()) != null) {
println(line)
}
}
}
}
// Execute the script
def cmd = ['groovy', 'cp', 'src/groovy scripts/myscript.groovy']
Process executingProcess = cmd.execute()
// Read process output and print on console
def errorStreamPrinter = new StreamPrinter(executingProcess.err)
def outputStreamPrinter = new StreamPrinter(executingProcess.in)
[errorStreamPrinter, outputStreamPrinter]*.start()
Обновление: В ответ на ваш комментарий ниже попробуйте следующее (предполагается, что вы работаете в Windows):
1: Создайте файл C: \ tmp \ foo.groovy. Содержимое этого файла должно быть простым:
println 'it works!'
2: В консоли Groovy запустите следующее:
cmd = ['groovy.bat', 'C:\\tmp\\foo.groovy']
cmd.execute().text
3: Вы должны увидеть результат сценария (текст «работает!»), Показанный в консоли Groovy.
Если вы не можете заставить этот простой пример работать, что-то не так с вашей средой, например 'groovy.bat' отсутствует в вашем PATH. Если вам удастся заставить этот пример работать, то вы сможете продвигаться вперед для достижения своей цели.
Самый простой способ:
Создайте класс Groovy и поместите его в папку / src / groovy вашего проекта Grails. Импортируйте этот класс в свой класс домена и используйте определенные вами функции.
Мои 2 цента ...