Struts2不扫描jar包中的action

来源:互联网 发布:tomcat绑定域名 编辑:程序博客网 时间:2024/04/28 06:20

之前action都是在web应用下,生成war后就是在classes目录下,一直没问题,后来因为模块多了,希望把模块拆开,每个模块自己的action就放到自己相应的jar里面去,结果问题来了,我把action移到jar里面后,在eclipse里面用maven-tomcat插件运行是没问题的,但是部署到tomcat里面后发现action没有被加载,在网上搜了下发现是要在struts.xml里面增加下面的配置:

   设置Convention插件文件协议类型

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


最主要的就是struts.convention.action.includeJars 这个属性,值可以是多个,用逗号隔开,但是一定要加.*?/common*.*?jar(!/)? 正则表达式,我试过直接写jar包的命名也不行,不加正则表达式,会报错说

The includeJars pattern [common.jar] did not match any jars in the classpath.


另外还有一个问题,如果不是maven打的包,jar里面很可能没有META-INF这个目录,也会导致加载不到。

可以用下面的代码检查jar包是否因为META-INF目录不存在而没有加载到:

ArrayList urls = Collections.list(Thread.currentThread().getContextClassLoader().getResources("META-INF"));
            if(urls != null){
                for (Object object : urls) {
                    System.out.println("======================" + object);
                }
            }

0 0