Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过Intellij2020或terminal或maven插件使用资源文件构建jar_Java_Maven_Intellij Idea_Terminal - Fatal编程技术网

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。请确保调整参数;它现在与类所在的位置相关,您可以通过在前面加一个斜杠回到“从根开始”
  • 显然,不要使用FileREader。实际上,永远不要使用那个类
  • 您的代码无法指定编码。这是错误的;因此,编码将默认为您在其上运行它的系统的默认编码,因此根据定义,它不能保证与您在该jar文件中的内容匹配。始终是显式的
  • 这些API已经有25年的历史了,java现在有了更好的API。让我们用它们来让代码更容易阅读
  • requireNonNull调用在这里是无用的;如果您试图将null引用传递给例如FileReader的构造函数,那么您已经得到了一个NPE
  • 你的代码打开了一个资源,但没有安全地关闭它。这会导致你泄漏句柄,这意味着你的应用程序很快就会“死机”——它的内存中仍有一堆对象,这些对象保存着打开的操作系统级文件句柄,而操作系统根本不会给你的进程提供任何进一步的句柄。任何与操作系统交互的尝试(建立网络连接、打开文件等)将完全无法工作,直到您关闭虚拟机并重新启动。这就是为什么存在“尝试使用资源”以防止出现这种情况。这个问题很难通过简单的应用程序和测试解决
  • 总而言之:

    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不需要-that
    try(expr){}
    construct为你关闭它,并关闭它,而不管你如何“退出”关联的{}。可以是带有return、运行它、中断它或异常。