Maven详解

Maven是一款跨平台的项目管理工具,隶属于Apache基金会,主要用于Java项目的构建、依赖管理和信息管理。本文详细介绍了Maven的配置文件setting.xml,仓库管理,生命周期和插件的使用,以及依赖调解等核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

maven

maven是一个跨平台的项目管理的工具。隶属于Apache下的一个开源项目。主要服务于Java平台的项目构建、依赖管理、项目信息管理等。

0、前言

在开发java项目的时候,项目编译、测试、运行、打包等等都有着极高的成本,跨部门甚至跨人员之间的项目结构都有可能不一样,除此之外跨部门甚至跨人员之间的项目结构都有可能不一样,这使得成本加倍。maven就是为了解决这些问题的,在跨平台(Linux、Windows、Mac)的基础上,使用Archetype完成各种项目统一的骨架,还进行标准化的构建过程,包含了包版本管理、库依赖、集成测试、编译、安装、运行等。
接下来,将分别认识和学习setting.xml、仓库、生命周期、插件等模块。(注:本文所有的路径都是在Mac下面的,其他平台类似)

1、setting.xml

setting.xml 是maven的管理配置文件,包含了系统级别的配置和当前用户级别的配置,用户级别的路径是~/.m2,系统级别的是M2HOME/conf,当然了M2_HOME/conf,当然了M2HOME/confM2_HOME是在安装的时候设置好的maven路径,我们一般使用的是用户级别的文件。
该文件可以配置仓库、代理、profile、镜像、插件等,更多更详细的配置setting.xml

<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
                          https://maven.apache.org/xsd/settings-1.0.0.xsd">
      <localRepository/>
      <interactiveMode/>
      <usePluginRegistry/>
      <offline/>
      <pluginGroups/>
      <servers/>
      <mirrors/>
      <proxies/>
      <profiles/>
      <activeProfiles/>
</settings>

localRepository

本地仓库地址,默认情况下,下载到本地的代码库存放在${user.home}/.m2/repository文件夹中的,用户如果想存在放其他地方,配置该属性即可

interactiveMode

用户交互模式,默认为true

usePluginRegistry

是否使用插件仓库、默认为false、如果需要使用,则需要在当前路径下创建plugin-registry.xml文件并设置为true

offline

是否在离线状态下运行,如果系统需要在离线状态下运行,则设置为true,默认为false

pluginGroups

插件组,当插件的groupId没有显式提供时,供搜寻插件(groupId)的列表

  <pluginGroups>
    <pluginGroup>org.mortbay.jetty</pluginGroup>
  </pluginGroups>

入上述代码,包含了org.mortbay.jetty 的插件,例如,当我们需要执行该插件的run目标时,可以执行org.mortbay.jetty:jetty-maven-plugin:run,又或者可以简化成mvn jetty:run,关于为何会简化成如此,到插件的部分细说。

servers

服务配置,主要是针对需要鉴权的仓库的配置,有些仓库默认匿名用户可以访问,但是可能存在一些私服需要对用户进行鉴权,有相关权限的用户才可以继续访问或者操作。

server001 my_login my_password ${user.home}/.ssh/id_dsa some_passphrase 664 775

mirrors

镜像地址,对仓库地址的一种映射关系,国外的仓库地址可能不是很稳定,类似于AliBaBa和OSchina搭建的镜像地址,我们可以配置镜像地址,使得访问速度更快

  <mirrors>
    <mirror>
      <id>planetmirror.com</id>   <!-- 镜像ID,唯一性即可-->
      <name>PlanetMirror Australia</name>   <!-- 镜像名字 -->
      <url>http://downloads.planetmirror.com/pub/maven2</url>  <!-- 镜像地址 -->
      <mirrorOf>central</mirrorOf>  <!-- 映射的具体仓库ID以及其操作-->
    </mirror>
  </mirrors>

没有镜像的时候
需要直连A仓库,如果A仓库在国外可能存在各种问题不稳定工作

有镜像的时候
这时候存在一个B镜像,可以间接的访问到国外不稳定的A仓库,那我们就可以去加入B镜像就可以了。

需要注意下mirrorOf,这个参数有多种配置,而且是针对仓库ID过滤的

  • 表示所有
    external:* = 所有不在本地、不适用file://协议的
    repo,repo1 = repo和repo1仓库
    *,!repo1 = 所有的仓库,除了repo1

更多细节可看官方文档===>Guide to Mirror Settings

-proxies

代理,主要是为了便于在各自网络环境下使用

<proxies>
    <proxy>
      <id>myproxy</id>   <!-- 代理ID,唯一性即可-->
      <active>true</active> <!-- 是否激活,激活了就可以使用该代理-->
      <protocol>http</protocol>
      <host>proxy.somewhere.com</host>
      <port>8080</port> <!-- 协议、主机、端口-->
      <username>proxyuser</username>
      <password>somepassword</password>
      <nonProxyHosts>*.google.com|ibiblio.org</nonProxyHosts>  <!-- 不代理的主机,中间用竖划线区分-->
    </proxy>
</proxies>

profiles 和 activeProfiles

profile,拥有多套环境,可以根据参数任意切换,如需使用需要在activeProfiles中加入该profile的ID。
包含了activation, repositories, pluginRepositories和properties四种元素,其中activation就类似于properties,就和一个KV对一般,剩下的就是仓库和插件了

Repositories

仓库的配置,其中包含了快照版本SNAPSHOT和发布版本RELEASE

<repositories>
  <repository>
    <id>codehausSnapshots</id> <!-- 仓库ID 需唯一 -->
    <name>Codehaus Snapshots</name>  <!-- 仓库名称 -->
    <releases>   <!-- 正式版本一-->
      <enabled>false</enabled>    <!-- 是否可正常使用 -->
      <updatePolicy>always</updatePolicy> <!-- 更新策略 -->
      <checksumPolicy>warn</checksumPolicy> <!-- 校验策略,分为ignore、fail、warn -->
    </releases>
    <snapshots>
      <enabled>true</enabled>
      <updatePolicy>never</updatePolicy>
      <checksumPolicy>fail</checksumPolicy>
    </snapshots>
    <url>http://snapshots.maven.codehaus.org/maven2</url> 
    <!-- 仓库地址,按protocol://hostname/path形式 -->
    <layout>default</layout> <!-- -->
  </repository>
</repositories>

如上代码,需要注意 updatePolicy 更新策略,主要是如下几种值

always 总是更新
daily 每天更新一次(默认值)
interval:X X分钟更新一次
never 永远都不更新

2、仓库

什么叫仓库呢?顾名思义就是存放物品的地方,在Java项目中肯定就是存放了各种各样的jar包,避免了每开发一个项目都要导入各种各样的jar包,全部统一存放在仓库中,使用的时候只需要在POM中声明所需要的包的GroupId和artifactId,在使用的时候会自动关联相关jar包。如下图是仓库的分类图

刚刚安装maven之后,是没有本地仓库的,必须得有一个可用的远程仓库,这样才可以把需要的构建下载到本地来的

私服是一种特殊的远程仓库,搭建在局域网内的仓库,私服代理广域网的仓库,提供给局域网内的用户使用,可用减少局域网内的用户同外界仓库的传输,每一个jar包只需要拉取一次就可以提供给局域网内所有的用户使用,并且也更加稳定

减少网络带宽流量
加速Maven构建
部署第三方构件
提高稳定性、增强控制
降低中央仓库的负载

部署到远程仓库
上面所说的仓库和我们现在说的远程仓库是同一种东西,只是一个是推送到远程,另一个是拉取到本地使用。
部署到远程仓库,需要在各自项目的POM文件中部署好distributionManagement元素,例如如下代码

<distributionManagement>
   <repository>
       <id>deployment</id>
       <name>internal repository for releases</name>
       <url>http://test.com/nexus/releases/</url>
   </repository>
   <snapshotRepository>
       <id>deployment</id>
       <name>internal repository for snapshots</name>
       <url>http://test.com/nexus/snapshots/</url>
   </snapshotRepository>
</distributionManagement>

配置中包含了release和snapshot两种版本模式,前者表示稳定版本,一般情况下提供给别人活着发布到生产环境的都是该版本,snapshot快照版本则是处于开发模式。而且如果当前项目是快照版本则部署到快照仓库,否则就部署到发布仓库。
在部署到远程仓库需要用户认证的时候,就需要设置在setting.xml的service元素了,在service中的ID必须和仓库的ID保持一致。

部署是通过maven-deploy-plugin的deploy功能完成部署操作的,插件到后面细说。

3、坐标和依赖

maven的坐标预定了世界上任何一个构建的位置,只需要约定好正确的坐标,就可以正确的找到所需的构建,坐标元素包括groupId,artifactId, version等。

坐标详解

groupId (必选)定义当前maven项目隶属的实际项目
artifactId (必选)实际项目中的一个maven模块
version (必选)版本号
packaging (可选)打包方式,常用的分为jar和war包,插件则是maven-plugin,默认为jar包
classifier (不可直接定义)帮助定义构建出的一些附属构建,例如source和对应的doc
依赖配置

依赖配置是在pom文件中的配置的元素,在dependencies中的,可以包含一个或者多个dependency元素,每个依赖包含如下元素

groupId、artifactId、version 依赖的基础坐标,最重要的
type 依赖的类型,对应到坐标的packaging,默认情况下不必声明,其值为jar
scope 依赖的范围,不同的依赖会使用不同的classpath
compile 编译依赖的范围,没有指定则默认使用该范围
test 测试,只对测试的classpath有效
provided 已提供依赖范围,在编译和测试时有效,但是在运行时无效
runtime 运行时的依赖范围
system 系统依赖范围,和本机系统绑定
import 导入依赖范围

optional 依赖是否为可选,确认依赖是否被继承
exclusions 排除传递性依赖

依赖调解

传递性依赖机制能够大大的简化依赖声明,而且大部分情况下我们只需要关心项目的直接依赖是什么,而不用考虑这些直接依赖会引入什么传递性依赖,但是当出现冲突了,则需要很清楚依赖性依赖是从什么依赖路径引入的。

例如A项目有这样的依赖关系A->B->C->X(1.0),A->B->X(2.0),那么哪个X版本会被引用呢?
第一原则:最短路径优先,上述例子中会使用X2.0版本,但是这并不能解决所有的问题,例如又有如下的依赖关系A->B->D(1.0),A->B->D(2.0),使用最短路径则出现的了不确定性
第二原则:第一声明者优先,这个例子中,如果D1.0版本在pom中更加靠前,则会使用D1.0版本

可选依赖

确认依赖是否被继承,如下图所示,如果B有optional元素的依赖则表示该元素是可选依赖,从A出发的依赖传递性就被打破了,A无法依赖X,Y了,一般情况下,也不怎么使用该情况

依赖查看

依赖可以通过dependency插件查看更多信息,例如mvn dependency:tree查看最后的依赖结果

dependency:list 展示所有的依赖情况
dependency:tree 树形结构展示依赖情况
dependency:analyze 分析依赖树

4、生命周期和插件

软件开发的整个过程也是有生命周期的,开发、编译、测试以及部署,而maven的生命周期就是为了所有对象构建过程进行的抽象和统一。maven的生命周期包含了项目的清理、初始化、编译、测试、打包以及集成测试,和最后的验证和部署操作。maven的生命周期本身是抽象的,不参与任何具体的工作,只是调用各种插件完成所需的任务。例如常见的插件有

maven-compiler-plugin 编译使用的插件
maven-surefire-plugin 测试使用的插件
maven-deploy-plugin 部署使用的插件

生命周期

maven包含三大类相互独立的生命周期,具体的一个生命周期包含了多个阶段,在使用如下操作的时候,背后都会映射到各个插件的目标上

包含的三大类生命周期是

  • clean 生命周期
    pre-clean 清理项目前的准备工作
    clean 清理之前构建所生成的文件
    post-clean 执行一些清理完之后的事情

  • default 生命周期
    validate
    initialize
    generate-sources
    process-sources
    generate-resources
    process-resources
    compile 编译项目的代码输出到clasapath文件夹
    process-classes
    generate-test-sources
    process-test-sources
    generate-test-resources
    process-test-resources
    test-compile 编译项目的测试代码,输出到测试的classpath文件夹
    process-test-classes
    test 使用测试单元框架运行测试代码
    prepare-package
    package
    pre-integration-test
    integration-test
    post-integration-test
    verify
    install 安装到本地仓库
    deploy 部署到远程仓库

  • site 生命周期
    pre-site 执行生成项目站点文件前处理一些事情
    site 生成项目站点文件
    post-site 执行生成项目站点文件后处理一些事情
    site-deploy 部署站点文件到服务器

常用命令行操作

mvn clean 真正执行的是clean的pre和clean阶段
mvn test 真正执行的是default中直到test阶段的全过程
mvn clean install 真正执行的是clean直到clean阶段以及default的到install阶段的全过程
mvn clean deploy 真正执行的是clean直到clean阶段以及default的deploy阶段全过程
在进行操作的时候,如果出现了版本冲突等情况,可以加上参数 “-U” 或者 “–update-snapshots”,其意思是Forces a check for missing releases and updated snapshots on remote repositories

插件绑定

上文已经说了,生命周期最后执行任务是由插件完成的,而且插件的目标goal和生命周期的阶段phase是绑定的,接下来就介绍下这两者的关系

插件是以独立的构建完成的,并不存放在maven的核心包中,在使用的时候下载到本地即可,而且为了能够复用代码,能够完成多个任务,因此一个插件存放了多个功能,每一个功能都是一个目标,想查看具体插件的具体目标,可使用

mvn help:description -Dplugin=groupId:archetypeId:version -Ddetail,查看插件的详情内容,其中包含了插件目标,而且包含到了绑定到生命周期的阶段。

这个就是maven-help-description 插件,例如mvn help:description -Dplugin=org.apache.maven.plugins:maven-compile-plugin:3.1 -Ddetail
还可继续简化为mvn help:description -Dplugin=compile -Ddetail
org.apache.maven 是属于系统默认的,使用插件的目标前缀compile就可以找到所需的具体插件了
其中detail参数是获取该插件的详细信息

插件目标前缀
mvn clean 其实就是使用了插件前缀,具体本地可查看~/.m2/repository/org/apache/maven/plugins/maven-metadata-central.xml内容

插件配置
插件配置主要是给插件传递运行参数和修改插件映射到生命周期的阶段,主要有如下操作

命令行配置
例如在编译、安装的时候需要跳过测试,则可以使用 mvn install -Dmaven.test.skil=true 其中-D参数是java自带的,此功能是通过命令行设置一个java属性

POM全局配置

配置在项目的pom文件中的,整个项目都是通用的插件,例如下面的配置,就是给整个项目配置的java版本,以及跳过执行测试功能

<plugins>
  <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.1</version>
      <configuration>
          <source>${java_source_version}</source>
          <target>${java_target_version}</target>
          <encoding>${file_encoding}</encoding>
      </configuration>
  </plugin>
  <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <configuration>
          <skipTests>true</skipTests>
      </configuration>
  </plugin>
</plugins>

POM任务配置
和全局配置相对应,是对某个具体插件的参数设置,可以设置参数,也可以重新绑定生命周期的阶段phase

<think>嗯,用户让我介绍一下XML语法和Maven详解。首先,我需要确认用户的需求。他们可能刚开始学习Java或者项目构建工具,所以需要基础的知识。XMLMaven通常在Java项目中一起使用,用户可能是在学习如何配置Maven项目时遇到了XML文件,比如pom.xml。因此,用户需要了解XML的基本结构,以便能够理解和编辑Maven的配置文件。 接下来,我得考虑如何组织信息。用户可能希望分开两部分,先XMLMaven,但也要说明它们之间的联系。XML部分需要涵盖基本语法,比如标签、元素、属性、嵌套规则等,可能还要提到常见的错误和验证。Maven部分则需要解释它的作用、核心概念如POM、生命周期、依赖管理、插件和仓库。同时,要举例说明pom.xml的结构,这样用户能更直观地理解。 另外,用户可能不知道Maven为什么要用XML,所以需要指出XML的结构化特性适合做配置,而Maven利用这一点来管理项目。还要注意用户的潜在需求,比如他们可能想通过例子学习如何配置依赖或插件,或者解决常见的构建问题,所以提供简单的示例会有帮助。 需要避免使用过于专业的术语,保持解释简单明了。例如,在解释Maven生命周期时,用阶段(phase)和目标(goal)的区别,可能需要用类比或步骤来说明。同时,提醒用户常见的注意事项,比如依赖冲突,或者如何添加仓库,这些是实际使用中容易遇到的问题。 最后,总结部分要强调两者的结合,确保用户明白XMLMaven配置中的作用,以及掌握这些知识对项目管理的帮助。可能还需要考虑用户下一步的学习方向,比如推荐学习Maven命令或高级配置,但根据问题范围,暂时不需要扩展,保持回答的针对性。</think>好的!以下是对 **XML 语法**和 **Maven** 的详细介绍,内容分为两部分,便于理解。 --- ### 一、XML 语法详解 **XML(eXtensible Markup Language)** 是一种标记语言,用于存储和传输结构化数据。它的核心特点是可扩展性(标签可自定义)和自描述性。 #### 1. 基本语法规则 - **声明**:XML 文件通常以声明开头,定义版本和编码: ```xml <?xml version="1.0" encoding="UTF-8"?> ``` - **根元素**:必须有且仅有一个根元素,所有其他元素嵌套在根元素内。 ```xml <root> <!-- 其他内容 --> </root> ``` - **标签**: - 标签区分大小写,必须闭合(成对或自闭合)。 - 成对标签:`<tag>内容</tag>` - 自闭合标签:`<tag />` - **属性**:属性值必须用引号包裹: ```xml <person id="001" role="admin">Tom</person> ``` - **注释**:`<!-- 注释内容 -->` - **特殊字符**:需转义,如 `<` → `<`、`>` → `>`。 #### 2. XML 示例 ```xml <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book category="IT"> <title>Java Programming</title> <author>John Doe</author> <price>49.99</price> </book> <book category="Fiction"> <title>XML for Beginners</title> <author>Jane Smith</author> <price>29.99</price> </book> </bookstore> ``` #### 3. XML 用途 - 配置文件(如 Maven 的 `pom.xml`、Spring 的配置)。 - 数据交换格式(如 SOAP、RSS)。 - 结构化数据存储。 --- ### 二、Maven 详解 **Maven** 是 Apache 的开源构建工具,主要用于 Java 项目管理。其核心功能包括: - **依赖管理**(自动下载库文件) - **构建生命周期**(编译、测试、打包等) - **项目标准化**(目录结构、配置约定) #### 1. Maven 核心概念 - **POM(Project Object Model)**: - 项目配置的核心文件是 `pom.xml`,定义了项目信息、依赖、插件等。 - 示例 `pom.xml` 结构: ```xml <?xml version="1.0" encoding="UTF-8"?> <project> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>my-project</artifactId> <version>1.0.0</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> </project> ``` - **坐标(Coordinates)**: - 通过 `groupId`(组织标识)、`artifactId`(项目标识)、`version` 唯一标识一个依赖。 - **仓库(Repository)**: - **本地仓库**:本地机器上的依赖缓存(默认在 `~/.m2/repository`)。 - **中央仓库**:Maven 官方维护的公共仓库([search.maven.org](https://search.maven.org/))。 - **私有仓库**:公司内部搭建的仓库(如 Nexus、Artifactory)。 - **生命周期(Lifecycle)**: - 默认生命周期包含多个阶段(phase),如: - `compile`(编译) - `test`(运行测试) - `package`(打包为 JAR/WAR) - `install`(安装到本地仓库) - `deploy`(部署到远程仓库) - **插件(Plugins)**: - 通过插件执行任务,例如 `maven-compiler-plugin` 用于编译代码。 #### 2. Maven 常用命令 ```bash mvn clean # 清理 target 目录 mvn compile # 编译代码 mvn test # 运行测试 mvn package # 打包项目 mvn install # 安装到本地仓库 mvn deploy # 部署到远程仓库 ``` #### 3. Maven 目录结构 Maven 使用约定优于配置,标准目录结构如下: ``` my-project/ ├── src/ │ ├── main/ │ │ ├── java/ # Java 源代码 │ │ └── resources/ # 配置文件 │ └── test/ │ ├── java/ # 测试代码 │ └── resources/ └── pom.xml ``` --- ### 三、XMLMaven 的关系 - Maven 使用 XML 格式的 `pom.xml` 文件描述项目配置。 - XML 的结构化特性非常适合定义复杂的依赖关系和构建流程。 --- ### 四、注意事项 1. **XML 格式必须严格正确**(如标签闭合、属性引号)。 2. **Maven 依赖冲突**:可通过 `<exclusions>` 排除冲突依赖。 3. **镜像仓库配置**:修改 `settings.xml` 加速依赖下载。 希望以上内容能帮助你理解 XMLMaven!如果需要进一步示例或细节,请随时告诉我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值