1. 程式人生 > 其它 >解決springboot打成jar包之後無法讀取外部的靜態資源問題

解決springboot打成jar包之後無法讀取外部的靜態資源問題

技術標籤:javajar

在我的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包後放在伺服器上就可以正常的運行了。