2014-09-05 53 views
1

我在使用Jboss中的GroovyScriptEngine移植Java獨立程序時遇到了問題。GroovyScriptEngine在Jboss中加載類7

我的程序啓動groovy腳本,它需要動態加載類來啓動它們。 它確實像下面這樣:

ClassLoader oldLoader = Thread.currentThread().getContextClassLoader(); 

    final String myJarPath = "/tmp/myJar.jar"; 
    URLClassLoader loader = null; 
    try { 
     final URL url = new File(myJarPath).toURI().toURL(); 

     loader = new URLClassLoader(new URL[] { url},oldLoader); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } 

    Thread.currentThread().setContextClassLoader(loader); 
    ScriptEngineManager seManager = new ScriptEngineManager(loader); 

    final Map<String, Object> bindingAttributes = new HashMap<>() ; 

    final ScriptEngine scriptEngine = seManager.getEngineByName("groovy"); 
    final SimpleBindings simpleBindings = new SimpleBindings(bindingAttributes); 
    scriptEngine.setBindings(simpleBindings, ScriptContext.GLOBAL_SCOPE); 

    FileReader fileReader = null; 
    BufferedReader bufferedReader = null; 

    fileReader = new FileReader(new File("/my/path/to/groovyFile/file.groovy")); 
    bufferedReader = new BufferedReader(fileReader); 
    final Object eval = scriptEngine.eval(bufferedReader); 
    System.out.println(eval); 

在myJar.jar存在由Groovy腳本所需的類,而不是由啓動常規scrits本身的Java程序。 以這種方式很好地工作:我只需要包含以下maven依賴項。

<dependency> 
     <groupId>org.codehaus.groovy</groupId> 
     <artifactId>groovy-all</artifactId> 
     <version>2.3.6</version> 
    </dependency> 

如果我把我的代碼在資源適配器(一個JCA連接),但我已經添加了所有必需的依賴,當我這樣做:

final ScriptEngine scriptEngine = seManager.getEngineByName("groovy"); 

我得到一個NullPointerException。

如果我嘗試喂對於ScriptEngineManager手動registerig時髦,比如:

... 
Thread.currentThread().setContextClassLoader(loader); 
ScriptEngineManager seManager = new ScriptEngineManager(loader); 

final Map<String, Object> bindingAttributes = new HashMap<>() ; 

############################################ 
## register it manually     ## 
############################################ 
final GroovyScriptEngineFactory factory = new GroovyScriptEngineFactory(); 
seManager.registerEngineName("groovy", factory); 

final ScriptEngine scriptEngine = seManager.getEngineByName("groovy"); 
final SimpleBindings simpleBindings = new SimpleBindings(bindingAttributes); 
scriptEngine.setBindings(simpleBindings, ScriptContext.GLOBAL_SCOPE); 

final GroovyScriptEngineFactory factory = new GroovyScriptEngineFactory(); 
seManager.registerEngineName("groovy", factory); 


final ScriptEngine scriptEngine = seManager.getEngineByName("groovy"); 

腳本被加載,但classpath中不包含在myJar.jar提供的額外類。 所以我得到一個ClassNotFoundException。 如果此類包含在資源適配器歸檔中,它可以正常工作,所以看起來腳本只能看到資源適配器中包含的類。

除了包括資源適配器上的所有額外類(當前woraround)之外,您對於如何解決此問題有任何想法嗎? 非常感謝。

回答

2

我以前沒有遇到過這個特定的問題,但是我在獲取JBoss部署的war文件以獲取Groovy腳本引擎時遇到了問題。我做了什麼來解決我的問題是要建立一個全球性的Groovy模塊:

1)創建目錄$JBOSS_HOME/modules/org/codehaus/groovy/main/

2)複製groovy-all-2.3.6.jar到該目錄中。

<?xml version="1.0" encoding="UTF-8"?> 
<module xmlns="urn:jboss:module:1.1" name="org.codehaus.groovy"> 
    <resources> 
     <resource-root path="groovy-all-2.3.6.jar"/> 
    </resources> 
    <dependencies> 
     <module name="javax.api"/> 
    </dependencies>  
</module> 

4)修改:

3)與此內容相同目錄下創建一個module.xml文件 「甕:JBoss的:域名:EE:1.1」 在standalone.xml子系統元素(或取其味你」重新使用)將剛剛創建的模塊包含爲全局模塊,例如

<subsystem xmlns="urn:jboss:domain:ee:1.1"> 
    <spec-descriptor-property-replacement>false</spec-descriptor-property-replacement> 
    <jboss-descriptor-property-replacement>true</jboss-descriptor-property-replacement> 
    <global-modules> 
    <module name="org.codehaus.groovy" slot="main"/> 
    </global-modules>    
</subsystem> 

如果仍然不能正常工作,它可能需要您包括全局模塊myJar.jar爲好,雖然我還認爲這是一個解決辦法。

+0

你搖滾人!它就像一個魅力! – JayZee 2014-09-08 10:33:46