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

相关推荐
编啊编程啊程8 小时前
【011】宠物共享平台
spring boot·log4j·maven·dubbo·宠物
少妇的美梦1 天前
Maven Profile 教程
后端·maven
天庭鸡腿哥1 天前
可能最后一个版本,作者不更新了!
eclipse·maven·lua·visual studio
Xzh04232 天前
前后端学习的交界
java·ajax·maven·axios·测试
寒山李白2 天前
关于Java项目构建/配置工具方式(Gradle-Groovy、Gradle-Kotlin、Maven)的区别于选择
java·kotlin·gradle·maven
譕痕3 天前
Idea 启动报 未找到有效的 Maven 安装问题
java·maven·intellij-idea
JH30733 天前
IDEA自带的Maven安装位置
java·maven·intellij-idea
这是一个懒人3 天前
mac maven 安装
java·macos·maven
[猫玖]3 天前
Maven入门到放弃
maven
番茄Salad5 天前
Spring Boot项目中Maven引入依赖常见报错问题解决
spring boot·后端·maven