打成Jar包後執行報錯 Unable to locate Spring NamespaceHandler for XML schema namespace

賈樹丙發表於2017-03-27
MAVEN專案,在IDEA中執行正常,但是把它打成jar包後再執行就會出現異常:
 
Exception in thread "main" org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/context]
Offending resource: URL [jar:file:/home/jiashubing/mysoft/jartest3/cli3.jar!/META-INF/spring/spring-shell-plugin.xml]
 
這個錯誤並不少見,但是網上搜到的多為在專案執行的時候報這個錯誤。也有jar包中報這個錯誤的帖子,但是都說配置檔案的版本不一致導致的。這些我都試過了,都無法解決。
 
嘗試了很多次以後,終於發現,雖然我在專案中是有spring-shell-plugin.xml這個配置檔案的,但是打成jar包以後,jar包中並沒有包含這個配置檔案
 
原來,在IDEA中,MAVEN專案是會自動掃描 src/main/resources 路徑下的資源配置檔案的,所以無需額外配置。
自動掃描的原因是:resource 下的檔案編譯之後存放的位置,直接位於classes下面,這個路徑其實就是classPath的路徑,所以,在resources 根目錄下的配置檔案其實就是 classPath的路徑
 
 
但是打成Jar包以後,它是不會自動掃描 src/main/resources 路徑下的配置檔案了,所以應當在這裡手動配置,讓它能掃描到xml配置檔案。
只需要在pom.xml中新增以下程式碼:
<resources>
   <resource>
      <directory>src/main/resources</directory>
      <includes>
         <include>**/*.xml</include>
      </includes>
   </resource>
</resources>
 
原創文章,轉載請註明出處!

補充一下
MAVEN專案的標準目錄結構:
 
src
  -main
      –bin 指令碼庫
      –java java原始碼檔案
      –resources 資源庫,會自動複製到classes目錄裡
      –filters 資源過濾檔案
      –assembly 元件的描述配置(如何打包)
      –config 配置檔案
      –webapp web應用的目錄。WEB-INF、css、js等
  -test
      –java 單元測試java原始碼檔案
      –resources 測試需要用的資源庫
      –filters 測試資源過濾庫
  -site Site(一些文件)
target
LICENSE.txt Project’s license
README.txt Project’s readme
 
紅色字型的四個目錄是常用的

相關文章