解決使用maven將專案打包成jar包後執行在linux系統中無法讀取jar包中檔案的問題

2020-10-05 11:01:07

  哈哈,之前計劃的每週至少更新一個部落格的計劃又因為各種原因都泡湯了。看來堅持真得是一件挺讓人頭疼的問題,無論如何,從這周開始接下來每週一定要至少更新一個技術部落格,歡迎大家監督!

  好,言歸正傳。之前前幾周遇到開發過程中遇到這樣一種這樣的問題,不知道大家有沒有遇到過,就是我在spring boot中使用mave將專案打包成jar包部署到linux伺服器上後,當我執行一個介面時,居然報錯了,這裡我貼出來給大家看下,如下圖所示:

在這裡插入圖片描述
  從上圖的報錯資訊可以看到,系統找不到json目錄下riskSchemeModelPackage.json這個檔案,我就納悶了,但是在我本地window系統下是可以的呀,我找到了該報錯資訊所對應的程式碼,並貼到了下面,同時我也貼出了打包的類路徑圖,大夥們可以看下。

int riskSchemeModelPackageContentLength = cn.hutool.core.io.FileUtil.readUtf8String("classpath:json/riskSchemeModelPackage.json").getBytes(StandardCharsets.UTF_8).length * 2;

在這裡插入圖片描述

  從以上的程式碼和圖片中大家都可以看到打包的類路徑的根目錄下是確確實實有這個目錄和檔案的,並且在本地windows系統執行是沒有任何問題的,到底是什麼原因導致的呢?經過分析,應該是hutool包中FileUtil這個工具類有點問題,於是我果斷換了一種讀取方法的方法,如下面的程式碼所示:

int riskSchemeModelPackageContentLength = IoUtil.readBytes(new FileInputStream(new ClassPathResource("json/riskSchemeModelPackage.json").getFile())).length * 2;

  我使用了new ClassPathResource()這種方式去專門讀取類路徑下的路徑,並使用getFile()獲取到riskSchemeModelPackage.json所對應的File物件,然後使用new FileInputStream()方法將File物件轉成檔案輸入流的形式,最後使用IoUtil工具類將其轉為byte(位元組)。本來以為大功告成了,誰知當我重新部署到linux系統一執行,程式又給我丟擲了空指標這個runtime exception,仔細一排查,原來是getFile()返回的是null,所以才導致了這個空指標異常,那麼又怎麼解決呢?看來解決一個問題後還會產生一個新問題呀,無奈之下,谷歌一搜尋看到還真有一些老哥遇到過這樣的坑,不過幸好這些老哥很給力,給出了一些不錯的解決方案。其中我找到了一個不錯的解決方案,那就是將讀取檔案改成讀取檔案流的形式,也就是將getFile()改成getInputStream()。於是我果斷就行了修改,如下程式碼所示:

int riskSchemeModelPackageContentLength = IOUtils.toString(new ClassPathResource("json/riskSchemeModelPackage.json").getInputStream(), CharsetUtil.UTF_8).getBytes(StandardCharsets.UTF_8).length * 2;

  當我重新部署上去後再次執行了介面,沒想到居然可以了!!!終於功夫不負有心人,我把這個問題搞定了!