![](/img/trans.png)
[英]getClassLoader().getResource().getPath() not returning expected result
[英]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所說:“如果[路徑部分]不存在,則返回一個空字符串”。
如果絕對必須是File
或FileInputStream
,因為您無法更改某些其他代碼,則需要它,然后將內容復制到一個臨時文件中:
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.