2013-10-08 3 views
3

Я установил Groovy.Можем ли мы Runtime.getRuntime(). Exec ("groovy");

enter image description here

И я пытаюсь запустить заводной скрипты из командной строки, которые я создал с помощью Java, например, так:

Runtime.getRuntime().exec("groovy"); 

Так что, если я типа в «заводной» в командной строке, это то, что я получаю:

>>>groovy 
Cannot run program "groovy": CreateProcess error=2, The system cannot find the file specified 

Есть ли у кого-нибудь идеи относительно того, что может пойти не так? Должен ли я просто использовать реализацию Groovy exec? Нравится:

def processBuilder=new ProcessBuilder("ls") 
processBuilder.redirectErrorStream(true) 
processBuilder.directory(new File("Your Working dir")) // <-- 
def process = processBuilder.start() 

Я полагаю, что неважно, использует ли реализация Java или реализацию Groovy.

Итак, как мне запустить отличный скрипт?

+2

Вы добавили Groovy на свой путь переменной окружающей среды? – BlackHatSamurai

+2

Почему бы вам [запустить его напрямую] (http://groovy.codehaus.org/Embedding+Groovy); это то, что он предназначен, чтобы сделать ... –

+0

@Blaine, да, я проверил это. –

ответ

2

Способ, изначально описанный в вопросе выше, вызывающем исполняемый файл groovy, вызывает второй экземпляр среды выполнения Java и загрузчик классов, в то время как эффективный способ заключается в том, чтобы встроить скрипт Groovy непосредственно в среду выполнения Java как класс Java и вызвать его.

Вот три способа, чтобы выполнить Groovy скрипта из Java:

1) Простейший путь с помощью GroovyShell:

Вот основная примера программа Java и целевой Groovy скрипта для вызова:

== == TestShell.java

import groovy.lang.Binding; 
import groovy.lang.GroovyShell; 

// call groovy expressions from Java code 
Binding binding = new Binding(); 
binding.setVariable("input", "world"); 
GroovyShell shell = new GroovyShell(binding); 
Object retVal = shell.evaluate(new File("hello.groovy")); 
// prints "hello world" 
System.out.println("x=" + binding.getVariable("x")); // 123 
System.out.println("return=" + retVal); // okay 

== hello.groovy ==

println "Hello $input" 
x = 123 // script-scoped variables are available via the GroovyShell 
return "ok" 

2) Далее следует использовать GroovyClassLoader, чтобы проанализировать сценарий в классе, а затем создать экземпляр его. Этот подход рассматривает скрипт Groovy как класс и вызывает на нем методы как на любом Java-классе.

GroovyClassLoader gcl = new GroovyClassLoader(); 
Class clazz = gcl.parseClass(new File("hello.groovy"); 
Object aScript = clazz.newInstance(); 
// probably cast the object to an interface and invoke methods on it 

3) Наконец, вы можете создать GroovyScriptEngine и передать объекты в качестве переменных с помощью связывания. Это запускает скрипт Groovy как скрипт и передает входные данные с использованием переменных привязки, а не вызывает явные методы с аргументами.

Примечание. Этот третий вариант предназначен для разработчиков, которые хотят встроить groovy-скрипты в сервер и перезагрузить их при модификации.

import groovy.lang.Binding; 
import groovy.util.GroovyScriptEngine; 

String[] roots = new String[] { "/my/groovy/script/path" }; 
GroovyScriptEngine gse = new GroovyScriptEngine(roots); 
Binding binding = new Binding(); 
binding.setVariable("input", "world"); 
gse.run("hello.groovy", binding); 
System.out.println(binding.getVariable("output")); 

Примечание: Вы должны включить groovy_all баночку в вашем CLASSPATH для этих подходов к работе.

Ссылка: http://groovy.codehaus.org/Embedding+Groovy

Смежные вопросы