今天在做一个二开的项目,将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插件文件协议类型

     (1) 设置Convention插件需要搜索的jar包
      <constant name="struts.convention.action.includeJars" value=".*?/struts2-action*.*?jar(!/)?" />
       该常量指定包作为根包来搜索Action类。
      Convention插件除了扫描默认的action,actions,struts,struts2,还会扫描该常量指定的一个或多个包,
      Convention会试图从指定包中发现Action类。

      <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"/>

 

【当你用心写完每一篇博客之后,你会发现它比你用代码实现功能更有成就感!】