Maven高级—分模块设计与开发、继承、聚合和私服

分模块设计与开发

分模块设计策略

这里我们采用策略一进行演示

步骤一:创建tilas-pojo

这里我们不需要选择springboot框架,因为我们的实体类不需要进行什么框架操作

这里我们要引入lombok的依赖(缺什么依赖引入什么依赖,注入依赖版本一致),但这里由于我们采用的并不是SpringBoot框架,所以引入依赖版本号不可省略,

Spring Boot 可以省略版本号,是因为它引入了「父工程」(spring-boot-starter-parent),里面已经统一声明了常用依赖的版本。

这就是所谓的 「依赖版本仲裁」

tlias-utils这个模块的创建同样如此,这里有的时候引入依赖IDEA可能不识别,剪切重新粘贴一遍即可

步骤二:在tlias-web-management中引入如上两模块的依赖

继承<parent>

工程之间的依赖关系继承,便于维护和管理我们的依赖,我们使用<parent>这个标签来指明工程与工程之间的依赖关系,对于我们本次项目的依赖关系如下

Maven打包方式:

  • jar:普通模块打包,springboot项目基本都是jar包(内嵌tomcat运行)

  • war:普通web程序打包,需要部署在外部的tomcat服务器中运行

  • pom:父工程或聚合工程,该模块不写代码,仅进行依赖管理

1.实现

1). 创建maven模块 tlias-parent ,该工程为父工程**,设置打包方式pom(默认jar)。**

src则直接删掉

父工程tlias-parent的pom.xml文件配置如下,并设置packaging类型为pom:

复制代码
<packaging>pom</packaging>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.5</version>
    <relativePath/>
</parent>

<groupId>com.itheima</groupId>
<artifactId>tilas-parent</artifactId>
<version>1.0-SNAPSHOT</version>

2). 在子工程(tlias-pojotlias-utilstlias-web-management)的pom.xml文件中,配置继承关系,tlias-web-managementtlias-pojo把原本的springboot的parent依赖删除掉即可

注意:

  • 在子工程中,配置了继承关系之后,坐标中的groupId和version是可以省略的,因为会自动继承父工程的 。
复制代码
<parent>
    <groupId>com.itheima</groupId>
    <artifactId>tilas-parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <relativePath>../tilas-parent</relativePath>
</parent>

<artifactId>tilas-web-management</artifactId>

这里路径要设置为相对路径,即**../父工程模块名**

3). 在父工程中配置各个工程共有的依赖(子工程会自动继承父工程的依赖)

复制代码
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

2.版本锁定<dependencyManagement>

如果项目拆分的模块比较多,每一次更换版本,我们都得找到这个项目中的每一个模块,一个一个的更改。 很容易就会出现,遗漏掉一个模块,忘记更换版本的情况。

在maven中,可以在父工程的pom文件中通过 `<dependencyManagement>` 来统一管理依赖版本。

在父工程中配置

复制代码
<!--统一管理依赖版本-->
<dependencyManagement>
    <dependencies>
        <!--JWT令牌-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>
    </dependencies>
</dependencyManagement>

之后子工程便可以省略<version>的配置

接下来,我们就可以将 tlias-utils 模块中单独配置的依赖,将其版本统一交给 tlias-parent 进行统一管理。

复制代码
<!--统一管理依赖版本-->
<dependencyManagement>
    <dependencies>
        <!--阿里云OSS-->
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.15.1</version>
        </dependency>

        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
        <!-- no more than 2.3.3-->
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.3</version>
        </dependency>

        <!--JWT-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>
    </dependencies>
</dependencyManagement>

同样的删除子工程的版本标签

3.属性配置

我们也可以通过自定义属性及属性引用的形式,在父工程中将依赖的版本号进行集中管理维护。 具体语法为:

1). 自定义属性

复制代码
<properties>
    <lombok.version>1.18.30</lombok.version>
</properties>

2). 引用属性

复制代码
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>${lombok.version}</version>
</dependency>

面试题:<dependencyManagement><dependencies> 的区别是什么?

  • <dependencies> 是直接依赖,在父工程配置了依赖,子工程会直接继承下来。

  • <dependencyManagement> 是统一管理依赖版本,不会直接依赖,还需要在子工程中引入所需依赖(无需指定版本)

聚合<modules>

  • **聚合:**将多个模块组织成一个整体,同时进行项目的构建。

  • 聚合工程: 一个不具有业务功能的"空"工程(有且仅有一个pom文件) 【PS:一般来说,继承关系中的父工程与聚合关系中的聚合工程是同一个

  • **作用:**快速构建项目(无需根据依赖关系手动构建,直接在聚合工程上构建即可)

这里我们直接在父工程配置<modules>标签即可

复制代码
<modules>
    <module>../tilas-pojo</module>
    <module>../tilas-utils</module>
    <module>../tilas-web-management</module>
</modules>

继承与聚合对比

  • 作用

    • 聚合用于快速构建项目

    • 继承用于简化依赖配置、统一管理依赖

  • 相同点:

    • 聚合与继承的pom.xml文件打包方式均为pom,通常将两种关系制作到同一个pom文件中

    • 聚合与继承均属于设计型模块,并无实际的模块内容

  • 不同点:

    • 聚合是在聚合工程中配置关系,聚合可以感知到参与聚合的模块有哪些

    • 继承是在子模块中配置关系,父模块无法感知哪些子模块继承了自己

私服

1.介绍

  • **私服:**是一种特殊的远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的中央仓库,用于解决团队内部的资源共享与资源同步问题。

  • 依赖查找顺序:

    • 本地仓库

    • 私服仓库

    • 中央仓库

  • **注意事项:**私服在企业项目开发中,一个项目/公司,只需要一台即可(无需我们自己搭建,会使用即可)。

2.资源上传与下载

资源上传与下载,我们需要做三步配置,执行一条指令。

第一步配置:在maven的配置文件中配置访问私服仓库的用户名、密码。

第二步配置:在项目的pom.xml文件中配置上传到私服的仓库(url地址),该配置其实也支持配在setting.xml中

第三步配置:在maven的配置文件中配置私服从公共仓库拉回来的依赖存放的仓库(url地址)。

配置好了上述三步之后,要上传资源到私服仓库,就执行maven生命周期:deploy。

简单来说就是在pom文件中配置上传的私服仓库地址,在maven的文件中进行配置私服用户名和密码以及下载的地址

私服仓库说明:

  • RELEASE:存储自己开发的RELEASE发布版本的资源。

  • SNAPSHOT:存储自己开发的SNAPSHOT发布版本的资源。

  • Central:存储的是从中央仓库下载下来的依赖。

项目版本说明:

  • RELEASE(发布版本):功能趋于稳定、当前更新停止,可以用于发行的版本,存储在私服中的RELEASE仓库中。

  • SNAPSHOT(快照版本):功能不稳定、尚处于开发中的版本,即快照版本,存储在私服的SNAPSHOT仓库中。

具体操作

1.设置私服的访问用户名/密码(在自己maven安装目录下的conf/settings.xml中的servers中配置)

<server>

<id>maven-releases</id>

<username>admin</username>

<password>admin</password>

</server>

<server>

<id>maven-snapshots</id>

<username>admin</username>

<password>admin</password>

</server>

<!--如果不涉及到下载的,可以不配置这个-->

<server>

<id>maven-public</id>

<username>admin</username>

<password>admin</password>

</server>

2.设置从公共仓库拉回来的依赖存放的仓库((在自己maven安装目录下的conf/settings.xml中的mirrors、profiles中配置)

mirrors配置

<mirror>

<id>maven-public</id>

<mirrorOf>*</mirrorOf>

<url>http://localhost:8081/repository/maven-public /</url>

</mirror>

profiles配置

<profile>

<id>allow-snapshots</id>

<activation>

<activeByDefault>true</activeByDefault>

</activation>

<repositories>

<repository>

<id>maven-public</id>

<url>http://localhost:8081/repository/maven-public/ </url>

<releases>

<enabled>true</enabled>

</releases>

<snapshots>
<enabled>true</enabled>
</snapshots>

</repository>

</repositories>

</profile>

3.IDEA的maven工程的pom文件中配置上传(发布)地址(直接在tlias-parent中配置发布地址)

<distributionManagement>

<!-- release版本的发布地址 -->

<repository>

<id>maven-releases</id>

<url>http://localhost:8081/repository/maven-releases/\</url>

</repository>

<!-- snapshot版本的发布地址 -->

<snapshotRepository>

<id>maven-snapshots</id>

<url>http://localhost:8081/repository/maven-snapshots/\</url>

</snapshotRepository>

</distributionManagement>

配置完成之后,我们就可以在tlias-parent中执行deploy生命周期,将项目发布到私服仓库中。

中央仓库的包:私服会缓存到自己的代理仓库(如 maven-central),同时也会下载到你电脑的本地仓库

公司自己的包:私服存到 release/snapshot 仓库,也可能会下载到本地仓库

两者都会到本地,但私服里也都会有一份(自己的包在 release/snapshot,中央的包在代理仓库)。

相关推荐
zhaokuangkuang_10 小时前
Java学习
java·学习·算法
暗冰ཏོ11 小时前
《Vue + React + Java + PHP 项目部署到服务器完整指南》
java·服务器·vue.js·react.js·项目部署
_Aaron___11 小时前
Spring AI 2.0 之后,MCP Server 该按远程企业服务来设计
java·人工智能·spring
NE_STOP11 小时前
Docker--Docker简介及系统架构
java
Daydream.V11 小时前
C++ 入门全攻略:从基础语法到核心特性
java·开发语言·c++
我是一颗柠檬11 小时前
【JDK8新特性】接口默认方法与静态方法Day8
java·开发语言·后端·intellij-idea
lulu121654407811 小时前
【开发者指南】Gemini 3.5开发入门:从API调用到Agent构建
java·开发语言·人工智能·python·ai编程
SimonKing11 小时前
从单机到高并发:手搓唯一编号的生成方案
java·后端·程序员
阿维的博客日记11 小时前
罗列一下常见幂等操作
java
ma_king11 小时前
后端开发者工程实践指南
java·后端