一、Maven的拆分与聚合思想
假设在电商中买家和卖家端分别为两套系统,两套系统中都需要查看商品信息,这种情况下如果将DAO层代码分别放到两个系统中虽然能够使用,但是后期维护成本非常大。
Maven在针对代码重用是如何解决的?
Maven把一个完成的项目分成不同的独立模块,这些模块有自己独立的坐标,哪个地方需要就可以直接引用坐标即可,也就是说我们可以把项目中的dao层、service层、utils层等分成不同的独立模块,如果有其他系统需要时直接引用坐标,避免重复代码。通过也可以通过坐标把零散的模块聚合成一个项目,这就是maven的拆分聚合思想
将项目改成Maven拆分与聚合的形式
创建父工程
使用IDEA创建一个Maven工程lilith-parent作为父工程,父工程中没有任何代码,只保留pom文件即可,但是需要将Part A部分中项目的pom依赖导入刚刚创建的父工程中。
创建子模块
选中lilith-parent父工程,分别lilith-mapper、lilith-service、lilith-web三个工程,其中lilith-mapper和lilith-service是普通的Maven工程,而lilith-web需要根据模板创建一个web工程。
创建完成之后,从父工程的pom文件中可以看出多处一个modules标签,标签中正是创建的是三个子模块。
分别在lilith-service中引入lilith-mapper,在lilith-web中引入lilith-service,引入JAR包跟引入代码本质上没有区别
工程与模块的区别:
- 工程不等于完整的项目,模块也不等于完整的项目,一个完整的项目看的是代码,代码完整就可以认为是一个完成的项目,与项目是工程还是模块没有关系
- 工程只能使用自己内部的资源,工程天生是独立的,后天可以和其他工程或模块建立关联关系。模块天生不是独立的,模块天生是属于父工程的,模块一旦创建,所有父工程的资源都可以使用
- 子模块天生集成父工程,是可以使用父工程的所有资源,子模块之间天生是没有任何关系的,需要手动建立依赖关系
父子工程中填充代码
分别将mapper层和service层以及controller层对应的代码拷贝进入,注意配置文件的拷贝
lilith-mapper模块中的application.xml文件重命名为application-mapper.xml,并将事务控制相关配置复制到lilith-service中application-service.xml中
在lilith-web模块中的resources目录下新建application.xml配置文件,使用import标签导入mapper和service的配置文件
<import resource="classpath:application-mapper.xml" /> <import resource="classpath:application-service.xml" /> 复制代码
启动应用的方式
父工程启动
通过父工程的tomcat插件启动服务,浏览器中查询item
lilith-web模块启动
通过lilith-web模块的tomcat插件直接启动应用会失败,因为本地仓库没有lilith-service的JAR包,直接在父工程下面点击install,会将lilith-mapper和lilith-service以及lilith-web三个工程的JAR包安装到本地仓库中
再次通过lilith-web模块的tomcat插件启动应用,浏览器中查询商品信息
启动成功,并可以成功查询到商品信息
配置本地Tomcat启动
点击Edit Configurations,配置本地的Tomcat
使用本地的tomcat启动应用,同样也可查询到指定的商品信息
二、Deploy到Nexus私服或远程仓库
当Maven根据坐标寻找JAR包时,它首先会查看本地仓库,如果本地仓库存在此JAR包,则直接使用;如果本地仓库不存在,Maven会去远程仓库查找,发现需要的JAR包之后,下载到本地仓库再使用。
而Nexus就是一种远程仓库,为什么要设置远程仓库或者私服?
- 一些无法从外部仓库下载的构件,例如内部的项目还能部署到私服上,以便供其他依赖项目使用。
- 为了节省带宽和时间,在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库。当本地Maven项目需要下载构件时,先去私服请求,如果私服没有,则再去远程仓库请求,从远程仓库下载构件后,把构件缓存在私服上。这样,及时暂时没有Internet链接,由于私服已经缓存了大量构件,整个项目还是可以正常使用的。
Docker快速搭建Nexus私服
拉取镜像
docker pull sonatype/nexus3 复制代码
创建数据挂载目录并授权
mkdir /opt/nexus-data chmod 777 /opt/nexus-data 复制代码
启动容器
docker run -d --name nexus3 -p 9020:8081 -p 9021:9021 -v /opt/nexus-data:/nexus-data sonatype/nexus3 复制代码
登录地址:http://IP:9020/
初始用户:admin 密码:nexus-data文件夹下的admin.password
Deploys到私服时,需要在pom文件底部增加配置
<distributionManagement> <repository> <id>releases</id> <url>http://ip:9020/nexus/content/repositories/releases/</url> </repository> <snapshotRepository> <id>snapshots</id> <url>http://ip:9020/nexus/content/repositories/snapshots/</url> </snapshotRepository> </distributionManagement> 复制代码
执行Maven的deploy命令即可将应用deploy到私服中