2017-10-11 93 views
1

我的Spring Boot项目中有几个SQL查询文件。这些查询位于路径Spring Boot:无法从资源加载文件

spring-boot-sql-in-files/src/main/resources/sql/query.sql 

当我运行我的应用程序时,我执行加载这些查询到静态变量。

private static final String PATH_PREFIX = "src/main/resources/sql/"; 

public static String loadQueryFromFile(@NonNull String fileName) { 
    try { 
     return FileUtils.readFileToString(new File(PATH_PREFIX + fileName), Charset.defaultCharset()); 
    } catch (Exception e) { 
     log.error("Error occurred during loading sql file to string, file=" + fileName, e); 
     throw new QueryNotLoadedException(); 
    } 
} 

当我运行使用IDE,但是当我运行name.jar文件,这是行不通的,它工作正常,我得到以下错误:

java.io.FileNotFoundException: File 'src/main/resources/sql/query.sql' does not exist 

我怎样才能解决这个路径?

+1

您是否验证过这些文件存在于jar文件中? – neuhaus

+2

Ofcourse它不会运行......'src/main/resources'是你的类路径的根。这也将使'FileUtils.readFileToString'不起作用,因为它打包成jar时不是'File'。而是使用Spring资源抽象和utils将它加载到一个字符串中。 –

+0

@neuhaus,我已经验证过,它的文件夹位于'/ BOOT-INF/classes/sql /' –

回答

4

src/main/resourcessrc/main/java成为您的类路径的根,因此将无法正常工作。它不会仅与sql一起使用,并且它不是打包为jar时的文件。请使用Spring Resource抽象来加载文件,使用StreamUtils将其加载到String

public static String loadQueryFromFile(@NonNull String fileName) { 
    try { 
     Resource resource = new ClassPathResource("sql/" + fileName); 
     return StreamUtils.copyToString(resource.getInputStream(), Charset.defaultCharset()); 
    } catch (Exception e) { 
     log.error("Error occurred during loading sql file to string, file=" + fileName, e); 
     throw new QueryNotLoadedException(); 
    } 
} 

像这样的事情应该做的伎俩。