eclipse下maven项目保持原有目录结构配置resin运行环境
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配置.