首頁 > 軟體

web.xml中Maven預留位置不生效問題記錄分析

2022-02-25 19:01:44

問題背景

開發反饋,一個spring mvc的web專案,在web.xml設定的預留位置不生效,編譯後還是沒有替換成設定的屬性,如下:

<context-param>
    <param-name>logbackConfigLocation</param-name>
    <param-value>classpath:${loagback.xml.path:logback.xml}</param-value>
</context-param>

問題分析

先了解下,為什麼在Maven中可以通過${xx}這種預留位置的方式在編譯期可以獲取到Maven中的Properties屬性資訊呢?因為Maven提供了一個外掛在起作用

maven-resources-plugin:http://maven.apache.org/plugins/maven-resources-plugin/

Resources Plugin將Resource元素指定的檔案複製到輸出目錄。以下三個變體僅在指定或預設資源和輸出目錄元素的方式上有所不同。

Resources外掛有三個目標:

resources:resources將主原始碼的資源複製到主輸出目錄。

此目標通常自動執行,因為它預設繫結到流程資源生命週期階段。它始終使用project.build.resources元素指定資源,預設情況下使用project.build.outputDirectory指定複製目標。

resources:testResources將測試原始碼的資源複製到測試輸出目錄。

此目標通常自動執行,因為它預設繫結到process-test-resources生命週期階段。它始終使用project.build.testResources元素指定資源,預設情況下使用project.build.testOutputDirectory指定複製目標。

resources:copy-resources將資源複製到輸出目錄。

此目標要求您設定要複製的資源,並指定outputDirectory。

以上來自官方的釋義。其實就我們使用來說,這個外掛有兩個作用,如下:

  • 複製或排除檔案:指定源資源目錄下的檔案哪些需要編譯到目標目錄
  • 過濾$預留位置:從Maven Properties中找到預留位置中的變數,並替換為Properties中的值

Maven的理念是約定大於設定,所以預設情況下,Maven約定資源目錄是src/main/resources。也就是說即使不在pom.xml加任何Resources設定,只要我們的資原始檔放在了 

src/main/resources目錄下,就能被maven-resources-plugin管理到,就能替換掉檔案中的預留位置。

問題定位

如上,我們的web.xml所在目錄為src/main/webapp/WEB-INF下,並不在src/main/resources下,所以不起作用。

還有一個問題是${loagback.xml.path:logback.xml}預留位置。Maven對預留位置的解析沒有Spring那麼智慧,不支援預留位置中帶條件邏輯的。

問題解決

 1、修改預留位置為:${loagback.xml.path},調整好每個profile中properties的設定

 2、因為web.xml是webapp目錄下的資源,而專案中使用了maven-war-plugin外掛來打war包,maven-war-plugin自帶了對webapp下資源的處理。做如下設定即可:

     在configuration節點中新增webResources,如:

或者,簡單點設定filteringDeploymentDescriptors為true即可,如:

maven-war-plugin具體用法請參考官方檔案:http://maven.apache.org/plugins/maven-war-plugin

以上就是web.xml中Maven預留位置不生效問題記錄分析的詳細內容,更多關於web.xml中Maven預留位置不生效的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com