2015-10-20 175 views
0

我能夠在IDE(IntelliJ)中正確運行Java程序;但是,當我嘗試從命令行運行相同的程序時,它會失敗。拋出的錯誤是:從命令行運行java程序時無法加載資源

RuntimeUnmarshallException: org.xml.sax.SAXParseException; schema_reference.4: Failed to read schema document 'file:/home/Experiments/file:/home/path/to/jar/my.jar!/configuration.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the document is not <xsd:schema>. 

堆棧跟蹤指出,問題就在這裏:

String SCHEMA_FILE_PATH = "configuration.xsd"; 
ClassLoader classLoader = getClass().getClassLoader(); 
URL resource = classLoader.getResource(SCHEMA_FILE_PATH); // <- breaks here 
return new File(resource.getFile()); 

我有一個無法找到存儲在被標記爲資源目錄架構文件根在我的IDE。我敢打賭,當我從命令行運行時,因爲我從一個不同的工作目錄運行,它不知道在哪裏看。我已經嘗試在命令行上設置類路徑,以便能夠查看包含模式的目錄,但這沒有幫助。我想我可以將工作目錄設置爲當我從IDE運行時的工作目錄,但這看起來像是一個可怕的設計選擇。

感謝您的任何幫助。

編輯:我剛剛確認了configuration.xsd文件包含在罐子裏,但不管是什麼原因,似乎在奇怪的地方尋找它...

+1

你是否運行打包的'.jar'? – Pyranja

+0

是的。我使用以下命令運行它:'java -jar path/to/the.jar - 輸入東西' – mjnichol

回答

1

當運行.jar,其內容是沒有解開,但直接從.jar中讀取。因此,您加載的資源不能表示爲File(它仍嵌套在.jar內)。您可以在錯誤消息中看到 - 感嘆號後面的部分是jar中資源的路徑。

我會推薦使用Classloader.getResourceAsStream(..)來代替。它透明地處理加載。

請注意,您可以使用new StreamSource(InputStream)從流中構建對模式文檔的引用。

Here是關於資源加載的一些官方信息,並且this問題可能是感興趣的。

+0

這工作。感謝您的幫助! – mjnichol