Базовая настройка Groovy Script Engine - PullRequest
0 голосов
/ 08 июля 2011

Фон (можно пропустить):

Недавно я написал облегченный сервер на Java, который опрашивает новые подключения к порту, а затем, когда клиент подключается, он дает им свой собственный поток, пока сокет не закроется. Теперь, когда мне нужно подключиться к клиенту, я должен подготовиться к запросам файлов XML особым образом; Если клиент запрашивает файл file1.xml, сервер должен прочитать файл file1.xml, проанализировать его в JSON и отправить клиенту объект json.

Проблема конкретная (сейчас начинаем чтение): Мне нужно разобрать файлы XML в объекты JSON в Java. Я был рекомендован GROOVY для этой задачи. Это было легко установить как на мой Mac, так и на Ubuntu, но я не могу заставить работать inline Groovy, и причина, скорее всего, очень тривиальная. Вот что я сейчас тестирую (сейчас я просто пытаюсь заставить работать встроенный Groovy):

test.groovy

output = "Hello ${input}!" 

test.java

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

String[] roots = new String[] { "/home/nick/Documents" }; 
GroovyScriptEngine gse = new GroovyScriptEngine(roots); 
Binding binding = new Binding(); 
binding.setVariable("input", "world"); 
gse.run("test.groovy", binding); 
System.out.println(binding.getVariable("output")); 

Оба эти файла находятся в моей папке /home/nick/Documents. Когда я пытаюсь скомпилировать с:

javac test.java 

Я получаю 6 ошибок:

test.java:4: class, interface, or enum expected 
String[] roots = new String[] { "/home/nick/Documents" }; 
^ 
test.java:5: class, interface, or enum expected 
GroovyScriptEngine gse = new GroovyScriptEngine(roots); 
^ 
test.java:6: class, interface, or enum expected 
Binding binding = new Binding(); 
^ 
test.java:7: class, interface, or enum expected 
binding.setVariable("input", "world"); 
^ 
test.java:8: class, interface, or enum expected 
gse.run("test.groovy", binding); 
^ 
test.java:9: class, interface, or enum expected 
System.out.println(binding.getVariable("output")); 
^ 
6 errors 

Я чувствую, что делаю что-то не так на этапе компиляции. Как я могу получить эту компиляцию и запуск?

Помощь очень ценится

1 Ответ

4 голосов
/ 08 июля 2011

Поскольку test.java является классом Java, а не скриптом Groovy, вам нужно обернуть код в класс (переименованный в Test.java с большой буквы T). Вам также нужно поймать или бросить несколько исключений:

import groovy.lang.Binding;
import groovy.util.GroovyScriptEngine;
import groovy.util.ResourceException ;
import groovy.util.ScriptException ;
import java.io.IOException ;

public class Test {
  public static void main( String[] args ) throws IOException, ResourceException, ScriptException {
    String[] roots = new String[] { "." };
    GroovyScriptEngine gse = new GroovyScriptEngine(roots);
    Binding binding = new Binding();
    binding.setVariable("input", "world");
    gse.run("test.groovy", binding);
    System.out.println(binding.getVariable("output"));
  }
}

Затем вам нужно скомпилировать этот класс Java с помощью groovy на пути к классам (для использования пути с подстановочными знаками требуется java 6, в противном случае вам потребуется заполнить полный путь к groovy-all-*.jar):

javac -cp $GROOVY_HOME/embeddable/*:. Test.java

И запустите его, указав правильный путь к классу:

java -cp $GROOVY_HOME/embeddable/*:. Test
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...