大家好,我是IT修真院成都分院第8期的JAVA学员,一枚正直纯洁善良的java程序员。 今天给大家分享一下,修真院官网Java任务2,深度思考中的知识点————了解maven的module。
1.背景介绍
为什么要聚合?
随着技术的飞速发展和各类用户对软件的要求越来越高,软件本身也变得越来越复杂,然后软件设计人员开始采用各种方式
进行开发,于是就有了我们的分层架构、分模块开发,来提高代码的清晰和重用。
比如:我们在开发过程中,创建了2个以上的模块,每个模块都是一个独立的maven project,在开始的时候我们可以独立的编译和测试运行每
个模块,但是随着项目的不断变大和复杂化,这样的管理是混乱的,没有遵守一个设计模式原则:“高内聚,低耦合”,于是我们就希望用分层架构、分层模块来提高代码的清晰和重用,
这时Maven给出了聚合的配置方式。
2.知识剖析
建立聚合project的时候,我们要注意以下几点:
1、该聚合本身也做为一个Maven项目,它必须有自己的POM
2、它的打包方式必须为: pom
3、引入了新的元素:modules—module
4、版本:聚合模块的版本和被聚合模块版本一致
5、习惯约定:为了方便构建,通常将聚合模块放在项目目录层的最顶层,
其它聚合模块作为子目录存在。这样当我们打开项目的时候,第一个看到的就是聚合模块的POM
6、聚合模块减少的内容:聚合模块的内容仅仅是一个pom.xml文件,它不包含src/main/java、src/test/java等目录,
因为它只是用来帮助其它模块构建的工具,本身并没有实质的内容。
7、聚合模块和子模块的目录:他们可以是父子类,也可以是平行结构,当然如果使用平行结构,那么聚合模块的POM也需要做出相应的更改
模块化的好处:
1、方便重用。项目的一些包都是复用的,称为项目复用的基础类库,供所有的项目使用。当需要再开发一个模块的时候重用这些
复用的模块能省不少事,这是模块化最重要的一个目的。
2、灵活性。比如我们公共的jar包,我们不需要再当源码,只需要deploy到nexus,其他人从nexus下载即可。代码的可维护性、可扩展性好,并且保证了项目独立性与完整性。
3.常见问题
聚合/继承?
聚合:把多个模块或项目聚合到一期,我们可以建立一个专门负责聚合工作的project.
继承:父子关系,Maven继承也是为了防止重复,让项目的jar包版本一致,在项目管理上起了很大的作用。
对于聚合模块来说,它知道有哪些被聚合的模块,而对于被聚合的模块来说,它们不知道被谁聚合了,也不知道它的存在;
对于继承关系的pom来说,它不知道被哪些模块继承了,对于子pom来说,它必须知道要继承谁。
多模块和父子关系是不同的。如果core和webapp只是在逻辑上属于同一个总工程,那么我们完全可以只声明模块关系,
而不用声明父子关系。如果core和webapp分别处理两个不同的领域,但是它们又共享了很多,比如依赖等,
那么我们可以将core和webapp分别继承自同一个父pom工程,而不必属于同一个工程下的子模块。
5.编码实战
6.扩展思考
模块之间的依赖:
Maven在创建webapp模块时并不知道webapp依赖于core,所以这种依赖关系需要我们手动加入,
在webapp模块的pom.xml中加入对core模块的依赖:在webapp的dependencies中加入core模块的GAV坐标,就完成了依赖。
此时再在聚合目录下执行 “mvn clean install”,Maven将根据自己的Reactor机制决定哪个模块应该
先执行,哪个模块应该后执行。比如,这里的webapp模块依赖于core模块,那么Maven会先在core模块上执行
“mvn clean install”,再在webapp模块上执行相同的命令。在webapp上执行“mvn clean install”时,
由于core模块已经被安装到了本地的Repository中,webapp便可以顺利地找到所依赖的core模块。
7.参考文献
https://www.cnblogs.com/davenkin/p/advanced-maven-multi-module-vs-inheritance.html
http://blog.csdn.net/yuanxiaojun1990/article/details/50359059
PPT :ppt
腾讯视频:
undefined_腾讯视频
问题:
什么情况下使用继承?
需要防止依赖重复,让项目的jar包版本一致的时候。
子类直接可以互相继承吗?
不行,两个之间只能一个父一个子。
那我统一把子模块的依赖都放到父模块的依赖可以吗‘?
可以的,只是如果不是共用的话会显得比较臃肿。
core包还是要打包给web和service添加吧?
如果都是依赖于core包的话,是要先打包core的,但是如果直接在聚合项目执行命令,maven会
自动决定先后打包顺序的
感谢大家观看!
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
技能树.IT修真院
“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。
这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧~
我的邀请码:17701057,或者你可以直接点击此链接:http://www.jnshu.com/login/1/17701057