簡體   English   中英

從命令行運行Java程序時無法加載資源

[英]Failing to load resource when running java program from command line

我可以從我的IDE(IntelliJ)內正確運行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運行時的工作目錄,但這似乎是一個可怕的設計選擇。

謝謝你的幫助。

編輯:我剛剛確認jar中包含configuration.xsd文件,但是無論出於什么原因,它似乎都在奇怪的地方尋找它...

運行.jar ,其內容不會解壓縮,而是直接從.jar讀取。 因此,您正在加載的資源不能表示為File (它仍然嵌套在.jar )。 您可以在錯誤消息中看到-感嘆號后的部分是jar資源的路徑。

我建議改用Classloader.getResourceAsStream(..) 它透明地處理加載。

請注意,您可以使用new StreamSource(InputStream)從流構造對架構文檔的引用。

是有關資源加載的一些官方信息, 這個問題可能引起您的興趣。

暫無
暫無

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

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