[英]My executable jar can't open resource files when I run it outside of netbeans
在這里的第一篇文章,我希望我已經充分地形成了這個問題。 我的項目在作為項目在 netbeans 內部運行時在類路徑上找到資源文件,但是當我在 netbeans 外部運行 jar 時,它找不到資源(我已經檢查過,是的,它們被放入了 jar 中。 )
我已經嘗試了 .getResource() 和我的代碼的 .getResourceAsStream() 版本。 當在 netbeans 內部作為 maven 項目運行時,它們都成功了,但是當我刪除 jar 並在 netbeans 外部運行它時,找不到這些資源。
這是我的代碼片段,也是我添加資源的 pom 文件中的片段。 當作為 netbeans 中的項目運行時,這一切都有效,但當我在其他地方運行 jar 時則無效。 它無法找到資源。
……
String wholeFile = "";
try {
BufferedReader objReader = new BufferedReader(
new java.io.InputStreamReader(
getClass().getResourceAsStream( sqlFileName )
)
);
StringBuilder sb = new StringBuilder();
String strCurrentLine;
while ( (strCurrentLine = objReader.readLine()) != null ) {
sb.append( strCurrentLine );
sb.append( System.getProperty("line.separator") );
}
wholeFile = sb.toString();
……或者,最好……
wholeFile = java.nio.file.Files.readString(
java.nio.file.Paths.get(
getClass().getClassLoader().getResource( sqlFileName ).toURI()
)
);
// Split that file into individual create
// table strings contained in the file.
// Slit on two newlines.
String newLine = System.getProperty("line.separator");
String[] tables = wholeFile.split( newLine + newLine );
……
這是我添加到 pom 中的內容。 但這只有在 netbeans 中運行時才能解決。 為什么? 我在這里的 Maven 設置遺漏了什么? 在 netbeans 之外……可執行 jar 不會像在 netbeans 中運行時那樣定位這些資源文件。
提前致謝。 我希望我的問題很清楚。
<resources>
<resource>
<directory>src/my-resources</directory>
<includes>
<include>**/*.txt</include>
<include>**/*.jpg</include>
</includes>
</resource>
</resources>
據我所知, java.nio.file.Files
無法讀取 *.jar 文件的內容。 您需要通過類加載器以流的形式訪問資源。 所以我認為你的第一次嘗試應該沒問題。
這可能只是路徑名的問題。 這是一個沒有 Maven 的工作示例:
文件 src/de/stefanfrings/Main.java:
package de.stefanfrings;
import java.io.InputStream;
import java.util.*;
public class Main
{
public static void main(String[] args)
{
InputStream stream=Main.class.getResourceAsStream("/test.txt");
Scanner in=new Scanner(stream);
while (in.hasNextLine())
{
System.out.println(in.nextLine());
}
in.close();
}
}
文件 src/de/test.txt:
Hello
World
test.jar 的內容:
META-INF/MANIFEST.MF
test.txt
de/stefanfrings/Main.class
輸出:
java -jar test.jar
Hello
World
如果我將文件名更改為“../../test.txt”,那么它只能在 IDE 中工作,因為 IDE 從編譯器放置其輸出的(未壓縮)文件夾中執行程序。
嘗試在您的文件名前加上“/”。
StringBuilder sb = new StringBuilder();
InputStream stream = getClass().getResourceAsStream( sqlFileName );
Scanner in=new java.util.Scanner(stream);
while (in.hasNextLine())
{
//System.out.println(in.nextLine());
sb.append( in.nextLine() );
sb.append( System.getProperty("line.separator") );
}
in.close();
wholeFile = sb.toString();
非常感謝,解決了。 在這里只使用一個直接的 InputStream 有一些不同之處。 您的代碼有效。
現在可以使用了,...在 netbeans 之外也是如此。 非常感謝!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.