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