[maven] 搭建多模块企业级项目
知识点:聚合、继承、工程依赖、单元测试、多war聚合、cargo发布
① 准备工作
参考资料
http://www.cnblogs.com/quanyongan/archive/2013/05/28/3103243.html
http://www.cnblogs.com/xdp-gacl/p/4242221.html
http://blog.csdn.net/abing37/article/details/4951154
http://my.oschina.net/ydsakyclguozi/blog/411977?fromerr=I7N1vOPq
http://kyfxbl.iteye.com/blog/1680045
http://blog.csdn.net/steveguoshao/article/details/38414145
安装maven插件
基于eclipse创建maven项目,如果没有maven插件,请先安装maven插件。
② 确立模块结构和依赖关系
模块结构
|-easyframework-root:总控项目,只包含一个pom.xml文件。
|-easyframework-web :整个项目的web层,页面显示以及控制层。
|-easyframework-core:核心业务项目,主要是Service处理业务逻辑。
|-easyframework-persist:数据持久层,操作底层数据库。
|-easyframework-model:数据模型,与数据库表字段对应的实体类。
|-easyframework-utils:工具类,所有工具类都提取出来写在这个项目中。
特别说明:创建项目时,只有easyframework-web是web项目(maven-archetype-webapp)打war包,其他则是java项目(maven-archetype-quicktart),打jar包。
各模块依赖关系
web 依赖 core model util
core 依赖 persist model util
persist 依赖 model
③ 创建总控项目 easyframework-root
特点
1、创建时类型为Maven Project
2、没有实际代码和资源文件,只有pom.xml文件
3、packaging节点值为pom
4、继承性:dependences 声明的依赖可以被子模版继承使用,properties 声明的变量可以被子模版使用。好处是在各个子模块中不需要一遍又一遍的重复添加同样的依赖元素,且如果在子项目中也有同样的依赖,则会覆盖父POM中的值。
5、子模块用modules和module元素声明
作用:承担聚合模块和父模块的作用,实现对所有子模块的统一管理,编译和部署。
④ 创建web子项目 easyframework-web
特点
1、创建时类型为Maven Module - maven-archetype-webapp
2、与其他子项目不同的是,包含有webapp
3、packaging节点值为war
4、声明父容器的节点为parent
作用:作为web层使用,并且最终作为容器的war包存在。
⑤ 创建其他子模块
特点:
1、创建时类型为Maven Module - maven-archetype-quicktart
2、packaging节点值为jar
3、声明父容器的节点为parent
4、根据子模块各自不同的依赖关系配置相互的依赖
⑥ 优化配置
按上面步骤创建的子项目,在pom.xml
中有个parent
节点,所以,他可以继承父项目的相关信息。没错,父子项目中存在继承关系。
在子项目的pom.xml
中,子项目的groupId
和version
一般和父项目相同,那么可以把子项目的这两个参数删除,这样会自动继承父项目的取值。
同样,如果其他的一些属性,所有子项目都是一样的,那么可以上移到父项目中设置,子项目中无需重复设置。比如:<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
可以仅在父项目中设置一次。
除了这种情况以外,还有一种情况,就是依赖和插件。依赖和插件的情况是这样,某一个依赖或插件可能会被大部分子项目所使用,但是也可能有些子项目不需要使用,这样使用上述的方式,简简单单地进行继承就不合适了。
Manen提供dependencyManagement
和pluginManagement
两个标签。使用这两个标签,可以在父项目中统一管理依赖和插件的配置参数,比如版本号啥的。而在子项目中,仅需列出需要使用的依赖和插件的groupId
和artifactId
就可以了,其他信息会自动从父项目管理的信息里面获取。
看例子,父项目中:
<dependencyManagement> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.5</version> <scope>test</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> </dependency> </dependencies> </dependencyManagement>
在子项目中:
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> </dependencies>