SpringMVC 工程打成jar包後,hbm.xml文件無法加載,action無法映射的問題

     最近由於項目平臺上開發新的子項目,發現平臺結構越來越複雜,非常難看,也不便於維護。於是乎將平臺基礎部分進行了打包,扔到lib裏面去。

     jar包打好了,啓動tomcat測試,啓動時就報錯了,說無法創建hibernate的sessionfactory,不可能啊,我沒打包之前都是好的,難道打包就不能用了?檢查,發現是掃描hbm.xml映射文件失敗,於是檢查hibernate配置文件,有這麼幾行代碼:

 

<property name="mappingDirectoryLocations">
	<list>
		<value>classpath:com/per/domain</value>
	</list>
</property>

 查閱mappingDirectoryLocations的相關資料,有這麼一些描述:

 

寫道
LocalSessionFactoryBean有好幾個屬性用來查找hibernate映射文件:mappingResources、mappingLocations、mappingDirectoryLocations與mappingJarLocations
他們的區別:
mappingResources:指定classpath下具體映射文件名
<property name="mappingResources">
<value>petclinic.hbm.xml </value>
</property>
mappingLocations:可以指定任何文件路徑,並且可以指定前綴:classpath、file等
<property name="mappingLocations">
<value>/WEB-INF/petclinic.hbm.xml </value>
</property>

<property name="mappingLocations">
<value>classpath:/com/company/domain/petclinic.hbm.xml </value>
</property>
也可以用通配符指定,'*'指定一個文件(路徑)名,'**'指定多個文件(路徑)名,例如:
<property name="mappingLocations">
<value>classpath:/com/company/domainmaps/*.hbm.xml </value>
</property>
上面的配置是在com/company/domain包下任何maps路徑下的hbm.xml文件都被加載爲映射文件

mappingDirectoryLocations:指定映射的文件路徑

<property name="mappingDirectoryLocations">
<list>
<value>WEB-INF/HibernateMappings</value>
</list>
</property>
也可以通過classpath來指出
<property name="mappingDirectoryLocations">
<list>
<value>classpath:/XXX/package/</value>
</list>
</property>

mappingJarLocations:指定加載的映射文件在jar文件中

 哦,原來有個mappingJarLocations屬性,於是趕緊搜mappingJarLocations的資料,在本網站內看到如下一段內容:

 

http://zprill.iteye.com/blog/716197寫道

 

<property name="mappingLocations">
<list>
<value>classpath:com/test/hbm/*.hbm.xml</value>
</list>
</property>
當hbm文件被打成jar包時,上面的方法就不能用了。幸虧org.springframework.orm.hibernate3.LocalSessionFactoryBean還有mappingJarLocations屬性。
<property name="mappingJarLocations">
<list>
<value>WEB-INF/lib/test.jar</value>
</list>
</property>

這樣就不怕被讀不到文件了

 好了,趕快改吧,將上面有問題的代碼改成這樣:

<property name="mappingJarLocations">
	<list>
		<value>WEB-INF/lib/comm-base.jar</value>
	</list>
</property>
<property name="mappingDirectoryLocations">
	<list>
	       <value>classpath:com/per/**/domain</value>
	</list>
</property>

 重啓tomcat ,好了,這下沒報錯了。不過新的問題來了,原來可以訪問的網頁現在訪問報404錯誤。奇怪了,再google一把,原來是jar包的問題,跟這位仁兄是一樣的問題:

 

http://xinglu.iteye.com/blog/1457029 寫道

 

近期在用spring3做一個項目,用到了裏面的一個自動掃描組件的特性.但是工程分爲了好多個小項目,有個統一的開發平臺,這個平臺的支撐類會被我做成一個jar包被其它幾個子工程引用.

開發的時候使用的是工廠引用工廠的方式,在eclipse裏面的classpath裏面把該平臺工廠引入即可,避免了每次修改了平臺代碼都要重新打包的問題.這個方法不是在web project類型,對於web-project,還是需要沿用老辦法,即打成jar包,然後讓web-project引用進來.

這時發現個問題,就是平臺下junit測試正常的一些spring bean,到了web-project裏面發現無法關聯到了.
搞了很久,也上網查了很多資料,一開始以爲是要修改<context:component-scan >裏面的resource-pattern屬性,後來改來改去都解決不了問題.

最後發現一個問題,是我們的eclipse自帶的jar打包程序,默認打包的時候有個選項<Add directory entries>沒有勾選,只要勾選了,就完全沒有問題了,無須再對<context:component-scan >進行任何修改了.

罪惡的<Add directory entries>選項啊!

 

好了,重新打包,再試,ok,問題解決。

 

小細節可真多啊~記錄在此,以備後查吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章