前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Apache Maven 高级应用(Part B)

Apache Maven 高级应用(Part B)

作者头像
RiemannHypothesis
发布2022-09-26 14:07:07
4880
发布2022-09-26 14:07:07
举报
文章被收录于专栏:Elixir

“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工程。

image.png
image.png

创建完成之后,从父工程的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的配置文件

代码语言:javascript
复制
<import resource="classpath:application-mapper.xml" />
<import resource="classpath:application-service.xml" />

启动应用的方式

父工程启动
image.png
image.png

通过父工程的tomcat插件启动服务,浏览器中查询item

lilith-web模块启动

通过lilith-web模块的tomcat插件直接启动应用会失败,因为本地仓库没有lilith-service的JAR包,直接在父工程下面点击install,会将lilith-mapper和lilith-service以及lilith-web三个工程的JAR包安装到本地仓库中

image.png
image.png

再次通过lilith-web模块的tomcat插件启动应用,浏览器中查询商品信息

image.png
image.png

启动成功,并可以成功查询到商品信息

配置本地Tomcat启动

点击Edit Configurations,配置本地的Tomcat

image.png
image.png

使用本地的tomcat启动应用,同样也可查询到指定的商品信息

二、Deploy到Nexus私服或远程仓库

当Maven根据坐标寻找JAR包时,它首先会查看本地仓库,如果本地仓库存在此JAR包,则直接使用;如果本地仓库不存在,Maven会去远程仓库查找,发现需要的JAR包之后,下载到本地仓库再使用。

而Nexus就是一种远程仓库,为什么要设置远程仓库或者私服?

  • 一些无法从外部仓库下载的构件,例如内部的项目还能部署到私服上,以便供其他依赖项目使用。
  • 为了节省带宽和时间,在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库。当本地Maven项目需要下载构件时,先去私服请求,如果私服没有,则再去远程仓库请求,从远程仓库下载构件后,把构件缓存在私服上。这样,及时暂时没有Internet链接,由于私服已经缓存了大量构件,整个项目还是可以正常使用的。

Docker快速搭建Nexus私服

拉取镜像

代码语言:javascript
复制
docker pull sonatype/nexus3 

创建数据挂载目录并授权

代码语言:javascript
复制
mkdir /opt/nexus-data
chmod 777 /opt/nexus-data

启动容器

代码语言:javascript
复制
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文件底部增加配置

代码语言:javascript
复制
<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到私服中

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、Maven的拆分与聚合思想
    • 将项目改成Maven拆分与聚合的形式
      • 创建父工程
      • 创建子模块
    • 父子工程中填充代码
      • 启动应用的方式
        • 父工程启动
        • lilith-web模块启动
        • 配置本地Tomcat启动
    • 二、Deploy到Nexus私服或远程仓库
      • Docker快速搭建Nexus私服
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档