【问题标题】:Cannot read file within jar file无法读取 jar 文件中的文件
【发布时间】:2017-11-08 17:59:36
【问题描述】:

我使用 spring-boot 开发了一个应用程序,我需要读取一个包含电子邮件的 csv 文件。

这是一个 sn-p 我是怎么做的:

public Set<String> readFile() {
        Set<String> setOfEmails = new HashSet<String>();

        try {
            ClassPathResource cl = new ClassPathResource("myFile.csv");
            File file = cl.getFile();
            Stream<String> stream = Files.lines(Paths.get(file.getPath()));
            setOfEmails = stream.collect(Collectors.toSet());

        } catch (IOException e) {
            logger.error("file error " + e.getMessage());
        }
        return setOfEmails;
    } 

当我使用 eclipse 执行应用程序时它可以工作:run As --> spring-boot app

但是当我将 jar 放入容器 docker 时,方法 readFile() 返回一个空集。

我使用 gradle 构建应用程序

你有什么想法吗?

【问题讨论】:

    标签: java docker gradle spring-boot


    【解决方案1】:

    javadocsClassPathResource 状态:

    如果类路径资源驻留在文件系统中,则支持解析为java.io.File但不适用于 JAR 中的资源。始终支持解析为 URL。

    所以当资源(CSV 文件)在 JAR 文件中时,getFile() 将会失败。

    解决方案是改用getURL(),然后将 URL 作为输入流打开,等等。像这样的:

    public Set<String> readFile() {
        Set<String> setOfEmails = new HashSet<String>();
    
        ClassPathResource cl = new ClassPathResource("myFile.csv");
        URL url = cl.getURL();
        try (BufferedReader br = new BufferedReader(
                                 new InputStreamReader(url.openStream()))) {
    
            Stream<String> stream = br.lines();
            setOfEmails = stream.collect(Collectors.toSet());
        } catch (IOException e) {
            logger.error("file error " + e.getMessage());
        }
        return setOfEmails;
    } 
    

    如果仍然失败,请检查您是否使用了正确的资源路径。

    【讨论】:

      【解决方案2】:

      我不使用 Spring,但我发现 ClassPathResource 的 Javadoc 指出:

      如果类路径资源驻留在文件系统中,则支持解析为 java.io.File,但不支持 JAR 中的资源。始终支持解析为 URL。

      尝试使用getURL() 而不是getFile()

      【讨论】:

        【解决方案3】:

        使用http://jd.benow.ca/ Jd GUI 将你的 jar 文件放到那里并

        1. 检查文件是否在 jar 中

        2. 如果是,则查看放置它的路径/文件夹结构。

        3. 如果存在文件夹使用"/&lt;path&gt;/myFile.csv"访问文件

        【讨论】:

          猜你喜欢
          • 2012-10-26
          • 1970-01-01
          • 1970-01-01
          • 2018-01-18
          • 2019-09-26
          • 2019-07-03
          • 2013-02-20
          • 2014-06-07
          • 2017-10-07
          相关资源
          最近更新 更多