Maven04_分模块构建工程
1、模块继承图
2、继承和聚合的理解
继承:
继承的作用是消除重复。一个完整的项目,将三层模型dao、service、controller分开创建为独立的模块,那么对于每一层的pom文件,
都将会有重复的内容出现。比如版本编译、版本锁定等。可以将这些重复的抽取配置到父工程的pom文件中,这样子工程就可以直接使用父工程
定义的东西,这就是maven父子工程的继承。
聚合:
项目的开发是分组分模块的,每一个模块开发完成后,需要运行工程,需要将每个模块聚合到一起运行。比如dao、service、controller最后
需要聚合到一起打包为一个war包
3、示例
1)maven-parent父模块
创建父工程
由于父工程只是提供子工程的重复配置,所以可以只保留一个pom文件即可,这里需要注意打包的方式
将父工程发布到本地仓库,方便子模块继承
2)maven-dao子模块
创建dao子模块,父工程右键创建maven模块
由于dao层不需要页面的交互,所以一个普通java工程即可,也不需要骨架的选择
打包方式为jar包
将dao模块发布到本地仓库,便于service调用
3)maven-service模块
整体步骤和dao层一致
4)maven-controller模块
创建controller模块,
创建java和resources文件
打包方式
注意:如果父子工程中都配置了相同的插件,运行的端口和路径都以子模块为准,比如tomcat插件
4、依赖范围对传递依赖的影响
1)问题描述
比如上述的service模块和dao模块,service模块依赖了dao模块。dao中依赖了Junit,但是当我们在service模块中进行单元测试的时候提示没有junit的jar包。
我们的service模块依赖了dao模块,Junit不应该传递过来吗?
2)依赖范围对传递依赖的影响
解释:
①左侧的直接依赖就是dao对junit的依赖,因为dao模块中直接引入了junit的jar包。
②上面的传递依赖就是service对junit的依赖,因为service需要的junit是靠dao模块的传递依赖。
③中间便是依赖范围对传递依赖的影响。
例如:dao模块中junit的依赖范围是test,即最左侧为test。service模块对junit的依赖也是test,即最上面为test
那么传递依赖就会丢失。
解决:
遇到这种传递丢失的情况,我们通常的解决方案是在本工程中直接添加依赖。
比如,直接在service模块添加junit的jar包引入。
5、运行一个pom父子工程的方式
方式一:
在父工程中配置tomcat插件,然后直接运行父工程(tomcat:run),会自动聚合并执行
方式二:
在controller层配置tomcat插件,运行web层。但是注意这里必须把它的直接依赖和间接依赖全部安装到本地仓库,否则会找不到对应jar包
方式三:
IDEA中配置tomcat。这里也需要安装所有模块到本地仓库。
推荐方式:
推荐方法 2,如果子工程都在本地,采用方法 2则不需要子工程修改就立即发布到本地仓库, 父工程会自动聚合并使用最新代码执行。