Struts2访问jar包内的Action问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/adobeid/article/details/81222161

问题描述

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文件里。

以上,太啰嗦了。

猜你喜欢

转载自blog.csdn.net/adobeid/article/details/81222161
今日推荐