Maven常用知识总结

Maven常用知识总结

IDE集成开发环境对Maven进行了封装. 极度简化,只要很少了解Maven即可. 最近需要将tony/RuoYi-flowable迁移到Spring Boot 3, 系统学习了Maven,对常用内容进行了简单总结.

本篇主要讲解注意事项, 操作上存在部分步骤缺失.

Maven 安装与配置

windows mvn安装与配置

Maven 依赖于Java 环境, 注意配置JAVA_HOME 系统环境变量.

同时添加系统环境变量MAVEN_HOME指向maven安装路径.

对仓库进行配置

D:\Maven\mvn3.8.1\conf\settings.xml 配置本地仓库位置和阿里云镜像

复制代码
  <localRepository>D:/Maven/repo</localRepository>
...
     <mirror>
       <id>aliyun</id>
       <name>Aliyun Maven</name>
       <url>https://maven.aliyun.com/repository/public</url>
       <mirrorOf>central</mirrorOf>
     </mirror>

配置创建项目、模块的默认语言级别为17

复制代码
  <profiles>

    <profile>
	  <id>development</id>
      <activation>
        <jdk>17</jdk>
		<activeByDefault>true</activeByDefault>
      </activation>

	  <properties>
	  <maven.compiler.source>17</maven.compiler.source>
	  <maven.compiler.target>17</maven.compiler.target>
	  <maven.compiler.compilerVersion>17</maven.compiler.compilerVersion>
	  </properties>
	  
    </profile>

手动修改还会进行警告: 模块'untitled3'从Maven导入。对其配置做出的任何更改在重新导入后可能丢失。

IntelliJ IDEA 配置

IntelliJ IDEA 配置系统maven

File ->Setting->Build Execution Deployment -> BuildTools -> Maven

ps. 不能彻底修改, 每次创建项目都要设置一次.

不配置阿里云,可能会出现如下连接超时的问题.

复制代码
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.14.1 failed to transfer from https://repo.maven.apache.org/maven2 during a previous attempt. This failure was cached in the local repository and resolution is not reattempted until the update interval of central has elapsed or updates are forced. Original error: Could not transfer artifact com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.14.1 from/to central (https://repo.maven.apache.org/maven2): Connect to repo.maven.apache.org:443 [repo.maven.apache.org/151.101.88.215] failed: Connect timed out

Intellij IDEA Maven使用

从左到右依次为: 同步项目 执行命令 分析依赖关系 显示图

最左侧 图标 同步项目, 中间为执行mvn命令 右侧为 查看模块依赖关系

同步项目: 由于网络异常关闭等造成maven依赖没有下载完整, 点击该按钮实现重新下载

执行mvn命令: 弹出框 进行mvn命令的选择或输入

分析依赖关系

切换模块, 查看不同模块的依赖情况.

显示图

IntelliJ IDEA 不能运行项目常见问题

使用 IDEA导入maven项目后不能运行, 主要是jdk配置问题.

文件 -> 项目结构 修改项目\模块\平台SDK jdk版本


文件 -> 设置 -> 构建 执行 部署 -> 编译器 -> Java编译器 修改项目和模块字节码版本

pom.xml 常用标签讲解

parent

复制代码
    <parent>
        <artifactId>ruoyi</artifactId>
        <groupId>com.ruoyi</groupId>
        <version>3.8.9</version>
    </parent>

通过parent 子项目共享父项目pom.xml配置.

groupId artifactId version

复制代码
<dependency>
        <groupId>com.github.jsqlparser</groupId>
        <artifactId>jsqlparser</artifactId>
        <version>4.5</version>
    </dependency>

groupId(组标识符)通常采用 反向域名规则(类似 Java 包命名)

artifactId(项目标识符)标识项目的唯一名称,通常是项目或模块的简短名称

version(版本号)

三者合起来称为依赖坐标.

dependency

复制代码
    <dependencies>
        <!-- SpringBoot Web容器 -->
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

dependency 自动管理其需要的依赖

properties

复制代码
    <properties>
        <java.version>17</java.version>
        <spring-boot.version>3.3.5</spring-boot.version>
    </properties>

指定工程的版本配置信息,除了可以手动引用外, 也存在父pom自动引入.

plugin

复制代码
<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>17</source>
                    <target>17</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.songlili.hellospringboot2m.Hellospringboot2mApplication</mainClass>
                    <skip>true</skip>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

扩展和定制Maven构建过程.

maven-compiler-plugin:指定 Java 编译版本为 17,编码为 UTF-8。

spring-boot-maven-plugin:配置 Spring Boot 打包插件,指定主类为 Hellospringboot2mApplication,跳过打包并执行 repackage 目标。

packaging

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

jar\war:指定打包形式

pom: 表示这是一个 Maven 项目对象模型(POM)文件,用于定义项目依赖、构建配置等信息

dependencyManagement

复制代码
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.github.jsqlparser</groupId>
                <artifactId>jsqlparser</artifactId>
                <version>4.5</version> 
            </dependency>
    </dependencyManagement>

定义在顶层项目中, 对整个项目进行版本统一管理. 子pom 引入依赖时, 不需要指定版本.

子pom.xml

复制代码
  <dependencies>
            <dependency>
                <groupId>com.github.jsqlparser</groupId>
                <artifactId>jsqlparser</artifactId>
            </dependency>
  </dependencies>

当然, 子模块需要其他版本, 可以自定义version.

如果父 POM 直接在 (非 )中声明 jarA,则所有子模块会强制继承该依赖和版本. 子模块无法覆盖版本,除非使用 排除父依赖后重新声明。

ps: 如果dependencyManagement.dependencies 添加依赖莫名报错, 可以尝试 将dependency在(非 )进行声明并进行Maven同步. 然后再去掉.

scope

dependencies.dependency 添加scope. scope默认值为compile.

scope 编译阶段 测试阶段 运行阶段
compile 可用 可用 可用
provided 可用 可用
runtime 可用
test 可用

optional

dependencies.dependency.optional 指定依赖是否可以传递

moduleA

复制代码
            <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
                <version>2.8.9</version>
                <optional>true</optional>
            </dependency>

moduleB

复制代码
        <dependency>
            <groupId>com.ruoyi</groupId>
            <artifactId>moduleA</artifactId>
        </dependency>

moduleB 依赖 moduleA, 不能获取 gson 依赖. new Gson() 提示无法导入.

moduleC

复制代码
  <parent>
        <artifactId>moduleA</artifactId>
        <groupId>com.ruoyi</groupId>
        <version>3.8.9</version>
    </parent>

moduleC new Gson() 就可以实现对Gson导入.

exclusion

复制代码
            <!-- Swagger3依赖 -->
           <dependency>
               <groupId>io.springfox</groupId>
               <artifactId>springfox-boot-starter</artifactId>
               <version>${swagger.version}</version>
               <exclusions>
                   <exclusion>
                       <groupId>io.swagger</groupId>
                       <artifactId>swagger-models</artifactId>
                   </exclusion>
               </exclusions>
           </dependency>

引入 springfox-boot-starter,用于支持 Swagger3 接口文档的自动生成;

排除 io.swagger:swagger-models,避免版本冲突或使用自定义版本。

mvn 常用命令

复制代码
mvn clean   # 清理生成的target.
mvn compile  # 将源代码编译成可执行文件 .class
mvn test     #  执行 test
mvn install  #  打包后安装到本地仓库.  
mvn clean package  # 清理变红重新打包
mvn dependency:tree  #  查看依赖树
mvn dependency:list  #  查看依赖列表

test编写

test 添加依赖

复制代码
<dependencies>
    <dependency>
        <groupId>name.remal.tools.test</groupId>
        <artifactId>junit5</artifactId>
        <version>1.26.147</version>
    </dependency>
</dependencies>

test 命名规范

复制代码
    测试类名: **/Test*.java (如 TestUserService.java)

    测试类名: **/*Test.java (如 UserServiceTest.java)

    测试类名: **/*Tests.java (如 UserServiceTests.java)

    测试类名: **/*TestCase.java (如 UserServiceTestCase.java)

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

public class UserServiceTest {
    @Test
    public void testUserCreation() {
        assertTrue(true, "示例测试");
    }
}

常用maven插件

maven-javadoc-plugin

复制代码
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-javadoc-plugin</artifactId>
                <version>3.4.1</version>
            </plugin>
        </plugins>
    </build>

mvn javadoc:javadoc 即可生成api说明.

maven-compiler-plugin

复制代码
 <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                    <compilerArgs>
                        <arg>-parameters</arg>
                    </compilerArgs>
                </configuration>
            </plugin>
        </plugins>
    </build>

使用 maven-compiler-plugin 插件编译 Java 代码

maven-war-plugin maven-jar-plugin

复制代码
<plugin>   
                <groupId>org.apache.maven.plugins</groupId>   
                <artifactId>maven-war-plugin</artifactId>   
                <version>3.1.0</version>   
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <warName>${project.artifactId}</warName>
                </configuration>   
           </plugin>   

配合 jar , 这两个仅仅需要写一个即可. 设置war插件, 就将默认打包打包方式设置为jar. 反之, 设置jar插件, 就将默认打包方式设置为war.

mvn jar:jar

mvn war:war

多模块项目演示

  1. 使用idea 新建一个普通的mvn项目, 删除生成的src目录

  2. 在其内部新建->模块 module-api
    外层pom.xml 新增 modules

    复制代码
     <modules>
         <module>module-api</module>
     </modules>

外层模块通过 dependencyManagement 标签管理,进行依赖版本的统一管理.

module-api pom.xml

复制代码
    <parent>
        <groupId>com.songlili</groupId>
        <artifactId>multimodulesapp</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

在根目录或 module-api 执行 mvn clean package 都可以实现 module-api打包.

  1. 新增spring web 模块 module-web, 添加对module-api的依赖

    复制代码
    <dependency>
             <groupId>com.samunlisa</groupId>
             <artifactId>module-api</artifactId>
             <version>1.0-SNAPSHOT</version>
         </dependency>

新创建的module-web, 默认不作为子module存在需要进行手动调整. 删除groupId, 添加parent标签

复制代码
    <parent>
        <groupId>com.songlili</groupId>
        <artifactId>multimodulesapp</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

ps: 发生ide提示代码报错, 却又可以运行. 可以通过 文件 -> 使缓存生效 试一下.

Maven多模块优势

多模块项目是指一个大型项目被划分为多个独立的子模块或子项目,并且这些子模块之间存在一定的依赖关系。每个子模块可以单独进行开发、构建和部署,同时也可以作为整个项目的一部分进行集成。

将大型项目分解为独立的子模块. 使得项目结构更清晰,各个模块的职责和功能划分更明确,便于开发人员理解和维护.

依赖问题不能处理时, 通过 mvn dependency:tree将生成的文档保存起来丢给deepseek进行分析.

  1. 父模块通过modules添加子模块的依赖,使他们可以作为整体的一部分进行构建和部署.
  2. 将通用配置放到父模块中, 避免在每个子模块中重复配置相同的内容.
  3. 通过父模块dependencyManagment, 确保所有子模块使用相同的版本, 确保依赖一致性和版本兼容性.
  4. 将项目拆分为各个模块,不同模块由不同团队开发,提高项目开发效率与速度.
  5. 通过将公共代码或库模块化,可以在多个子模块中共享和重用代码,减少代码冗余,提高开发效率。

参考内容

【立零说】Maven 基础 入门教程 安装与配置 项目管理...

若依 前后端分离版 升级到SpringBoot3 教程

maven项目(创建跟导入)设置默认Language level JDK

相关推荐
蓝染yy1 小时前
Maven
java·maven
ZC1111K10 小时前
maven(配置)
java·maven
@zcc@10 小时前
Maven 依赖管理
maven
老马啸西风12 小时前
windows docker-02-docker 最常用的命令汇总
linux·运维·ubuntu·docker·容器·eureka·maven
设计师小聂!12 小时前
尚庭公寓--------登陆流程介绍以及功能代码
java·spring boot·maven·mybatis·idea
rockmelodies14 小时前
使用IntelliJ IDEA和Maven搭建SpringBoot集成Fastjson项目
spring boot·maven·intellij-idea
巴拉巴巴巴拉20 小时前
Maven 配置文件核心配置:本地仓库、镜像与 JDK 版本
java·开发语言·maven
设计师小聂!1 天前
尚庭公寓-----day2 业务功能实现
java·spring boot·spring·maven·mybatis
巴拉巴巴巴拉2 天前
IDEA 中 Maven 配置:当前项目与新项目的统一设置方法
java·maven·intellij-idea