【问题标题】:How to build a Jar file that include external files如何构建包含外部文件的 Jar 文件
【发布时间】:2021-12-28 23:30:42
【问题描述】:

我想将资源文件夹中的文本文件包含到 Jar 文件中。这是最小的例子:

import java.io.File;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Main main = new Main();
        main.readFile( "test.txt" );
    }

    public void readFile(String fileName){
        File file = new File( getClass().getResource( fileName ).getPath() );

        try{
            Scanner scanner = new Scanner( file );
            while ( scanner.hasNextLine() ){
                System.out.println( scanner.nextLine() );
            }
        }catch (Exception e){
            System.out.println( e );
        }
    }
}

这是 test.txt 文件中的内容:

hello
world

这就是我的项目的样子:

我可以成功运行代码。我生成Jar的方式如下:

我已经通过单击“+”符号添加了资源文件夹。但是,当我调用生成的Jar文件时,它仍然在抱怨FileNotFoundException。

有什么建议吗?

【问题讨论】:

    标签: java intellij-idea jar


    【解决方案1】:

    new File 代表一个文件。例如,一个文件。 jar 文件中的条目不是文件。

    您的代码无法工作完成您想做的事情。

    文件是错误的抽象。您需要InputStream 或可能的 URL,它们都可以表示文件、网络流、动态生成的内容,以及,是的,jar 文件中的条目。

    public void readFile(String fileName) {
      try (var in = ThisClass.class.getResourceAsStream(fileName)) {
        Scanner scanner = new Scanner(in, StandardCharsets.UTF_8);
        // proceed here.
      } catch (IOException e) {
        throw new RuntimeException("Uncaught", e);
      }
    }
    

    在那个 sn-p 中发生了一些事情:

    • 使用ThisClass.class,而不是getClass()。当您子类化时,getClass 路线会中断。您可能不会在这里这样做,但以后可能会这样做;最好编写在同样简短的情况下始终有效的代码。
    • 这是一个资源,您必须关闭它。因此,此代码使用 try-with-resources。
    • 我们得到一个 InputStream(getResourceAsStream 返回一个输入流),这是可以表示 jar 中的条目的正确抽象级别(而 File 不能这样做)。
    • 我们告诉扫描器字符集编码是什么。否则你会得到平台默认值,这是错误的和讨厌的:在你自己的计算机上它总是可以工作,然后你在另一个系统上运行它并且它失败了。总是,总是在字节转换为字符时指定字符集编码(反之亦然)。
    • e.printStackTrace() 是邪恶的。永远不要那样处理异常。如果您不知道(这在这里很公平;如果这会引发 IOEx,那么显然有些地方出了问题,最好让您的应用程序尽可能详细地崩溃) - 以上是正确的处理方法它。

    【讨论】:

      猜你喜欢
      • 2011-04-15
      • 1970-01-01
      • 2011-09-18
      • 2012-05-12
      • 1970-01-01
      • 2013-08-08
      • 2014-09-27
      • 2014-10-28
      • 2013-06-08
      相关资源
      最近更新 更多