簡體   English   中英

從Java運行的Groovy腳本是否具有相同的類路徑?

[英]Does a Groovy script run from Java have the same classpath?

我正在嘗試使用GroovyClassLoader從Java運行Groovy腳本。 基本上,我做的是這樣的:

GroovyClassLoader groovyLoader = new GroovyClassLoader(Thread.currentThread().getContextClassLoader());
clazz = groovyLoader.parseClass(myFile);
GroovyObject go = (GroovyObject) go.newInstance();
return go.invokeMethod("MyMethod", myObject);

問題是,當我解析groovy文件時,即使類在Java類路徑中,我的導入也無法解析。 如果我添加一行:

groovyLoader.addClasspath("MyclassPath");

然后一切正常(如果我們無法解決這個問題,這是我們的最后手段)。 這讓我覺得有兩個不同的類路徑,一個用於Java,另一個用於Groovy。 但是,由於我將Java類加載器作為GroovyClassloader的構造函數參數傳遞,我認為如果在Groovy類路徑中找不到類,則應該在Java中查找它們。

我錯了嗎? 有人可以對此有所了解嗎?

謝謝。

經過大量測試后,我發現Java推出的Groovy確實與啟動Java的類路徑相同。 OP的問題是由我們這方面的配置問題引起的。

對於未來的讀者,我推薦這個問題如何在Groovy中獲取類路徑? 這在調試過程中提供了很多幫助。

進口分辨率遇到類似的問題。 在我的情況下切換到

new GroovyClassLoader(this.getClass().getClassLoader())

代替

new GroovyClassLoader(Thread.currentThread().getContextClassLoader())

解決了這個問題。

請注意,根據文檔, GroovyClassLoader()等效於GroovyClassLoader(Thread.currentThread().getContextClassLoader())

public GroovyClassLoader()使用當前Thread的上下文類加載器作為父級創建GroovyClassLoader。

我的實際情況是運行webapp的Tomcat實例,它應該從類路徑加載一個groovy類並從中運行一個函數,但groovy類中的導入在運行時無法解析。 調試時我注意到當前線程和當前類的類加載器是不同的。 我還使用調試器評估功能來查明類加載器是否知道特定的類,如下所示:

this.getClass().getClassLoader().classes.stream().filter(c -> c.getName().contains("YourClassInQuestion")).collect(Collectors.toList())

這里還解釋了類和線程類加載器之間的區別。

希望這可以幫助。 謝謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM