簡體   English   中英

從7更新到10后,Jar文件將不會顯示資源

[英]Jar file won't display resource after update from 7 to 10

我經常使用某個jar文件,該文件顯示一個文本文件,並允許您以不同方式過濾列表。

直到我從Java 7更新到Java 10為止,這一直很好。現在,它將不再顯示資源文本文件。

這是我獲得jar文件的位置: https : //github.com/dragan224/battle_cats_en_combos

jar文件的根目錄中有兩個.txt文件,jar會在其內部使用它們。 是否有一些安全設置阻止了此操作? 還是版本更改使代碼失效了?

在代碼文件中,我可以看到它正在使用: InputStream input = (InputStream) ClassLoader.class.getResourceAsStream("/" + cat_file_name);

因此,我已經對其進行了重新編譯,並在命令行的編譯字符串中指定了-source 1.8 ,但這沒有任何區別。

我什至不知道如何弄清楚為什么它不起作用。 當我運行命令行javaw -jar CatCombos.jar (我的新編譯的名稱)時,它在命令行上什么也沒有說。 它可以運行,但不顯示文本文件,就像原始文件一樣。

這一切都是在我今天安裝jdk-10.0.2_windows-x64_bin.exe時開始的。 在此之前,我運行的是1.8 JRE,它運行良好。

[更新]

我安裝了JDK 8.44,並從該文件夾中使用javaw.exe運行了jar文件,jar應用程序完美運行並顯示了內容。 因此,某些更改或我缺少使Java 10正確運行文件的內容。

[更新]

好了,所以我對使用 Java的問題已被遷移到堆棧交流,即使它是不是一個關於編碼的問題。 這是一個人的錯誤,並且由於現在人們認為這是一個編碼問題(首先沒有提供任何代碼),我將假定Java 10不顯示文本文件的原因是因為用於Java 8的代碼不再可行。 因此,我將介紹代碼,並可能通過將其轉變為編碼問題來解決該問題。

這是我加載文本文件的代碼。

        InputStream input = (InputStream) ClassLoader.class.getResourceAsStream("/" + file_name);
        BufferedReader br = new BufferedReader(new InputStreamReader(input));
        String line = br.readLine();
        while (line != null) {
        //do something
        }

因此,對於項目的結構而言,它非常簡單,並且是這樣的(順便說一句,這是我曾經使用過的第一個Java項目):

/src
/src/javafiles (no subfolders; just .java files)
/src/textfile.txt  (the one I'm trying to load)
/manifest.txt (telling which java file to start up with)
/compile.bat

因此,該文本文件位於Java二進制文件的父文件夾中。

[更新]

在將項目加載到Eclipse(我以前從未使用過)之后,我看到在這一行收到null pointer error

InputStream input = (InputStream)ClassLoader.class.getResourceAsStream(combo_file_name);

Eclipse給出了以下描述:

打開宣言InputStream java.lang.Class.getResourceAsStream(字符串名稱)

@CallerSensitive

查找具有給定名稱的資源。

如果此類在命名的模塊中,則此方法將嘗試在模塊中查找資源。 這是通過委派給模塊的類加載器findResource(String,String)方法來完成的,並使用模塊名稱和資源的絕對名稱來調用該方法。 命名模塊中的資源受Module getResourceAsStream方法中指定的封裝規則的約束,因此,當資源是未對調用者模塊開放的包中的非“ .class”資源時,此方法將返回null。

否則,如果該類不在命名模塊中,則搜索與給定類關聯的資源的規則由該類的定義類加載器實現。 該方法委托給該對象的類加載器。 如果此對象是由引導類加載器加載的,則該方法將委托給ClassLoader.getSystemResourceAsStream。

在委派之前,使用以下算法從給定資源名稱構造絕對資源名稱:•如果名稱以'/'('\\ u002f')開頭,則資源的絕對名稱是名稱后面的部分。 '/'。 •否則,絕對名稱的格式如下:modified_pa​​ckage_name / name

其中Modifyed_pa​​ckage_name是此對象的軟件包名稱,用“ /”代替“。”。 ( '\\ u002e')。

參數:名稱所需資源的名稱返回:一個ja​​va.io.InputStream對象; 拋出:NullPointerException-如果名稱為nullSince:1.1See如果沒有找到具有此名稱的資源,則該資源位於至少對調用者模塊不開放的程序包中,或者安全管理器拒絕對該資源的訪問。另外:Module.getResourceAsStream(字符串)@ revised9 @ specJPMS

那么,我該怎么辦? 我以為.jar出於某種原因找不到文本文件。

這是我處理文件的方法:

package catcombo;

public class Main {

    public static void main(String[] args) {
        new MainWindow("NyancomboData.txt", "Names.txt");
    }

}

在從1.8到版本10的更新中,必須在類中使用靜態方法引入了新的嚴格性。

我的代碼有

InputStream input = (InputStream) ClassLoader.class.getResourceAsStream("/" + file_name);

當我將其更改為

InputStream input = MyOwnClass.class.getResourceAsStream(file_name);

然后,一切開始正常運行。

暫無
暫無

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

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