问题描述
idea导入一个maven的聚合工程,其中是采用struts2框架,导入后发现用idea配置本地
tomcat启动后,无法访问Action。
定位问题
经过了各种资料查询,问同事,最后定位到问题是:
Struts2访问jar包内的Action问题,由于是聚合工程,结构是xxx-war工程里面引用
xxx-web工程,所有的Action都定义在xxx-web内,配置文件在xxx-war内。
解决问题
定位到问题后,认为很好解决,百度一下就OK了,还是想的太简单了。。。
百度解决方案是:
struts.xml里面增加下面的配置,设置Convention插件文件协议类型,
设置Convention插件需要搜索的jar包
<constant name="struts.convention.action.includeJars" value=".*?/xxx-web*.*?jar(!/)?" />
反转
打开struts.xml后,突然傻眼了
<constant name="struts.convention.result.path" value="/WEB-INF/jsp" />
<constant name="struts.convention.package.locators" value="action" />
<constant name="struts.convention.action.name.separator" value="-" />
<constant name="struts.convention.action.includeJars"
value=".*?/xxx-web.*?jar(!/)?" />
已经有了这个配置,那么怎么还会这样?难道不是这个原因,顿时陷入了困境。。。
柳暗花明
最后实在没辙了,找来以前做这个项目的同事,然后他说:他们都不是这么启动的,
直接是利用maven的jetty插件(maven-jetty-plugin),idea配置mave,
n命令jetty:run启动。当然启动前需要install工程。根据同事说是
install->jetty:run启动,果然启动后发现可以访问了。
然后我多嘴问了下,为什么idea里面用tomcat启动不了。然后说回答是:
我们一直是这么启动的,然后他又看了一下,没查到原因。
探究
问题就这样解决了,总感觉有根刺在喉咙,而且maven启动,每次修改都要重新
build(install)整个聚合工程,非常麻烦。然后不甘心,有是各种百度,好吧,
我是比较闲。。。
最终解决
偶尔看到一个帖子,说是jar包中要有没有METE-INF文件夹内容的话,Struts2
也会扫描不到。看到这,心扑通扑通跳,感觉找到了问题关键。
答案
maven jetty:run启动的实际上是先要install,就是把所有的工程都用maven打包
发布到本地maven仓库,然后启动的是在maven仓库中的xxx-war.war工程
idea配置的tomcat启动时在工程下文,idea自己打包生成一个xxx-war的可运行工程
到达idea的xxx-war的可运行工程目录下的lib下找到xxx-web包,发现idea在打包的
时候果然没有。
idea打包的时候是根据工程里面的内容直接打包,工程没有METE-INF文件夹
maven打包的时候会自动生成METE-INF文件夹内容
解决
xxx-web工程内加入METE-INF文件(我是从maven的jar包中直接拿出来的)
,配置METE-INF文件到output文件里。
以上,太啰嗦了。