Maven高级

一. 分模块设计与开发

分模块设计的核心是 "高内聚,低耦合"。

  • 高内聚:一个模块只负责一个独立的、明确的职责(如:订单模块只处理所有订单相关业务)。模块内部的代码关联性非常强。
  • 低耦合:模块与模块之间的依赖关系尽可能的简单和清晰。一个模块的变化,应该尽量减少对其他模块的影响。

通过Maven,我们可以轻松地实现这一思想。每个模块都是一个独立的Maven项目,它们通过父子工程和依赖管理有机地组织在一起。

以一个经典的电商平台为例,我们可以将其拆分为以下模块:
将pojo和utils模块分出去

)

在tilas-web-management中的pom.xml中引入pojo,utils模块

java 复制代码
<dependency>
     <groupId>org.example</groupId>
     <artifactId>tlias-pojo</artifactId>
     <version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
     <groupId>org.example</groupId>
     <artifactId>tlias-utils</artifactId>
     <version>1.0-SNAPSHOT</version>
</dependency>

分模块的好处

  • 代码清晰,职责分明:每个开发人员可以专注于自己的模块,易于理解和维护。
  • 并行开发,提升效率:多个模块可以由不同团队并行开发,只需约定好接口即可。
  • 构建加速:Maven支持仅构建更改的模块及其依赖模块(使用 mvn -pl 命令),大大节省构建时间。
  • 极高的复用性:像 core、dao 这样的模块,可以直接被其他新项目引用,避免重复造轮子。
  • 便于单元测试:可以针对单个业务模块进行独立的、深入的测试。

二. 继承

2.1 继承配置

tlias-pojo、tlias-utils、tlias-web-management 中都引入了一个依赖 lombok 的依赖。我们在三个模块中分别配置了一次。

我们可以再创建一个父工程 tlias-parent ,然后让上述的三个模块 tlias-pojo、tlias-utils、tlias-web-management 都来继承这个父工程 。 然后再将各个模块中都共有的依赖,都提取到父工程 tlias-parent中进行配置,只要子工程继承了父工程,依赖它也会继承下来,这样就无需在各个子工程中进行配置了。

将tilas-parent中的pom.xml设置成pom打包方式

Maven打包方式:

  • jar:普通模块打包,springboot项目基本都是jar包(内嵌tomcat运行)
  • war:普通web程序打包,需要部署在外部的tomcat服务器中运行
  • pom:父工程或聚合工程,该模块不写代码,仅进行依赖管理
java 复制代码
<packaging>pom</packaging>

通过parent来配置父工程

java 复制代码
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.8</version>
        <!--   父工程的pom.xml的相对路径  如果不配置就直接从中央仓库调取    -->
        <relativePath/> <!-- lookup parent from repository -->
</parent>

子工程配置 通过relativePath配置父工程的路径

java 复制代码
<parent>
        <groupId>org.example</groupId>
        <artifactId>tlias-parent</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../tilas-parent/pom.xml</relativePath>
</parent>

2.2 版本锁定

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

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

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

这样在子工程中就不需要进行version版本设置了

java 复制代码
<dependencies>
    <!--JWT令牌-->
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
    </dependency>
</dependencies>

注意!!!

  • 在父工程中所配置的 dependencyManagement只能统一管理依赖版本,并不会将这个依赖直接引入进来。 这点和 dependencies 是不同的。
  • 子工程要使用这个依赖,还是需要引入的,只是此时就无需指定 版本号了,父工程统一管理。变更依赖版本,只需在父工程中统一变更。

2.3 自定义属性

java 复制代码
<properties>
    <lombok.version>1.18.34</lombok.version>
</properties>

通过${属性名}引用属性

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

三. 聚合

聚合(Aggregation) 和继承(Inheritance) 是Maven支持分模块设计的两个核心特性,它们目的不同,但又相辅相成。 简单来说,继承是为了统一管理,而聚合是为了统一构建。

聚合工程中通过modules>module来配置聚合

java 复制代码
<!-- 聚合其他模块 -->
<modules>
    <module>你要聚合的模块路径</module>
</modules>

四. 私服

私服是一种特殊的远程仓库,它代理并缓存了位于互联网的公共仓库(如MavenCentral),同时允许企业内部部署自己的私有构件(Jar包)。 你可以把它理解为一个 "架设在公司内网里的Maven中央仓库"。

项目版本说明:

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

4.1 私服下载

下载Nexus私服 help.sonatype.com/en/download...

在D:\XXXXXXXX\bin目录下 cmd运行nexus /run nexus 显示这个就表示开启成功啦!

浏览器输入localhost:8081

私服仓库说明:

  • RELEASE:存储自己开发的RELEASE发布版本的资源。
  • SNAPSHOT:存储自己开发的SNAPSHOT发布版本的资源。
  • Central:存储的是从中央仓库下载下来的依赖

4.2 资源上传与下载

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

javascript 复制代码
<server>
    <id>maven-releases</id>
    <username>admin</username>
    <password>admin</password>
</server>
    
<server>
    <id>maven-snapshots</id>
    <username>admin</username>
    <password>admin</password>
</server>

设置私服依赖下载的仓库组地址(在自己maven安装目录下的conf/settings.xml中的mirrors中配置)

javascript 复制代码
<mirror>
    <id>maven-public</id>
    <mirrorOf>*</mirrorOf>
    <url>http://localhost:8081/repository/maven-public/</url>
</mirror>

设置私服依赖下载的仓库组地址(在自己maven安装目录下的conf/settings.xml中的profiles中配置)

javascript 复制代码
<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>

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

javascript 复制代码
<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>

打开maven控制面板双击deploy

由于当前我们的项目是SNAPSHOT版本,所以jar包是上传到了snapshot仓库中

相关推荐
初听于你6 分钟前
缓存技术揭秘
java·运维·服务器·开发语言·spring·缓存
小蒜学长1 小时前
springboot多功能智能手机阅读APP设计与实现(代码+数据库+LW)
java·spring boot·后端·智能手机
zizisuo4 小时前
解决在使用Lombok时maven install 找不到符号的问题
java·数据库·maven
笨蛋少年派4 小时前
JAVA基础语法
java·开发语言
Haooog4 小时前
654.最大二叉树(二叉树算法)
java·数据结构·算法·leetcode·二叉树
我真的是大笨蛋4 小时前
依赖倒置原则(DIP)
java·设计模式·性能优化·依赖倒置原则·设计规范
东方芷兰5 小时前
JavaWeb 课堂笔记 —— 20 SpringBootWeb案例 配置文件
java·开发语言·笔记·算法·log4j·intellij-idea·lua
Roye_ack5 小时前
【项目实战 Day9】springboot + vue 苍穹外卖系统(用户端订单模块 + 商家端订单管理模块 完结)
java·vue.js·spring boot·后端·mybatis
人间有清欢5 小时前
java数据权限过滤
java·mybatis·权限控制·数据过滤
A阳俊yi5 小时前
Spring——声明式事务
java·数据库·spring