2013-11-26 60 views
1

美好的一天每個人。來自classpath的Groovy資源未加載

我在我的groovy項目(IDE - Intellij Idea 12.6)中使用spock框架進行測試。我斯波克規範類傳遞文件名,常規的處理對象(即文件在類路徑肯定的),但是當我試圖讓該文件這樣

def resource = getClass().getClassloader().getResourceAsStream(filepath) 
    assert resource != null : "No input stream found for path ${filepath}" 
    def rootNode = new XmlParser().parse(resource) 

然後resource == null

我試過調試,在Expression Evaluation窗口中,這段代碼getClass().getResource(fileName)返回資源。

我試着檢查第一種情況下(類代碼中)使用哪個類加載器,第二種情況下(表達式評估窗口)。

在第一種情況下類加載器是[email protected],但在Expression Evaluation窗口類加載器中是[email protected]我想這就是我的資源爲空的原因。

有人可以指導我做什麼我做錯了,我怎麼能加載該資源文件?

UPDATE:

改變了資源文件被解析。當filepath - 完整的文件路徑這個工程,但如果filepath只是文件名,並在類路徑文件,然後resource == null

UPDATE2

更改裝載的方式資源文件,清理依賴位,一切都工作,我想昨天不是我的一天。

+1

只傳遞文件名只有當資源與'getClass()'引用的類位於同一個包中時纔有效,並且只有在使用'Class#getResourceStream'(而不是'ClassLoader#getResourceStream')時纔有效。 –

回答

6

問題很可能與Spock無關。很難從遠處說出造成它的原因,但根據環境,讀取資源的最安全方法是getClass().getClassLoader().getResourceAsStream()Thread.currentThread().getContextClassLoader().getResourceAsStream()

由於沒有File(URL)構造函數(只有File(URI)構造函數),所以不確定Groovy在做什麼時會做什麼new File(resource)。無論如何,儘可能避免從類路徑獲取File

+0

正在嘗試getClass()。getClassLoader()。getResourceAsStream()和Thread.currentThread()。getContextClassLoader()。getResourceAsStream()方法,結果是相同的資源爲null。你能否詳細說明爲什麼應該避免從類路徑獲取文件?在我的情況下,我需要讀取xml文件,然後處理它 – artjomka

+1

請注意,這些方法所期望的參數不同於getClass()。getResource()'期望的參數(請查看文檔)。對於從類路徑獲取'File'時可能遇到的問題,請參閱https://weblogs.java.net/blog/kohsuke/archive/2007/04/how_to_convert.html#comment-825410(註釋和主要文章)。爲了處理一個XML文件,一個'InputStream'通常工作正常。 –

+0

是的,我想Spock與這個問題無關,必須是類加載器... – artjomka

2

這很可能是因爲Groovy可能會以不同的方式解釋對象的類,以至於您認爲發生了什麼。請參見下面的其他StackOverflow的項目:

Why does groovy .class return a different value than .getClass()

當類是錯誤的,那麼ClassLoader的可能通過引導加載程序和getClassLoader返回null。

因此,而不是使用像

def resource = getClass().getClassloader().getResourceAsStream(filepath) 

一個語句中指定使用的語句實際的類象

def resource = MyClass.class.getClassLoader().getResourceAsStream(filePath) 

在爲我工作幾乎相同的情況。