【問題描述】
以往部署springboot+jsp專案時都是打一個war包,直接啟動就ok了,
昨天突然想嘗試一下打jar包部署,結果發現正常啟動后,無法訪問到靜態資源,控制臺也沒有報錯,
【問題原因】
使用Maven將Spring Boot專案打jar包時,默認是不會將存放jsp及其他靜態資源的webapps檔案夾的內容打包的,
在這里順便總結一下jar包和war包的知識點:
- jar包:java類的歸檔檔案,jar包不僅用于壓縮和發布,而且還用于部署和封裝庫、組件和插件程式,并可被像編譯器和 JVM 這樣的工具直接使用,jar包的com里放的是.class檔案、組態檔,但默認是沒有靜態資源的,jar包中可以包含META-INF 目錄,用于存盤包和擴展的配置資料,如安全性和版本資訊,同時也可以用于存盤靜態資源,
- war包:一個web應用,可以直接運行的web模塊,部署到容器(tomcat)中啟動,war包中包括.class檔案、組態檔、靜態資源(html、jsp)等等,一個war包可以理解為是一個web專案,里面是專案的所有東西,和專案的檔案結構保持一致,
【問題解決】
由于Spring Boot 集成了tomcat,所以無論是jar包還是war包都可以直接啟動,要把靜態資源也打入jar包的話,則需要在pom.xml的build中添加如下配置
<resources>
<resource>
<!-- 指定resources插件處理哪個目錄下的資源檔案 -->
<directory>${basedir}/src/main/webapp</directory>
<!-- 需要將資源檔案放到該目錄下才能訪問 -->
<targetPath>META-INF/resources</targetPath>
<includes>
<include>**/**</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
</resource>
</resources>
其中配置項意義如下:
- directory:指定屬性檔案的目錄,build的程序需要找到它,并且將其放到targetPath下,默認的directory是${basedir}/src/main/resources
- targetPath:指定build資源到哪個目錄,默認是base directory
- includes:指定包含檔案的patterns,符合樣式并且在directory目錄下的檔案將會包含進project的資源檔案,
另外還有一些其他的配置項:
- excludes:指定不包含在內的patterns,如果inclues與excludes有沖突,那么excludes勝利,那些符合沖突的樣式的檔案是不會包含進來的,
- filtering:指定是否將filter檔案(即build下的filters里定義的*.property檔案)的變數值在這個resource檔案有效,例如上面就指定那些變數值configuration檔案無效
- testResources:這個模塊包含測驗資源元素,其內容定義與resources類似,不同的一點是默認的測驗資源路徑是${basedir}/src/test/resources,測驗資源是不部署的
這樣的話啟動后能夠正常訪問靜態資源了,問題得到了解決,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/274856.html
標籤:其他
