2017-10-11 35 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(); 
    } 
} 

像這樣的事情應該做的伎倆。