今天在做一个二开的项目,将struts打成jar包放在WEB-INF的目录下却扫描不到指定的路径,也就是http访问访问不到我们指定的action,其他代码可以正常使用,就是访问不到action。struts是基于注解使用 struts。于是我找struts.xml,最后发现被放在jar包里面了。一开始我的解决办法是将struts的相关代码解开jar包(也就是编译后的文件)放在WEB-INF\classes目录下,功能可以正常使用。
后来查阅资料发现,struts注解使用可以指定struts扫描action的jar文件位置,我们项目也正是限制了struts的扫描的包的名称,
最主要的就是struts.convention.action.includeJars 这个属性,值可以是多个,用逗号隔开,但是一定要加.*?/common*.*?jar(!/)?正则表达式,我试过直接写jar包的命名也不行,不加正则表达式,会报错说
The includeJars pattern [common.jar] did not match any jars in the classpath.
研究struts-conventionxxx.jar的中struts-plugin.xml配置如下:
<struts order="20"> <bean type="com.opensymphony.xwork2.UnknownHandler" name="convention" class="org.apache.struts2.convention.ConventionUnknownHandler"/> <bean type="org.apache.struts2.convention.ActionConfigBuilder" name="convention" class="org.apache.struts2.convention.PackageBasedActionConfigBuilder"/> <bean type="org.apache.struts2.convention.ActionNameBuilder" name="convention" class="org.apache.struts2.convention.SEOActionNameBuilder"/> <bean type="org.apache.struts2.convention.ResultMapBuilder" name="convention" class="org.apache.struts2.convention.DefaultResultMapBuilder"/> <bean type="org.apache.struts2.convention.InterceptorMapBuilder" name="convention" class="org.apache.struts2.convention.DefaultInterceptorMapBuilder"/> <bean type="org.apache.struts2.convention.ConventionsService" name="convention" class="org.apache.struts2.convention.ConventionsServiceImpl"/> <bean type="com.opensymphony.xwork2.config.PackageProvider" name="convention.packageProvider" class="org.apache.struts2.convention.ClasspathPackageProvider"/> <bean type="com.opensymphony.xwork2.config.PackageProvider" name="convention.containerProvider" class="org.apache.struts2.convention.ClasspathConfigurationProvider"/> <constant name="struts.convention.actionConfigBuilder" value="convention"/> <constant name="struts.convention.actionNameBuilder" value="convention"/> <constant name="struts.convention.resultMapBuilder" value="convention"/> <constant name="struts.convention.interceptorMapBuilder" value="convention"/> <constant name="struts.convention.conventionsService" value="convention"/> <constant name="struts.convention.result.path" value="/WEB-INF/content/"/> <constant name="struts.convention.result.flatLayout" value="true"/> <constant name="struts.convention.action.suffix" value="Action"/> <constant name="struts.convention.action.disableScanning" value="false"/> <constant name="struts.convention.action.mapAllMatches" value="false"/> <constant name="struts.convention.action.checkImplementsAction" value="true"/> <constant name="struts.convention.default.parent.package" value="convention-default"/> <constant name="struts.convention.action.name.lowercase" value="true"/> <constant name="struts.convention.action.name.separator" value="-"/> <constant name="struts.convention.package.locators" value="action,actions,struts,struts2"/> <constant name="struts.convention.package.locators.disable" value="false"/> <constant name="struts.convention.package.locators.basePackage" value=""/> <constant name="struts.convention.exclude.packages" value="org.apache.struts.*,org.apache.struts2.*,org.springframework.web.struts.*,org.springframework.web.struts2.*,org.hibernate.*"/> <constant name="struts.convention.relative.result.types" value="dispatcher,velocity,freemarker"/> <constant name="struts.convention.redirect.to.slash" value="true"/> <constant name="struts.convention.action.alwaysMapExecute" value="true"/> <constant name="struts.mapper.alwaysSelectFullNamespace" value="true"/> <!-- <constant name="struts.convention.action.includeJars" /> --> <constant name="struts.convention.action.fileProtocols" value="jar" /> <constant name="struts.convention.classes.reload" value="false" /> <constant name="struts.convention.exclude.parentClassLoader" value="true" /> <package name="convention-default" extends="struts-default"> </package> </struts>
解决上面问题:
设置Convention插件文件协议类型
<constant name="struts.convention.action.packages" value="com.home.prog" />
(2)将编译后的文件放在WEB-INF\classes目录下
(3) 将我们打成的jar包命名为struts.convention.action.includeJars 允许的名称
需要注意的是,打成的jar包一般会包含META-INF目录,一般我们使用JDK自带的jar就可以打包,注意打包的时候不要将源码打到包里,eclipse一般也会将我们的代码编译到build目录,所以我们直接在编译后的目录打jar包即可,打包的时候注意路径问题。
参考: http://www.cnblogs.com/qlqwjy/p/7289391.html
参数解释如下:
<!--设置Convention插件定位视图资源的根路径,默认为/WEB-INFO/content --> <constant name="struts.convention.result.path" value="/WEB-INF/content/"/> <!--如果设置为false,则可以将视图页面放置Action对应的目录(无需放入WEB-INFO/content) --> <constant name="struts.convention.result.flatLayout" value="true"/> <!--Convention搜索Action类的类名后缀,默认为Action --> <constant name="struts.convention.action.suffix" value="Action"/> <!--是否禁止通过包扫描Action,默认是false --> <constant name="struts.convention.action.disableScanning" value="false"/> <!--设置即使没有@Action注释,是否依然创建Action映射。默认值为false -->Create action mappings, even if no @Action is found <constant name="struts.convention.action.mapAllMatches" value="false"/> <!--设置是否所有实现com.opensymphony.xwork2.Action的Action都创建Action映射,默认是true --> <constant name="struts.convention.action.checkImplementsAction" value="true"/> <!--设置Convention映射的Action所在包的默认父包。默认值是convention-default --> <constant name="struts.convention.default.parent.package" value="convention-default"/> <!--设置映射Action时,是否将Action的name属性值转换为所有字母小写,默认值是true --> <constant name="struts.convention.action.name.lowercase" value="true"/> <!--设置映射Action时指定name属性值各单词之间的分隔符。默认值为中画线(“-”) --> <constant name="struts.convention.action.name.separator" value="-"/> <!--默认包路径包含action,actions,struts,struts2的所有包都会被struts作为含有Action类的路径来搜索 --> <constant name="struts.convention.package.locators" value="action,actions,struts,struts2"/> <!--指定禁止从Action的根包里搜索Action。默认值为false --> <constant name="struts.convention.package.locators.disable" value="false"/> <!--如果指定了该常量,Convention只会以该常量值开始的包中搜索Action类 --> <constant name="struts.convention.package.locators.basePackage" value=""/> <!--指定排除在搜索Action之外的包。默认值为org.hibernate.* ... --> <constant name="struts.convention.exclude.packages" value="org.apache.struts.*,org.apache.struts2.*,org.springframework.web.struts.*,org.springframework.web.struts2.*,org.hibernate.*"/> <!--指定Convention映射的Result时默认支持的结果类型。默认值为dispatcher,velocity,freemarker --> <constant name="struts.convention.relative.result.types" value="dispatcher,velocity,freemarker"/> <!--设置是否重定向到斜线(/)。例如用户请求/foo,但/foo不存在时,如果设置该常量为可重定向到/foo/。默认值是true --> <constant name="struts.convention.redirect.to.slash" value="true"/>