“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”
假设在电商中买家和卖家端分别为两套系统,两套系统中都需要查看商品信息,这种情况下如果将DAO层代码分别放到两个系统中虽然能够使用,但是后期维护成本非常大。
Maven在针对代码重用是如何解决的?
Maven把一个完成的项目分成不同的独立模块,这些模块有自己独立的坐标,哪个地方需要就可以直接引用坐标即可,也就是说我们可以把项目中的dao层、service层、utils层等分成不同的独立模块,如果有其他系统需要时直接引用坐标,避免重复代码。通过也可以通过坐标把零散的模块聚合成一个项目,这就是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模块的tomcat插件直接启动应用会失败,因为本地仓库没有lilith-service的JAR包,直接在父工程下面点击install,会将lilith-mapper和lilith-service以及lilith-web三个工程的JAR包安装到本地仓库中
再次通过lilith-web模块的tomcat插件启动应用,浏览器中查询商品信息
启动成功,并可以成功查询到商品信息
点击Edit Configurations,配置本地的Tomcat
使用本地的tomcat启动应用,同样也可查询到指定的商品信息
当Maven根据坐标寻找JAR包时,它首先会查看本地仓库,如果本地仓库存在此JAR包,则直接使用;如果本地仓库不存在,Maven会去远程仓库查找,发现需要的JAR包之后,下载到本地仓库再使用。
而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到私服中