一、分模块开发意义
将原始的模块按照功能拆分成若干个子模块,方便模块间的相互调用,接口共享
好处:可以对这个模块独立维护,其次别人在使用你的模块时也会很方便
(1)按照功能拆分
我们现在的项目都是在一个模块中,比如前面的SSM整合开发。虽然这样做功能也都实现了,但是也存在了一些问题,我们拿银行的项目为例来聊聊这个事。
■ 网络没有那么发达的时候,我们需要到银行柜台或者取款机进行业务操作
■ 随着互联网的发展,我们有了电脑以后,就可以在网页上登录银行网站使用U盾进行业务操作
■ 再来就是随着智能手机的普及,我们只需要用手机登录APP就可以进行业务操作
上面三个场景出现的时间是不相同的,如果非要把三个场景的模块代码放入到一个项目,那么当其中某一个模块代码出现问题,就会导致整个项目无法正常启动,从而导致银行的多个业务都无法正常班理。所以我们会按照功能将项目进行拆分。
(2)按照模块拆分
比如电商的项目中,有订单和商品两个模块,订单中需要包含商品的详细信息,所以需要商品的模型类,商品模块也会用到商品的模型类,这个时候如果两个模块中都写模型类,就会出现重复代码,后期的维护成本就比较高。我们就想能不能将它们公共的部分抽取成一个独立的模块,其他模块要想使用可以像添加第三方jar包依赖一样来使用我们自己抽取的模块,这样就解决了代码重复的问题,这种拆分方式就说我们所说的按照模块拆分。
二、分模块开发
1、创建Maven模块
2、书写模块代码
注意:分模块开发需要先针对模块功能进行设计,再进行编码。不会先将工程开发完毕,然后进行拆分
3、通过maven指令安装模块到本地仓库(install指令)
注意:团队内部开发需要发布模块功能到团队内部可共享的仓库中(私服)
三、依赖管理
依赖指当前项目运行所需的jar,一个项目可以设置多个依赖
格式:
<!--设置当前项目所依赖的所有jar--> <dependencies> <!--设置具体的依赖--> <dependency> <!--设置所属的群组id--> <groupId>org.springframework</groupId> <!--依赖所属项目id--> <artifactId>spring-webmvc</artifactId> <!--依赖版本号--> <version>5.2.10.RELEASE</version> </dependency> </dependencies>
依赖传递
依赖具有传递性
直接依赖:在当前项目中通过依赖配置建立的依赖关系
间接依赖:被资源的资源如果依赖其他资源,当前项目间接依赖其他资源
依赖传递冲突问题
路径优先:当前依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
声明优先,当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
特殊优先:当同级配置相同资源的不同版本,后配置的覆盖先配置的
可选依赖与排除依赖
可选依赖指对外隐藏当前所依赖的资源——不透明
<dependency> <groupId>com.itheima</groupId> <artifactId>maven_03_pojo</artifactId> <version>1.0-SNAPSHOT</version> <!--可选依赖是隐藏当前工程所依赖的资源,隐藏后对应资源将不具有依赖传递--> <optional>false</optional> </dependency>
true为默认,false为隐藏此依赖。
排除依赖指主动断开依赖的资源,被排除的资源无需指定版本——不需要
<dependency> <groupId>com.itheima</groupId> <artifactId>maven_04_dao</artifactId> <version>1.0-SNAPSHOT</version> <!--排除依赖是隐藏当前资源对应的依赖关系--> <exclusions> <exclusion> <groupId>com.itheima</groupId> <artifactId>maven_03_pojo</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> <exclusion> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </exclusion> </exclusions> </dependency>
排除依赖资源仅指定GA即可,无需指定V
介绍我这两种方式后,简单来梳理下:
■ A依赖B,B依赖C , C通过依赖传递会被A使用到,现在要想办法让A不去依赖C
■ 可选依赖是在B上设置<optional> , A不知道有C的存在,
■ 排除依赖是在A上设置<exclusions> , A知道有C的存在,主动将其排除掉。