zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Apache Maven 高级应用(Part B)

ApacheMaven应用 高级 Part
2023-06-13 09:11:06 时间

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”

一、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到私服中