无法读取jar文件中的文件

时间:2017-06-07 11:42:54

标签: java docker gradle spring-boot

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

这是我的一个片段:

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执行应用程序时它可以工作:运行As - &gt; spring-boot app

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

我使用gradle构建应用程序

你有什么想法吗?

祝你好运

3 个答案:

答案 0 :(得分:4)

ClassPathResource状态的javadoc:

  

如果类路径资源驻留在文件系统中,支持解析为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;
} 

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

答案 1 :(得分:2)

我不使用Spring,但我发现ClassPathResource的Javadoc声明:

  

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

尝试使用getURL()代替getFile()

答案 2 :(得分:0)

使用http://jd.benow.ca/ Jd GUI将jar文件放在那里

1)检查文件是否在jar中

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

3)如果存在Yes文件夹使用"/<path>/myFile.csv"

访问文件

干杯享受编码