2012-03-30 288 views
2

我在寫一個Groovy腳本,它使用了第三方Java代碼,我無法更改。 此代碼使用(很糟糕,我認爲)ClassLoader.getSystemClassLoader().getResourceAsStream("/hard/file/path/in/jar/file") 並期望讀取文件。Groovy腳本類路徑與SystemClassLoader問題

一切使用時java -cp "/path/to/jar/file" ...

不過,現在的第三方代碼是用一堆我們已經編寫Groovy代碼進行整合,所以我們想從常規運行它從Java順利。

因此,我們編寫了一個Groovy腳本,讓它調用test.groovy,並將其作爲groovy -cp "/path/to/jar/file" test.groovy運行。

問題是,代碼無法訪問文件資源,因爲它似乎Groovy不直接加載它在System ClassLoader中的罐子。

爲了證明,在Groovy腳本中使用Thread.currentThread().getContextClassLoader().getResourceAsStream("/hard/file/path/in/jar/file"),我可以讀取該文件,但是使用ClassLoader.getSystemClassLoader().getResourceAsStream("/hard/file/path/in/jar/file"),我不能。

那麼,有沒有人知道如何從Groovy腳本加載系統類加載器中的類,而不開始嘗試一些骯髒的黑客(如元類getSystemClassloader返回上下文類加載器)?

回答

1

你可以嘗試添加的jar到系統類加載器,以及當你的腳本運行,像這樣:

ClassLoader.systemClassLoader.addURL new File('/path/to/jar/file').toURI().toURL() 

PS:我假設你在你的問題意味着ClassLoader.getSystemClassLoader(),而不是System.getSystemClassLoader()

0

在開始Groovy過程之前,您可以嘗試將jar放入%GROOVY_HOME%\lib文件夾或在groovy命令周圍打包並修改%CLASSPATH%變量。

+0

感謝您的回答 %GROOVY_HOME%\ lib =>已經嘗試過,但由Groovy加載GroovyClassLoader %CLASSPATH%=>由Groovy選爲'-cp'選項 – Grooveek 2012-03-30 09:15:23