[英]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_package_name / name
其中Modifyed_package_name是此對象的軟件包名稱,用“ /”代替“。”。 ( '\\ u002e')。
參數:名稱所需資源的名稱返回:一個java.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.