Maven

一.Maven

Maven (内行;专家;管理)

介绍:

Apache 组织中的一个成功的开源项目
Maven 主要服务于基于 java 平台的项目构建,依赖管理和项目信息管理。

适用范围:

    既适用于小型开源项目又适用于大型企业开发
    瀑布式开发,敏捷开发,Maven 都能大显身手

二.项目构建

项目构建 ==> 编译,运行单元测试,生成文档,打包和部署

为了节省时间 和 步骤 将其用软件自动化生成

三.项目构建工具

Ant 构建
简介:

    最早的构建工具,基于 IDE 2000年左右出现

优点:

    对工程构建过程中的过程控制特别好

缺点:

    它的 XML 脚本编写格式让 XML 文件特别大

Maven【JAVA】

    项目对象模型,通过其描述信息来管理项目的构建,报告和文档的软件项目管理工具。它填补了 Ant 缺点,Maven 第一次支持了从网络上下载的功能,仍然采用 xml 作为配置文件格式。Maven 专注的是依赖管理,使用 Java 编写。

Gradle

    属于结合以上两个的优点,它继承了 Ant 的灵活和 Maven 的生命周期管理,它最后被 google 作为了 Android 御用管理工具。它最大的区别是不用 XML 作为配置文件格式,采用了 DSL 格式,使得脚本更加简洁。

当前市场

    目前市面上 Ant 比较老, 所以一般是一些比较传统的软件企业公司使用, Maven使用 Java 编写, 是当下大多数互联网公司会使用的一个构建工具, 中文文档也比较齐全,
    gradle 是用 groovy 编写, 目前比较新型的构建工具一些初创互联网公司会使用, 以后会有很大的使用空间.

四.Maven 四大特性

依赖管理系统多模块构建一致的项目结构一致的构建模型和插件机制

I.依赖管理系统(jar 项目的多模块)

    引入了一个新的依赖管理系统 jar 包管理, jar 升级时修改配置文件即可。
    用 groupId、artifactId、version 组成的Coordination(坐标)
唯一标识一个依赖。任何基于 Maven 构建的项目自身也必须定义
这三项属性,生成的包可以是 Jar 包,也可以是 war 包或者 jar 包。

一个典型的依赖示例:

<dependency>
	 <groupId>javax.servlet</groupId> com.baidu
	 <artifactId>javax.servlet-api</artifactId> ueditor echarts
	 <version>3.1.0</version>
</dependency>
坐标属性的理解

Maven 坐标为各种组件引入了秩序,任何一个组件都必须明确定义自己的坐标。

groupId

    定义当前 Maven 项目隶属的实际项目-公司名称。(jar 包所在仓库路径)由于 Maven中模块的概念,因此一个实际项目往往会被划分为很多模块。 比如 spring 是一个实际项目,其对应的 Maven 模块会有很多,如 spring-core,spring-webmvc 等。

artifactId

该元素定义实际项目中的一个 Maven 模块-项目名, 推荐的做法是使用实际项目名称作为 artifactId 的前缀。 比如: spring-bean, spring-webmvc 等。

version

该元素定义 Maven 项目当前所处的版本。

II. 多模块构建

    项目复查时 dao service controller 层分离将一个项目分解为多个模块已经是很通用的一种方式。在 Maven 中需要定义一个 parent POM 作为一组 module 的聚合 POM。在该 POM 中可以使用 <modules>标签来定义一组子模块。parent POM 不会有什么实际构建产出。而 parent POM 中的 build 配置以及依赖配置都会自动继承给子 module。

III. 一致的项目结构(不同的 IDE 项目结构是一致)

Ant 时代大家创建 Java 项目目录时比较随意,然后通过 Ant 配置指定哪些属于
source,那些属于 testSource 等。而 Maven 在设计之初的理念就是 Conversion over configuration(约定大于配置)。其制定了一套项目目录结构作为标准的 Java 项目结构,解决不同 ide 带来的文件目录不一致问题。

IV. 一致的构建模型和插件机制(通过 pom 配置 tomcat、jetty 插件)
<plugin>
	<groupId>org.mortbay.jetty</groupId>
	<artifactId>maven-jetty-plugin</artifactId>
	<version>6.1.25</version>
	<configuration>
		<scanIntervalSeconds>10</scanIntervalSeconds>
		<contextPath>/test</contextPath>
 	</configuration>
</plugin>

五、Maven 安装与配置

I. 检查 jdk 的安装

jdk 1.7 及以上

II. 下载 maven

https://maven.apache.org/download.cgi

官网下载

一般下载zip文件 无需安装 解压到指定目录
在这里插入图片描述

III. 配置 maven 环境变量

可以直接配置path也可以配MAVEN_HOME

配置path文件
解压后把 Maven 的根目录配置到系统环境变量中 MAVEN_HOME,将 bin 目录配置到 path 变量(注:maven 解压后存放的目录不要包含中文和空格)

类似jdk的path文件配置 路径如上图所示

我的电脑 ==> 右键 属性系统 高级系统设置 环境变量
在这里插入图片描述
在这里插入图片描述

一路确定…

IV. 检测 maven 是否安装成功 mvn -v

在命令提示符中输入(注意要在管理员模式 (右键进入管理员模式))
mvn -v

显示类似如下文字
在这里插入图片描述
成功

六、认识 maven 目录结构

MAVEN项目创建流程
创建根目录
在这里插入图片描述

I. 创建一个文件夹作为项目的根目录中,创建一个 pom.xml 文件内容如下
Maven 文件夹构造:★

在这里插入图片描述

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/maven-v4_0_0.xsd">
<!-- 声明项目描述符遵循哪一个 POM 模型版本。 -->
<modelVersion>4.0.0</modelVersion>
<!-- 项目的全球唯一标识符,通常使用全限定的包名区分该项目和其他项目。 -->
 <groupId>com.xxx</groupId>
<!-- 构件的标识符,它和 group ID 一起唯一标识一个构件。 -->
 <artifactId>hello</artifactId>
<!-- 项目当前版本,格式为:主版本.次版本.增量版本-限定版本号 -->
 <version>1.0.0</version>
<!-- 项目的名称, Maven 产生的文档用 -->
 <name>test</name>
<!--项目引入插件所需要的额外依赖--> 
<dependencies>
 <dependency>
 <groupId>junit</groupId>
 <artifactId>junit</artifactId>
 <version>4.12</version>
 <scope>test</scope>
 </dependency>
 </dependencies>
</project>

Ps:标签定义解释

根目录下的第一个子元素ModelVersion指定当前Pom模型的版本,对应Maven3来说,它只能是4.0.0,指定了当前模型的版本号,对于Maven2和Maven3来说,它只能是4.0.0

groupId定义了项目属于哪个组,这个组往往和项目所在的组织和公司存在关联。
比如: com.xxx

artifactId定义了当前Maven项目在组中唯一的ID。

Version x.x.x-里程碑
	比如: 1.0.0-SNAPSHOT
	第一个x 大版本 有重大变革
	第二个x 小版本 修复bug,增加功能
	第三个x 更新

里程碑版本:
	SNAPSHOT (快照,开发版)
	alpha (内部测试)
	beta (公开测试)
	Release | RC (发布版)
	GA (正常版本)
	 
使用name标签声明一个对于用户更为友好的项目名称,虽然不是必须的,但还是推荐为每个Pom声明name,以方便信息交流。

pom.xml
在这里插入图片描述

在这里插入图片描述

复制文件到pom.xml
(以后都会自动生成)
在这里插入图片描述

Using platform encoding (GBK actually) to copy filtered resources报错的解决方案
在报警告项目的pom.xml 的 <project></project>当中加入

<properties>
	<project.build.sourceEncoding>
		UTF-8
	</project.build.sourceEncoding>
</properties>
II.编写主函数
package com.xxx.demo;

public class Hello {
	public static void main(String[] args) {
		System.out.println("hello maven");
	}
}
III.cmd 下编译并运行

cmd 下面,进入项目的根目录
在这里插入图片描述

1. 编译 java 文件

mvn compile
在这里插入图片描述

2. 执行 main 方法

mvn exec:java -Dexec.mainClass="com.xxx.demo.Hello"
执行方法
在这里插入图片描述
在这里插入图片描述

BUILD SUCCESS 视为成功

特别注意:
1、 第一次下载会比较慢,要修改 maven 解压之后的 conf 目录下的 settings.xml。
因为资源都是国外路径

1.1.修改默认仓库位置
打开 maven 目录 -> conf -> setting.xml
在这里插入图片描述

添加仓库位置配置

<localRepository>D:/File/m2/repository</localRepository>

注:仓库位置改为自己本机的指定目录,/不要写反

1.2.更换阿里镜像,加快依赖下载

<mirror> 
	<id>nexus-aliyun</id> 
	<mirrorOf>central</mirrorOf> 
	<name>Nexus aliyun</name> 
	<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

2、编译不成功的几种情况

2.1 不是使用管理员模式权限执行dos命令
2.2 JDK环境配置有问题,重装JDK
2.3 代码编写时,类里面没设置包名(如果编译时类没加包名,执行时也不需要加包名)

七、eclipse 下 Maven 环境配置

eclipse 默认情况下已经集成了 maven 插件,但对于 maven 的环境我们这里还需要进行相应的环境配置。

I. 修改 maven 版本

操作步骤:Window → Preferences → Maven
选择 Installations → Add,添加 maven,勾选新添加的 maven 版本

eclipse → window → Preferences → Maven → Installations → add
在这里插入图片描述
在这里插入图片描述
我自己的位置示例:
在这里插入图片描述

II. 修改 settings.xml 配置文件地址

选择 User Settings,修改 maven 的配置文件的位置
在这里插入图片描述

III. 建立 maven 项目

左侧空白右键,选择 New → Project → 搜索 Maven,选择 Maven Project
在这里插入图片描述
使用默认的工作空间,然后 Next,选择 Maven 项目的模板
在这里插入图片描述

在这里插入图片描述
添加 Artifact Id
在这里插入图片描述

Maven 项目建立后,需要修改 maven 项目相关环境
a) .修改 jre 环境为 1.8(安装 1.8 的调整到 1.8)
1、设置jre环境

选择项目,右键选择 Build Path–>Configure Build Path,设置 jre 的环境
在这里插入图片描述

2、修改 Java 编译的等级,与当前环境中的 jre 环境一致

在这里插入图片描述

3、启动项目

选中项目 run as → maven build
在这里插入图片描述
设置对应的命令在这里插入图片描述
自己位置示例:
在这里插入图片描述

执行成功
在这里插入图片描述

如果第一次执行该命令报错时,添加 jre 运行环境添加 maven 环境参数
在这里插入图片描述
环境调整
在这里插入图片描述

b).修改 web 环境 (web 项目需要设置)

新建一个web项目
在这里插入图片描述

修改 java 1.5-> 1.8(具体步骤如上)
修改 domnamic web module 2.3 到 3.0
项目右击选择 Properties,选择 Project Facets
在这里插入图片描述
eclipse 不能直接修改 Web 版本,可直接在配置文件(工作空间的 settings)中修改:
在这里插入图片描述
修改完后刷新即可。
III. 添加 web 项目部署插件(jetty/tomcat)
a、jetty 插件配置
即是修改pom.xml中的build标签,无需再配置服务器

<build>
	<finalName>maven02</finalName>
	<plugins>
		<plugin>
			<groupId>org.mortbay.jetty</groupId>
			<artifactId>maven-jetty-plugin</artifactId>
			<version>6.1.25</version>
			<configuration>
				<!-- 热部署,每 10 秒扫描一次 -->
				<scanIntervalSeconds>10</scanIntervalSeconds>
				<contextPath>/test</contextPath> <!-- 可指定当前项目的站点名 -->
				<connectors>
					<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
						<port>9090</port> <!-- 设置启动的端口号 -->
					</connector>
				</connectors>
			</configuration>
		</plugin>
	</plugins>
</build>

启动项目
选中项目 run as -->maven build
在这里插入图片描述
输入命令 jetty:run
在这里插入图片描述
在这里插入图片描述

启动 jetty 服务器,也可以直接输入命令 jetty:run -D jetty.port=9090启动服务
浏览器访问
在这里插入图片描述
也可以使用Tomcat
添加修改pom.xml中build标签的plugins中的plugin

<plugin>
 <groupId>org.apache.tomcat.maven</groupId>
 <artifactId>tomcat7-maven-plugin</artifactId>
 <version>2.1</version>
 <configuration>
 <!-- <port>8081</port> -->
 <path>/test</path>
 <uriEncoding>UTF-8</uriEncoding>
 <finalName>test </finalName>
 <server>tomcat7</server>
 </configuration>
</plugin>

启动项目
选中项目 run as -->maven build… -->goals,输入命令 tomcat7:run
在这里插入图片描述
在这里插入图片描述
此时run as就有多个选项了
在这里插入图片描述

注:Maven 依赖仓库:
https://mvnrepository.com/


八、Maven 仓库的基本概念

    当第一次运行 Maven 命令的时候, 你需要 Internet 链接, 因为它需要从网上下载一些文件。 那么它从哪里下载呢? 它是从 Maven 默认的远程库下载的。 这个远程仓库由Maven 的核心插件和可供下载的 jar 文件。
    对于 Maven 来说, 仓库只分为两类: 本地仓库远程仓库
    当 Maven 根据坐标寻找构件的时候,它首先会查看本地仓库,如果本地仓库存在,则直接使用; 如果本地没有,Maven 就会去远程仓库查找,发现需要的构件之后,下载到本地仓库再使用。 如果本地仓库和远程仓库都没有,Maven 就会报错。

远程仓库分为三种: 中央仓库 ,私服, 其他公共库。

    中央仓库是默认配置下,Maven 下载 jar 包的地方。
    私服是另一种特殊的远程仓库,为了节省带宽和时间,应该在局域网内架设一个私有的仓库服务器,用其代理所有外部的远程仓库。 内部的项目还能部署到私服上供其他项目使用。

    一般来说,在 Maven 项目目录下,没有诸如 lib/这样用来存放依赖文件的目录。 当Maven 在执行编译或测试时,如果需要使用依赖文件,它总是基于坐标使用本地仓库的依赖文件。
默认情况下,每个用户在自己的用户目录下都有一个路径名为.m2/repository/的仓库目录。 有时候,因为某些原因(比如 c 盘空间不足),需要修改本地仓库目录地址。
    对于仓库路径的修改,可以通过 maven 配置文件 config 目录下 settings.xml 来
指定仓库路径

<settings>
	<localRepository>D:/file/m2/repository</localRepository>
</settings>
I 中央仓库

    由于原始的本地仓库是空的,maven 必须知道至少一个可用的远程仓库,才能执行maven 命令的时候下载到需要的构件。中央仓库就是这样一个默认的远程仓库。
    maven-model-builder-3.3.9.jar maven 自动的 jar 中 包含了一个 超级 POM。定义了默认中央仓库的位置。中央仓库包含了 2000 多个开源项目,接收每天 1 亿次以上的访问。

II 私服

    私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务, 私服代理广域网上的远程仓库,供局域网内的 maven 用户使用。 当 maven 需要下载构件时, 它去私服当中找,
如果私服没有, 则从外部远程仓库下载,并缓存在私服上, 再为 maven 提供。
    此外,一些无法从外部仓库下载的构件也能从本地上传到私服提供局域网中其他人使用
    配置方式项目 pom.xml 配置

<repositories>
 <repository>
 <snapshots>
 <enabled>true</enabled>
 </snapshots>
 <id>public</id>
  <name>Public Repositories</name>
 <url>http://192.168.0.96:8081/content/groups/public/</url>
 </repository>
 <repository>
 <id>getui-nexus</id>
 
<url>http://mvn.gt.igexin.com/nexus/content/repositories/releases/</url>
 </repository>
</repositories>

公司内部应该建立私服:

  1. 节省自己的外网带宽
  2. 加速 maven 构建
  3. 部署第三方控件
  4. 提高稳定性

降低中央仓库的负荷
常用阿里云 maven 仓库配置:

<mirror> 
	<id>nexus-aliyun</id> 
	<mirrorOf>central</mirrorOf> 
	<name>Nexus aliyun</name> 
	<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

九、Maven 环境下多模块项目构建

暂无

十、maven 项目打包操作

    对于企业级项目,无论是进行本地测试,还是测试环境测试以及最终的项目上线,都会涉及项目的打包操作,对于每个环境下项目打包时,对应的项目所有要的配置资源就会有所区别,实现打包的方式有很多种,可以通过 ant,获取通过 idea 自带的打包功能实现项目打包,但当项目很大并且需要的外界配置很多时,此时打包的配置就会异常复杂,对于maven 项目,我们可以用过 pom.xml 配置的方式来实现打包时的环境选择,相比较其他形式打包工具,通过 maven 只需要通过简单的配置,就可以轻松完成不同环境先项目的整体打包。

准备

新建一个web maven 项目 maven03
在这里插入图片描述
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>com.xxx</groupId>
  <artifactId>maven03</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>maven03 Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>
    <finalName>maven03</finalName>
  </build>
</project>

在main中创建一个资源文件夹 接着创建一个properties文件
在这里插入图片描述
点击package即可打包

1.创建配置文件(这里是3份)

正确示例:
在这里插入图片描述
不好的示例:
在这里插入图片描述
也就是每个层面都修改配置文件,这样容易出错

2.指定配置环境

修改添加 pom.xml 如下:

下述代码添加到project标签中

<!-- 打包环境配置 开发环境 测试环境 正式环境 -->
<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <env>dev</env>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>test</id>
        <properties>
            <env>test</env>
        </properties>
    </profile>
    <profile>
        <id>product</id>
        <properties>
            <env>product</env>
        </properties>
    </profile>
</profiles>

在这里插入图片描述

3添加变量配置

通过变量决定使用哪个配置文件

对于项目资源文件的配置放在pom.xml的 build标签中

<resources>
	<resource>
		<directory>src/main/resources/${env}</directory>
	</resource>
	<resource>
		<directory>src/main/java</directory>
		<includes>
			<include>**/*.xml</include>
			<include>**/*.properties</include>
			<include>**/*.tld</include>
		</includes>
		<filtering>false</filtering>
	</resource>
</resources>

此时对应打包命令
选中项目,右键 run as -maven builde ----输入命令

clean compile package -Dmaven.test.skip=true打包默认环境(开发环境)并且跳过 maven 测试操作

clean compile package -Ptest -Dmaven.test.skip=true打包测试环境并且跳过 maven 测试操作

clean compile package -Pproduct -Dmaven.test.skip=true打包生产环境并且跳过 maven 测试操作

示例:
在这里插入图片描述
在此位置进入或者右键项目run as → maven build
在这里插入图片描述
用好压查看war包内容
在这里插入图片描述

在这里插入图片描述
接着打test的包
先删除war包
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
经测试,可以使用不同的打包命令 获取不同的配置文件


十一、Maven 依赖的基本概念

I 依赖的基本配置

    根元素 project 下的 dependencies 可以包含多个 dependence 元素,以声明多
个依赖。每个依赖都应该包含以下元素:

1. groupId, artifactId, version : 依赖的基本坐标

    对于任何一个依赖来说,基本坐标是最重要的, Maven 根据坐标才能找到需要的依赖。

2. Type:

    依赖的类型,大部分情况下不需要声明。 默认值为 jar

3. Scope: 依赖范围(compile,test,provided,runtime,system)

    compile: 编译依赖范围。如果没有指定,就会默认使用该依赖范围。使用此依赖范围的 Maven 依赖,对于编译、测试、运行三种 classpath 都有效。

    test: 测试依赖范围。使用此依赖范围的 Maven 依赖,只对于测试
classpath 有效,在编译主代码或者运行项目的使用时将无法使用此类依赖。
典型的例子就是 JUnit,它只有在编译测试代码及运行测试的时候才需要。

    provided: 已提供依赖范围。使用此依赖范围的 Maven 依赖,对于编译和测试 classpath 有效,但在运行时无效。典型的例子是 servlet-api,编译和测试项目的时候需要该依赖,但在运行项目的时候,由于容器已经提供, 就不需要 Maven 重复地引入一遍(如:servlet-api)。

    runtime: 运行时依赖范围。使用此依赖范围的 Maven 依赖,对于测试和运行 classpath 有效,但在编译主代码时无效。典型的例子是 JDBC 驱动实现,项目主代码的编译只需要 JDK 提供的 JDBC 接口,只有在执行测试或者运 行项目的时候才需要实现上述接口的具体 JDBC 驱动。

    system: 系统依赖范围。该依赖与三种 classpath 的关系,和 provided依赖范围完全一致。但是,使用 system 范围依赖时必须通过 systemPath元素显式地指定依赖文件的路径。由于此类依赖不是通过 Maven 仓库解析 的,而且往往与本机系统绑定,可能造成构建的不可移植,因此应该谨慎使用。

4. Optional:标记依赖是否可选
5. Exclusions: 用来排除传递性依赖。
II 依赖范围

    首先需要知道,Maven 在编译项目主代码的时候需要使用一套 classpath。 比如:编译项目代码的时候需要用到 spring-core, 该文件以 依赖的方式被引入到classpath 中。 其次, Maven 在执行测试的时候会使 用另外一套 classpath。 如:junit。

    最后在实际运行项目时,又会使用一套 classpath, spring-core 需要在 该classpath 中,而 junit 不需要。

    那么依赖范围就是用来控制依赖与这三种 classpath(编译 classpath,测 试

    classpath,运行时 classpath)的关系, Maven 有以下几种依赖范围:

1. Compile 编译依赖范围。

    如果没有指定,就会默认使用该依赖范围。 使用此依赖范围的 Maven 依赖, 对于编译,测试,运行都有效。

2. Test: 测试依赖范围。

只在测试的时候需要。比如 junit

3. Provided: 已提供依赖范围。

    使用此依赖范围的 Maven 依赖,对于编译和测试有效,但在运行时无效。典型的例子是 servlet-API, 编译和测试项目的需要,但在运行项目时, 由于容器已经提供, 就不需要 Maven 重复地引入一遍。

4. Runtime: 运行时依赖范围。

    使用此依赖范围的 Maven 依赖,对于测试和运行有效,但在编译代码时无效。 典型的例子是:jdbc 驱动程序, 项目主代码的编译只需要 jdk 提供的 jdbc 接口,只有在执行测试或者运行项目的时候才需要实现上述接口的具体 jdbc 驱动。

5. System: 系统依赖范围。

     一般不使用。

III 传递性依赖

    传递依赖机制, 让我们在使用某个 jar 的时候就不用去考虑它依赖了什么。也不用担心引入多余的依赖。 Maven 会解析各个直接依赖的 POM,将那些必要的间接依赖,以传递性依赖的形式引入到当前项目中。

注意: 传递依赖有可能产生冲突!!
冲突场景:
    A → B → C (2.0)
    A → E → C (1.0)
    如果 A 下同时存在两个不同 version 的 C,冲突!!(选取同时适合 A、B 的版本)

<dependencies> 
	 <dependency> 
	 	<groupId>A</groupId> 
	 	<artifactId>A</artifactId> 
		 <version>xxx</version> 
	 	<exclusions> 
	 		<exclusion> 
	 			<groupId>C</groupId> 
	 			<artifactId>C</artifactId> 
	 		</exclusion> 
	 	</exclusions> 
	 </dependency> 
	 <dependency> 
	 	<groupId>B</groupId> 
	 	<artifactId>B</artifactId> 
	 </dependency> 
</dependencies>

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐