2013-12-17 98 views
4

我有一個使用SBT構建的項目,它使用one-jar插件打包單個jar。該項目包含的src /主/資源/夾具一堆的JSON文件我用它通過通過sbt打包的one-jar中的類路徑資源

new java.io.File(App.getClass.getResource("/fixture").getFile 

訪問不幸的是,這並不工作下去,因爲不返回任何資源。我認爲one-jar使用特殊的類加載機制?什麼是解決這個問題的最好方法?

回答

2

我覺得one-jar使用了一個特殊的類加載機制?

是的,因爲有可以加載打包成依賴罐子後者又打包到您的應用程序罐子類沒有標準化方式這必須是真實的。這通常是通過額外的類加載器欺騙來實現的。

使用One-JAR時加載資源是documented here

+0

感謝您指點我的資源文檔。我終於搞定了。在三個潛在的位置中,我的資源位於main/main.jar中。我的目的是使用MainClass.getClass.getResource(「/ dirname」)獲取打包到main.jar中的目錄(File)並迭代它的子項(Files)。那沒有成功。然而,我卻可以通過使用MainClass.getClass.getResourceAsStream(「/ dirname/filename.json」) – reikje

+0

@ user1671319 cool來加載該目錄中每個文件的內容。很高興它有幫助。 –

2

one-jar將您的資源打包在main目錄下的輸出罐中。當使用sbt時,我發現最好自己配置資源的打包。 通常情況下,我會做這樣的事情:

unmanagedResources in Compile := Seq() //we don't want to add resources from "src/main/resources" to inner jar 

mappings in oneJar += (file("src/main/resources/filename.json"),"path/to/resource/in/onejar") 

讓你的資源filename.json將被打包,你想讓它在一個罐子罐子。 當你想在運行時的資源,只需使用:

Thread.currentThread.getContextClassLoader.getResourceAsStream("path/to/your/resource") 

看看this post。它可能有助於如何將所有資源打包在src/main/resources ...

+0

+ 1這看起來正是我要找的,謝謝 –

0

我發現Spring的核心PathMatchingResourcePatternResolver可以做到這一點。它也可以根據模式找到文件。

PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); 
resolver.getResources("classpath*:some/package/name/**/*.xml");