maven項目用起來很方便,但是它的目錄結構和eclipse的目錄結構是有區別的,故而在eclipse下的maven項目,直接運行調試是有一些問題的.
為了方便maven項目的運行調試,因而也就有了像tomcat-maven-plugin,jetty-maven-plugin這類maven插件,不使用eclipse的運行,而直接在maven中運行這類插件是一點問題沒有的,調試使用都很方便.但是resin這個容器在maven下的插件就不怎麼樣了,而且也不再有維護支持了.此時就只能使用eclipse的原始的運行調試命令了.
這裡有幾個小細節要先清楚(以web項目來說):
1.maven項目使用package命令是直接將class文件放到target目錄下的.
eclipse的項目,class文件是根據項目中鼠標右鍵-buildpath中配置的路徑存放.
2.maven項目的web根路徑是src/main/webapp下
eclipse項目的web根路徑是WebRoot(WebContent)下
3.maven項目在執行package後才會在target目錄下生成項目的完整目錄,包含項目的class文件和lib中引入的jar包.
eclipse項目是根據buildpath路徑實時編譯class文件(你取消了autobuild另說),在WebRoot(WebContent)/WEB-INF/lib下存放引入的jar包
觀察以上3點能得到一些明顯的區別:eclipse項目是標准的web程序目錄結構,class文件和lib在web根路徑下.maven項目的class和lib在target下,與web根目錄分開存放.
所以只需要將maven目錄偽裝成標准目錄即可,在不破壞maven目錄結構的情況下,有2種方式可行:
1.標准目錄都是web根路徑下是class和lib,所以我們只需要將項目的buildpath設置到src/main/webapp/WEB-INF/classes下即可.然後復制一份lib文件到src/main/webapp/WEB-INF/lib下.把maven的web根目錄處偽裝出一個標准目錄結構來.resin的配置默認即可正常運行.此時項目 依然是maven項目,但是可以按照eclispe的方式來運行調試.
2.從resin的配置文件入手,不管怎麼樣最終運行的時候是要將項目部署到resin中才運行起來的,所以只要讓resin能識別maven項目的目錄結構也可達到目的.
查找resin的配置文件能發現如下配置:
<cluster id="app-tier"> <resin:import path="classpath:META-INF/caucho/app-default.xml" /> <server id="" address="127.0.0.1" port="6801"> <http address="*" port="9081" /> </server> <host id="" root-directory="."> <web-app id="/xxx" root-directory="D:\xxx\項目名\src\main\webapp" /> </host> </cluster>
可以看到有這麼app-default.xml文件,打開它能看到如下部分:
<class-loader> <compiling-loader path="WEB-INF/classes"/> <library-loader path="WEB-INF/lib"/> </class-loader>
此處指定了resin加載class和lib文件的路徑.maven中只有package後在target目錄下會生成項目的完整文件,所以只要指定這個路徑即可.
我們注意到:
<host id="" root-directory="."> <web-app id="/xxx" root-directory="D:\xxx\項目名\src\main\webapp" /> </host>
resin的web根路徑被指定為D:\xxx\項目名\src\main\webapp文件夾,所以以此目錄為起點找到class和lib文件夾位置即可.我們package後在target目錄下生成的目錄為:
D:\xxx\項目名\target\buildname\WEB-INF\classes和lib
我們使用相對路徑,從webapp向上返1級目錄到main,再向上到src,再向上到項目名目錄,然後再進入target目錄即可,所以只需要將app-default.xml文件修改成如下路徑即可:
<class-loader> <compiling-loader path="../../../target/classes"/> <library-loader path="../../../target/buildname/WEB-INF/lib"/> </class-loader>
可能要說buildname是什麼,這個實際就是pom.xml中定義的:
<build> <finalName>buildname</finalName> </build>
ps:雖然不認為有人會這麼做,但是還是想強調一下第二種方法只是為了本地調試,別去亂改線上環境的resin配置.