簡體   English   中英

當我在 netbeans 之外運行它時,我的可執行 jar 無法打開資源文件

[英]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.

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