Java 无法读取jar文件中的文件

Java 无法读取jar文件中的文件,java,docker,gradle,spring-boot,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&qu

我使用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;
    } 
public Set readFile(){
Set setOfEmails=newhashset();
试一试{
ClassPathResource cl=新的ClassPathResource(“myFile.csv”);
File File=cl.getFile();
Stream=Files.line(path.get(file.getPath());
setOfEmails=stream.collect(Collectors.toSet());
}捕获(IOE异常){
logger.error(“文件错误”+e.getMessage());
}
返回一组邮件;
} 
当我使用eclipse:runas-->spring boot-app执行应用程序时,它会工作

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

我使用gradle构建应用程序


你有什么想法吗?

我不使用Spring,但我发现Javadoc中有这样的语句:

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

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

使用JDGUI将您的jar文件放到那里,然后

  • 检查文件是否在jar中

  • 如果是,请查看其所在的路径/文件夹结构

  • 如果存在“是”文件夹,请使用
    “//myFile.csv”

  • 类路径资源的状态为:

    如果类路径资源位于文件系统中,则支持解析为
    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;
    } 
    
    public Set readFile(){
    Set setOfEmails=newhashset();
    ClassPathResource cl=新的ClassPathResource(“myFile.csv”);
    URL URL=cl.getURL();
    try(BufferedReader br=新的BufferedReader(
    新的InputStreamReader(url.openStream())){
    Stream=br.lines();
    setOfEmails=stream.collect(Collectors.toSet());
    }捕获(IOE异常){
    logger.error(“文件错误”+e.getMessage());
    }
    返回一组邮件;
    } 
    
    如果仍然失败,请检查您使用的资源路径是否正确