maven整合ssm打war部署项目启动启动报错 Could not resolve resource location pattern

tomcat运行war报错IllegalArgumentException: Could not resolve resource location pattern [classpath :com/wwr/mappers
原因是因为:
maven 并不会自动将 src/main/java 中的 xml 等资源文佳复制到 target/classes 中去
所以解决办法是在pom中添加:

<build>
<resources>
            <!--编译之后包含xml-->
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
 </resources>
 </build>

然后重新clean—install
然后成功解决!
这里顺便记录下tomcat运行原理:
首先Tomcat启动时,jvm的bootstrapLoader去加载java的标准库,这是通过我们配置环境变量即 JAVA_HOME来确定核心库的位置,接着会执行Tomcat bin目录的启动脚本

Startup.sh 使用start参数调用 Catalina.sh 重写系统的classpath并加载 bootstarp.jar 和 tomcat-juli.jar, 这些可以理解为Tomcat本身的东西,现在还没到我们的项目。接着Tomcat

会为每个Context创建ClassLoader .Tomcat 针对每个Context的默认classpath 是 WebApp/WEB-INF/ ,它会从当前目录下的class文件夹加载对应的class文件,会从lib文件下加载lib包.从根目录加载web.xml文件,接着开始加载.当然Servlet3.0可以不从web.xml开始加载,只要实现了 WebApplicationInitializer 这个接口的类,会在servlet启动时自动加载。

好了,现在我们走到了我们项目的入口即web.xml ,在这里我将会配置自己想要的组件。在Maven项目中,配置文件放在Resource中是标准的做法, Resurce中的文件在编译好后会在WEB-INF/class/ 文件夹下,并不在根目录下。
当把配置文件放到webapp下时,这样是找不到配置文件的,因为classpath的查找范围是从/WEB-INF/classes中查找的,而把配置文件放到webapp下,编译后的位置是在/WEB-INF根目录下,所以会找不到文件。classpath 和 classpaht*的区别 , classpath* 会查找根目录下所有的文件,至到找到匹配文件即可。儿classpath只会在/WEB-INF/classes中查找。

其实最重要的是立即的Tomcat 的classpath. 千万不能看你源码目录结构来理解classpath. 因为Tomcat是跑的你编译后的目录。
classpath的查找范围应该是/WEB-INF/classes,资源文件的缺省路径为src/main/resources,Maven在打包成war文件的时候,会将src/main/resources的资源文件复制到class目录。
原理参考:原文参考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值