采用maven构建模块化项目,将一个整体项目拆分为entity、dao、service、web四个独立模块,项目架构采用spring MVC+spring+mybatis,整个过程直至项目跑起来,报了几个小问题,在此记录,算是经验吧。
1、src/main/resources下创建的folder文件夹,显示为包,而不是文件夹
产生原因:
鼠标右键项目–>properties–>java bulid path–>Source–>src/main/resources,下面included和excluded作用分别为编译期包含的路径和编译期排除的路径,
之所以folder显示为包不显示为文件夹,是因为src/main/resources
路径被包含进入编译期,自动将其下面的folder按照package处理
解决办法:
此时只需要将src/main/resources路径排除在编译期路径外即可:included:(All),excluded:**
,意为包含所有,然后再排除所有(**表示当前路径及其子级路径)
相反,如果src/main/java目录下的package不显示为包而显示为文件夹,则与上述处理相反:included:(All),excluded:(None)
,相关文件将被编译
设计相关内容:
package,source folder,folder区别、eclipse included和excluded的作用
2、项目发布、启动,报无法加载[classpath:/mybatis/mappers/*.xml]
产生原因:
项目被拆分为4个子模块,mapper配置文件位于dao模块,配置数据源和mybatis的spring-context.xml配置文件位于web模块,在web的pom.xml中添加dao依赖,
四个模块在eclipse中都出于open状态,即使在pom.xml中明确了引用dao依赖的type为jar,但此时dao默认以war的形式被发布到web的lib里,所以此时无法读取到mapper配置文件
解决办法:
鼠标右键项目–>properties–>Deployment Assemly–>Add–>project,将所需要依赖的子模块entity、dao、service加入当前项目Web部署组件目录中,此时要注意deploy path列,依赖被发布到的位置、版本、类型,比如:WEB-INF/lib/xxx-dao-1.0.0.jar
当然,也可以不这么费事,直接把entity、dao、service子模块close掉,这样web将明确使用pom.xml中依赖定义的项目、版本以及类型等
拓展内容:
eclipse中output folder和deployment assembly用法有什么不同 :一个是编译期用的, 一个是部署期用的。
关于web工程的deployment assembly :4楼回答
3、项目重新发布、启动,错误同上
产生原因:
因为上面2的问题,采用的解决方案是在web项目的Deployment Assemly里面添加entity、dao、service子模块,并指定了版本、类型等,此时则把entity、dao、service三个项目的Deployment Assemly里面的Web部署组件目录直接打成了jar包,
分别去看三个子模块,发现它们的Deployment Assemly的deploy path列,src/main/java和src/main/resources的部署目录都是WEB-INF/classes,那么,可以遇见,发布到web项目的三个子模块jar目录结构肯定是WEB-INF/classes/…,实际上并不应该带有WEB-INF/classes目录结构
解决办法:
依据上面分析的原因,此时只需要把三个子模块的Deployment Assemly的deploy path列,src/main/java和src/main/resources的部署目录更改为根目录,即 WEB-INF/classes
更改为 /
,
与上面问题2的解决方案一样,可以不这么费事,直接把entity、dao、service子模块close掉,这样web将明确使用pom.xml中依赖定义的项目、版本以及类型等