解決springboot打成jar包之後無法讀取外部的靜態資源問題
阿新 • • 發佈:2021-02-09
在我的Ccmusic專案中由於需要上傳圖片、歌曲等,所以我將靜態資原始檔沒有放在static資料夾下,而是放在了根目錄下,通過重寫addResourceHandlers進行重定向。
在本地執行是完全可以的,所以如果你的專案只要在本地上執行是可以的,但是如果講jar包上傳到伺服器執行就找不到外部的靜態資原始檔了。
如果你的專案要打成jar包放到伺服器上有如下的解決方式:
首先在springboot專案中的application.properties的配置檔案中,新增下面的配置
server.tomcat.basedir=logistics/tomcat
此虛擬路徑會在你把springboot專案打成jar包執行後在你的jar包同級目錄下產生一個logistics目錄。所以我把我要上傳的檔案的全部放在這個資料夾目錄下
我將所有的外部資原始檔都放在了這個logistics資料夾內。
但是還沒有結束,這裡面還有一個很大的坑,在伺服器中jar包執行與本地jar包執行獲取的路徑不同,在專案上執行時不用返回兩次父級目錄,而打成jar包執行後獲取的jar包的路徑要如下的方法,並且打成jar包後獲取的根目錄會在目錄前面加上file:/你專案的路徑
/**
* 自定義mvc配置
* @author chenchen
*/
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 解決前後端訪問跨域問題
* @param registry
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.allowCredentials(true);
}
/**
* 圖片重定向
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 解決上線後無法載入外部靜態資源問題,若本地執行則不需要
File path = null;
try {
path = new File(ResourceUtils.getURL("classpath:").getPath());
} catch (FileNotFoundException e) {
e.printStackTrace();
}
String gitPath = path.getParentFile().getParentFile().getParent() + File.separator + "logistics";
// 歌手圖片地址
registry.addResourceHandler("/img/singerPic/**")
.addResourceLocations(// "file:" + System.getProperty("user.dir")
gitPath
+ System.getProperty("file.separator")
+ "img"
+ System.getProperty("file.separator")
+ "singerPic"
+ System.getProperty("file.separator"));
// 歌曲圖片地址
registry.addResourceHandler("/img/songPic/**")
.addResourceLocations(// "file:" + System.getProperty("user.dir")
gitPath
+ System.getProperty("file.separator")
+ "img"
+ System.getProperty("file.separator")
+ "songPic"
+ System.getProperty("file.separator"));
// 歌單圖片地址
registry.addResourceHandler("/img/songSheetPic/**")
.addResourceLocations(// "file:" + System.getProperty("user.dir")
gitPath
+ System.getProperty("file.separator")
+ "img"
+ System.getProperty("file.separator")
+ "songSheetPic"
+ System.getProperty("file.separator"));
// 歌曲資源地址
registry.addResourceHandler("/song/**")
.addResourceLocations(// "file:" + System.getProperty("user.dir")
gitPath
+ System.getProperty("file.separator")
+ "song"
+ System.getProperty("file.separator"));
//前端使用者頭像地址
registry.addResourceHandler("/avatorImages/**").addResourceLocations(
// "file:"+System.getProperty("user.dir")+
gitPath + System.getProperty("file.separator")+"avatorImages"+System.getProperty("file.separator")
);
//使用者頭像預設地址
registry.addResourceHandler("/img/**").addResourceLocations(
// "file:"+System.getProperty("user.dir")+
gitPath + System.getProperty("file.separator")+"img"+System.getProperty("file.separator")
);
//內部靜態資原始檔對映
registry.addResourceHandler("/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/static/");
}
}
再次打成jar包後放在伺服器上就可以正常的運行了。