簡體   English   中英

getClassLoader()。getResource(“ Configuration.xml”)。getPath()在jar內不起作用

[英]getClassLoader().getResource(“Configuration.xml”).getPath() does not work inside a jar

我創建了一個基於Maven的Java項目,該項目具有資源目錄(src / java / resources),並在其中包含一些xml文件,並且maven將它們復制到target / classes / resources(target / classes是我的類路徑)。

要知道xml文件的內容,我使用:

new FileInputStream(Main.class.getClassLoader().getResource("Configuration.xml").getPath());

Main.class.getClassLoader()。getResource(“ Configuration.xml”)。getPath()為我提供了xml的完整路徑:“ c:\\ project ... \\ Configuration.xml”。

這在intellij上效果很好。

但是當我將項目編譯並打包到jar文件中時,我得到:

Exception in thread "main" java.io.FileNotFoundException: 
file:\C:\project\target\project-12.50.14-SNAPSHOT-jar-with-dependencies
.jar!\Configuration.xml 

(The filename, directory name, or volume label syntax is incorrect)

那是因為路徑:\\ C:\\ project \\ target \\ project-12.50.14-SNAPSHOT-jar-with-dependencies .jar!\\ Configuration.xml不能成為FileInputStream()的參數。

我無法將getResource()替換為getResourceAsStream()。

我需要一種方法來調整我的jar和資源,使其像在intellij上一樣工作。 我還在運行時更改xml資源文件的內容,因此將它們保存在jar中是另一個問題。

誰能為我提供一種解決方案,無需更改代碼,而無需更改資源目錄結構或類路徑,或者其他可以使我的代碼正常工作的解決方案? 謝謝。

更新:更改為使用File ,而不是Path

這是因為getResource返回URL ,並且並非所有URL都是磁盤上的文件,即可以轉換為Path 正如javadoc所說:“如果[路徑部分]不存在,則返回一個空字符串”。

如果絕對必須FileFileInputStream ,因為您無法更改某些其他代碼,則需要它,然后將內容復制到一個臨時文件中:

File file = File.createTempFile("Configuration", ".xml");
try {
    try {InputStream in = Main.class.getClassLoader().getResourceAsStream("Configuration.xml")) {
        Files.copy(in, file.toPath()); // requires Java 7
    }
    // use file here, or:
    try {FileInputStream in = new FileInputStream(file)) {
        // use file stream here
    }
} finally {
    file.delete();
}

上面的代碼可以優化為在資源是文件的情況下不進行復制,但是由於這僅用於開發模式,並且生產模式始終是Jar,並且始終需要復制,因此在開發模式下使用復制有助於測試代碼。

暫無
暫無

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

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