Maven使用教程

Maven使用教程

Maven 是一个项目管理与构建自动化工具。它的主要功能有:

  • 依赖管理:Maven 能帮助我们解决软件包依赖的管理问题,不再需要提交大量的 jar 包、引入第三方库;
  • 规范目录结构:Maven 标准的目录结构有助于项目构建的标准化,通过配置 profile 还可以根据不同的环境(开发环境、测试环境,生产环境)读取不同的配置文件;
  • 方便集成:能够集成在 IDE 中更方便使用。

1.安装Maven

  • 进入官网 Downloading Apache Maven 下载 Maven 压缩包,并解压。

    image-20250508155827036

  • 设置环境变量。

    • 在「环境变量」->「系统变量」->「新建」,创建 M2_HOME 变量。

      image-20250508160833848

    • 在「环境变量」->「系统变量」->「path」->「编辑」->「新建」,粘贴 %M2_HOME%\bin

  • 打开命令行窗口,输入 mvn -version,如果看到 Maven 的版本信息,则表示配置成功。

    image-20250508161043696

2.Maven项目结构

一个使用 Maven 管理的普通的 Java 项目,它的目录结构默认如下:

a-maven-project
├── pom.xml
├── src
│ ├── main
│ │ ├── java
│ │ └── resources
│ └── test
│ ├── java
│ └── resources
└── target

项目的根目录a-maven-project是项目名,它有一个项目描述文件pom.xml,存放Java源码的目录是src/main/java,存放资源文件的目录是src/main/resources,存放测试源码的目录是src/test/java,存放测试资源的目录是src/test/resources,最后,所有编译、打包生成的文件都放在target目录里。这些就是一个Maven项目的标准目录结构。

note:所有的目录结构都是约定好的标准结构,千万不要随意修改目录结构。使用标准结构不需要做任何配置,Maven就可以正常使用。

3.理解pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <groupId>org.example</groupId>
    <artifactId>MavenDemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    
    <name>MavenDemo</name>
</project>
  • 第一行是 XML 头,指定了该 xml 文档的版本和编码方式。
  • project 是根元素,声明了一些 POM 相关的命名空间及 xsd 元素。
  • modelVersion 指定了当前 POM 的版本,对于 Maven 3 来说,值只能是 4.0.0
  • groupId 定义了项目属于哪个组织,通常是公司或组织名称。
  • artifactId 定义了项目在组织中的唯一ID,类似于Java的类名,通常是项目名称。
  • version 指定了项目当前的版本,SNAPSHOT意为快照,说明该项目还处于开发中。
  • name 声明了一个对于用户更为友好的项目名称。

一个 Maven 工程就是由 groupIdartifactId version 作为唯一标识。在引用其他第三方库的时候,也是通过这 3 个变量确定。例如,依赖 redis.clients

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>8.0.0</version>
</dependency>

使用<dependency>声明一个依赖后,Maven就会自动下载这个依赖包并把它放到classpath中。


另外,<properties> 定义了一些属性,常用的属性有:

<properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
    <maven.compiler.release>8</maven.compiler.release>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
  • project.build.sourceEncoding:表示项目源码的字符编码,通常应设定为UTF-8
  • maven.compiler.release:表示使用的JDK版本,例如21
  • maven.compiler.source:表示Java编译器读取的源码版本;
  • maven.compiler.target:表示Java编译器编译的Class版本。

通过 <properties> 定义的属性,就可以固定JDK版本,防止同一个项目的不同的开发者各自使用不同版本的JDK。

4.详解依赖的属性

<project>
...
<dependencies>
    <dependency>
        <groupId>实际项目</groupId>
     <artifactId>模块</artifactId>
     <version>版本</version>
     <type>依赖类型</type>
     <scope>依赖范围</scope>
     <optional>依赖是否可选</optional>
     <!—主要用于排除传递性依赖-->
     <exclusions>
         <exclusion>
           <groupId></groupId>
          <artifactId></artifactId>
       </exclusion>
     </exclusions>
  </dependency>
<dependencies>
...
</project>
  • dependencies 可以包含一个或者多个 dependency 元素,以声明一个或者多个项目依赖。
  • grounpId、artifactId和version 组成了依赖的基本坐标。
  • type 指定了依赖的类型,默认为 jar
  • scope 指定了依赖的范围。
  • optional 标记了依赖是否是可选的。
  • exclusions 用来排除传递性依赖。

4.1 依赖范围

Maven定义了几种依赖关系,分别是compiletestruntimeprovided

scope说明示例
compile编译时需要用到该jar包(默认)commons-logging
test编译Test时需要用到该jar包junit
runtime编译时不需要,但运行时需要用到mysql
provided编译时需要用到,但运行时由JDK或某个服务器提供servlet-api
  • 默认的 compile 是最常用的,Maven会把这种类型的依赖直接放入classpath。

  • test 依赖表示仅在测试时使用,正常运行时并不需要。最常用的test依赖就是 JUnit:

    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.3.2</version>
        <scope>test</scope>
    </dependency>
    
  • runtime 依赖表示编译时不需要,但运行时需要。最典型的 runtime 依赖是 JDBC 驱动,例如MySQL驱动:

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.48</version>
        <scope>runtime</scope>
    </dependency>
    
  • provided 依赖表示编译时需要,但运行时不需要。最典型的 provided 依赖是 Servlet API ,编译的时候需要,但是运行时,Servlet服务器内置了相关的jar,所以运行期不需要:

    <dependency>
        <groupId>jakarta.servlet</groupId>
        <artifactId>jakarta.servlet-api</artifactId>
        <version>4.0.0</version>
        <scope>provided</scope>
    </dependency>
    

4.2 依赖可选

传递性依赖:当一个项目(模块、库等)依赖于另一个项目,而被依赖的项目又依赖于其他项目时,这些间接的依赖关系就被称为传递性依赖。也就是说,若项目 A 依赖项目 B,项目 B 又依赖项目 C,那么项目 C 就是项目 A 的传递性依赖。

image-20250508172904861

项目中 A 依赖 B,B 依赖于 X 和 Y,如果所有这三个的范围都是 compile 的话,那么 X 和 Y 就是 A 的 compile 范围的传递性依赖,但是如果想 X、Y 不作为 A 的传递性依赖,不给它用的话,可以按照下面的方式配置可选依赖:

<project>  
    <modelVersion>4.0.0</modelVersion>  
    <groupId>org.example</groupId>
    <artifactId>Learn</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>  
        <dependency>  
            <groupId>mysql</groupId>  
            <artifactId>mysql-connector-java</artifactId>  
            <version>5.1.10</version>  
            <optional>true</optional>  
        </dependency>  
        <dependency>  
            <groupId>postgresql</groupId>  
            <artifactId>postgresql</groupId>  
            <version>8.4-701.jdbc3</version>  
            <optional>true</optional>  
        </dependency>  
    </dependencies>  
</project>

4.3 依赖排除

有时候引入的依赖中包含你不想要的依赖包,你想引入自己想要的,这时候就要用到依赖排除了,比如 spring-boot-starter-web 自带了 logback 这个日志包,我们想引入 log4j2 的,所以先排除掉 logback 的依赖包,再引入想要的包就可以了。

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
	<version>2.5.6</version>
	<exclusions>
		<exclusion>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-logging</artifactId>
		</exclusion>
	</exclusions>
</dependency>
<!-- 使用 log4j2 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-log4j2</artifactId>
	<version>2.5.6</version>
</dependency>

5.Maven仓库

image-20250508175813723

  • 本地仓库:是 Maven 在本地计算机上存储构件的地方。当 Maven 从远程仓库下载构件时,会先将其存储在本地仓库,以便下次使用时直接从本地获取,加快构建速度。默认情况下,本地仓库位于用户目录下的 .m2/repository 目录中。
  • 远程仓库:位于网络上的服务器,用于存储各种构件。当本地仓库中没有所需的构件时,Maven 会从远程仓库下载。远程仓库可以分为以下几种:
    • 中央仓库:由 Maven 社区维护的公共仓库,包含了大量的流行开源项目的构件。Maven 默认会从中央仓库下载构件,其地址是 https://repo.maven.apache.org/maven2/
    • 私服:是在企业内部搭建的私有 Maven 仓库。它可以代理远程仓库,缓存常用的构件,减少对外部网络的依赖,提高构建速度,同时也可以用于存储企业内部的私有构件。
    • 第三方仓库:除了中央仓库和私服之外的其他远程仓库。一些开源项目可能会有自己的独立仓库,或者企业可能会使用一些特定的商业仓库,这些都属于第三方仓库。在使用第三方仓库时,需要在 Maven 项目的配置中明确指定仓库的地址。

5.1 自定义本地仓库地址

  • 找到 settings.xml 文件

    • 在 Maven 安装目录下的 conf 文件夹里,会有一个名为 settings.xml 的文件,这是全局的配置文件。
    • 也可以在用户目录(例如 Windows 系统下的 C:\Users\用户名\.m2)下创建或修改 settings.xml 文件,这个文件的配置会覆盖全局配置。
  • 编辑 settings.xml 文件

    打开 settings.xml 文件,找到 <localRepository> 标签。把标签内的值修改为期望的本地仓库目录地址。

    <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
        <!-- 自定义本地仓库地址 -->
        <localRepository>D:/maven/repo</localRepository>
        <!-- 其他配置 -->
    </settings>
    

5.2 Maven镜像设置

如果访问 Maven 的中央仓库非常慢,我们可以选择一个速度较快的 Maven 的镜像仓库。

在用户主目录下进入.m2目录,创建或打开 settings.xml 文件,在 <mirrors></mirrors> 标签中添加 mirror 子节点:

<mirror>
  <id>aliyunmaven</id>
  <mirrorOf>central</mirrorOf>
  <name>阿里云公共仓库</name>
  <url>https://maven.aliyun.com/repository/public</url>
</mirror>

其他镜像地址:

华为云:https://repo.huaweicloud.com/repository/maven/

清华大学:https://repo.maven.apache.org/maven2/

中科院:http://maven.opencas.cn/maven/

5.3 搜索第三方组件

如果我们要引用一个第三方组件,比如 gson,如何确切地获得它的 groupIdartifactIdversion?方法是通过提供仓库搜索服务的网站搜索关键字,找到对应的组件后,直接复制相应的信息。这里推荐 3 个提供仓库搜索服务的网站:

image-20250508183739629

6.Maven常见命令

  • mvn clean:表示运行清理操作(会默认把target文件夹中的数据清理)。
  • mvn clean compile:表示先运行清理之后运行编译,会将代码编译到target文件夹中。
  • mvn clean test:运行清理和测试。
  • mvn clean package:运行清理和打包。
  • mvn clean install:运行清理和安装,会将打好的包安装到本地仓库中,以便其他的项目可以调用。
  • mvn clean deploy:运行清理和发布(发布到私服上面)。
  • mvn help:effective-settings:查看 Maven 的有效配置信息。

7.Maven常用POM属性

  • ${project.build.sourceDirectory}:项目的主源码目录,默认为src/main/java/
  • ${project.build.testSourceDirectory}:项目的测试源码目录,默认为 /src/test/java/
  • ${project.build.directory}:项目构建输出目录,默认为 target/
  • ${project.build.outputDirectory}:项目主代码编译输出目录,默认为 target/classes/
  • ${project.build.testOutputDirectory}:项目测试代码编译输出目录,默认为 target/testclasses/
  • ${project.groupId}:项目的 groupId.
  • ${project.artifactId}:项目的 artifactId.
  • ${project.version}:项目的 version,于 ${version} 等价
  • ${project.build.finalName}:项目打包输出文件的名称,默认为${project.artifactId}${project.version}

8.在IDEA中配置Maven

image-20250508184555298

9.mvnw

mvnw 是 Maven Wrapper 的缩写。因为我们安装 Maven 时,默认情况下,系统所有项目都会使用全局安装的这个 Maven 版本。但是,对于某些项目来说,它可能必须使用某个特定的 Maven 版本,这个时候,就可以使用 Maven Wrapper,它可以负责给这个特定的项目安装指定版本的 Maven,而其他项目不受影响。

简单地说,Maven Wrapper就是给一个项目提供一个独立的,指定版本的 Maven 给它使用。

安装Maven Wrapper

安装 Maven Wrapper 最简单的方式是在项目的根目录(即 pom.xml 所在的目录)下运行安装命令:

mvn wrapper:wrapper

它会自动使用最新版本的 Maven。如果要指定使用的 Maven版本,使用下面的安装命令指定版本,例如3.9.0

mvn wrapper:wrapper -Dmaven=3.9.0

安装后,查看项目结构:

my-project
├── .mvn
│ └── wrapper
│ └── maven-wrapper.properties
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src
├── main
│ ├── java
│ └── resources
└── test
├── java
└── resources

发现多了 mvnwmvnw.cmd.mvn 目录,我们只需要把 mvn 命令改成 mvnw 就可以使用跟项目关联的Maven。

10.pom.xml文件示例

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <!-- 模型版本,固定为 4.0.0 -->
    <modelVersion>4.0.0</modelVersion>

    <!-- 组织 ID,通常是公司或组织的域名倒序 -->
    <groupId>com.example</groupId>
    <!-- 项目的唯一标识符 -->
    <artifactId>my-project</artifactId>
    <!-- 项目版本 -->
    <version>1.0.0</version>
    <!-- 项目打包类型,常见的有 jar、war 等,这里是 jar 包 -->
    <packaging>jar</packaging>

    <!-- 项目名称,可自定义 -->
    <name>My Project</name>
    <!-- 项目描述,可简要说明项目用途 -->
    <description>A simple Java project.</description>

    <!-- 项目的 URL,通常是项目的主页地址 -->
    <url>http://example.com</url>

    <!-- 项目依赖 -->
    <dependencies>
        <!-- 示例:添加 JUnit 依赖用于单元测试 -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.8.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>5.8.2</version>
            <scope>test</scope>
        </dependency>
        <!-- 可以添加其他依赖,如 Spring、MyBatis 等 -->
    </dependencies>

    <!-- 构建配置 -->
    <build>
        <sourceDirectory>src/main/java</sourceDirectory>
        <testSourceDirectory>src/test/java</testSourceDirectory>
        <plugins>
            <!-- 编译插件,指定 Java 版本 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

🤗🤗🤗

参考

### 关于 Maven使用教程 #### 下载与安装 Maven 的官方网站提供了详细的下载指导,当前最新的版本为 3.9.9[^1]。访问官方网址可以获取适用于不同操作系统的安装包。 #### 基础概念理解 Maven 不仅仅是一个简单的编译工具;实际上,这是一个旨在提升开发效率并促进良好实践的应用程序构建框架。通过标准化项目结构和流程,Maven 力求简化日常任务的同时也提高了团队协作的质量[^2]。 #### 初始化新项目 创建一个新的 Maven 工程非常简单,只需执行命令 `mvn archetype:generate` 即可在交互式提示下完成基本设置。此过程会引导用户输入必要的参数如组ID、工件ID等信息来初始化POM文件(Project Object Model),它是整个工程配置的核心描述符。 #### 构建生命周期管理 Maven 定义了一系列标准阶段构成完整的构建周期,包括清理(clean)、默认(build) 和站点(site)。这些阶段由特定的目标组成,比如 compile(编译), test (运行单元测试),package (打包成JAR/WAR等形式),install (部署至本地仓库) 或 deploy (上传远程服务器) 等。 #### 依赖关系解析 借助中央存储库中的元数据记录,Maven 能够自动处理第三方库之间的相互依存性问题。当声明了一个外部组件作为依赖项之后,Maven 将负责检索相应的jar 文件及其所需的其他资源,并将其加入classpath 中去。 #### 使用 Maven Wrapper 为了确保跨环境一致性,推荐采用 Maven Wrapper 方案。这允许开发者无需预先全局安装任何版本的 Maven ,而是随同具体应用一起携带指定版本号的包装器脚本(`mvnw`) 及其关联配置文件 (`maven-wrapper.properties`). 这样一来,在任意机器上都能轻松重现相同的构建条件[^3]. ```bash ./mvnw clean install ``` 上述命令展示了如何利用 Maven Wrapper 来触发一次完整的清理加安装动作。 #### 插件机制支持 除了内置的功能外,Maven 生态系统还拥有丰富的插件扩展能力。例如 ProGuard Maven Plugin 就是用来优化 Java 字节码大小并混淆最终产物的安全性的有效手段之一。这类插件往往遵循统一的标准布局方式存放源代码及相关资料[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值