2011-07-07 78 views
0

背景(可跳過):基本Groovy腳本引擎設置

我最近用Java寫了一個輕量級的服務器輪詢一個端口上的新連接,然後當客戶端連接它給了他們自己的線程,直至插槽關閉。現在,一旦客戶端連接,我需要做的是以特殊的方式準備XML文件請求;如果客戶端請求file1.xml,則服務器需要讀取file1.xml,將其解析爲JSON,然後將json對象發送給客戶端。

問題具體(現在開始閱讀): 我需要將XML文件解析爲Java中的JSON對象。我被推薦GROOVY來完成這項任務。在我的Mac和Ubuntu分區上安裝是一件輕而易舉的事情,但我無法使內聯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 

我覺得我做錯了什麼在編譯階段。我怎樣才能得到這個編譯和運行?

幫助非常感謝

+0

所以,該ScriptEngine是真的裝載所有的腳本依賴一個引擎爲一個項目? – djangofan

回答

4

由於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")); 
    } 
} 

然後,你需要編譯的類路徑上(使用通配符路徑使用Groovy這個Java類需要Java 6,否則你將需要填寫到groovy-all-*.jar完整路徑):

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

,並用正確的classpath太運行: