Java 如何通过Intellij2020或terminal或maven插件使用资源文件构建jar
下面是我的简单应用程序,我正在阅读一个资源文件,它工作正常:-Java 如何通过Intellij2020或terminal或maven插件使用资源文件构建jar,java,maven,intellij-idea,terminal,Java,Maven,Intellij Idea,Terminal,下面是我的简单应用程序,我正在阅读一个资源文件,它工作正常:- public class App { public static void main(String[] args) throws IOException { BufferedReader bufferedReader = new BufferedReader( new FileReader( Objects.req
public class App {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader =
new BufferedReader(
new FileReader(
Objects.requireNonNull(
Objects.requireNonNull(
App.class.getClassLoader().getResource("file.txt")
).getFile()
)
)
);
String line = "";
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
}
}
我想用资源文件创建一个可执行的jar文件。我跟着。不幸的是,当我运行jar时,它找不到。错误:-ReadFileExample.jar/file.txt(无此类文件或目录)。实际上,如果从终端或maven插件更容易实现,我不需要使用IDE,请告诉我如何通过IDE或终端或任何maven插件将我的资源文件添加到jar中
新文件读取器(
这一位意味着它永远不会工作。FileReader读取文件。并且只读取文件。因此它的名称。在开发过程中,您“幸运”地发现它在工作,因为此时资源是一个实际的文件
不过有个好消息。您的代码非常复杂,可以简化很多:
.getClassLoader().getResource(…)
比.getResource
更具代码性,更糟糕。getCL在特殊情况下可以返回null。请确保调整参数;它现在与类所在的位置相关,您可以通过在前面加一个斜杠回到“从根开始”try (var raw = App.class.getResourceAsStream("/file.txt");
var in = new BufferedReader(new InputStreamReader(raw, StandardCharsets.UTF_8))) {
String line = "";
while ((line = in.readLine()) != null) {
// process line here.
}
}
嗨,Masi。你们粘贴的链接是针对Maven项目的。可执行jar有多种方式:这能回答你们的问题吗?谢谢你们的详细解释。但问题是如何用资源文件创建可执行jar。我的错误代码在IDE中工作。但我无法运行jar文件。你们并没有提到错误怎么做呢?@MassiBoo好吧,这个答案中的例子应该会让你走上正轨。然后你只需要在你的
pom.xml
中添加maven jar插件或maven汇编插件之类的东西。确保你遵循了!@MasiBoo你的代码永远无法读取jar文件中的条目。Assuming您做了常规工作(将资源放在src/main/resources中)“嘿,它们应该出现在jar文件中”部分是自动的,这一部分很简单。您得到的错误可能是由“jar文件不包含此资源”引起的,或者更可能是由“您编写的代码将因该错误而失败,无论它是否在其中,因为您无法用它读取jar文件中的资源”。@rzwitserroot thnan谢谢你的回答和有用的评论。我想知道我不需要在while循环之后关闭in.close()。@MasiBoo不需要-thattry(expr){}
construct为你关闭它,并关闭它,而不管你如何“退出”关联的{}。可以是带有return、运行它、中断它或异常。