Maven

1. Maven 的概述

['meɪv(ə)n]

Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供构建和依赖管理支持的工具。

https://mvnrepository.com/

  • 使用Maven我们可以享受到一个完全统一规范的 jar 包管理体系

  • Maven使得将每个jar包在本地仓库中保存一份,需要 jar 包的工程只需要维护一个坐标引用依赖即可

1.1 Maven 的构建过程

  • 清理 clean:删除上一次构建的结果,为下一次构建做好准备

  • 编译 compile:Java 源程序编译成 *.class 字节码文件

  • 测试 test:运行提前准备好的测试程序

  • 报告:针对刚才测试的结果生成一个全面的信息

  • 打包 package

    • Java工程:jar包

    • Web工程:war包

  • 安装 install:把一个 Maven 工程经过打包操作生成的 jar 包或 war 包存入 Maven 仓库

  • 部署

    • 部署 jar 包:把一个 jar 包部署到 Nexus 私服服务器上

    • 部署 war 包:借助相关 Maven 插件(例如 cargo),将 war 包部署到 Tomcat 服务器上

2. Maven 配置

 //Maven 核心程序并不包含具体功能,具体功能由插件来完成,Maven核心程序会将插件从远程中央仓库下载
 //Maven 核心配置文件位置
 D:...\apache-maven-3.5.4\conf\settings.xml

2.1 配置本地仓库

<!-- localRepository
 | The path to the local repository maven will use to store artifacts.
 |
 | Default: ${user.home}/.m2/repository
 <localRepository>/path/to/local/repo</localRepository>
 -->
 <localRepository>D:\maven-repository</localRepository>

2.2 配置镜像仓库

 <!--阿里云镜像仓库-->
 <mirrors>
     <mirror>
         <id>nexus-aliyun</id>
         <mirrorOf>central</mirrorOf>
         <name>Nexus aliyun</name>
         <url>http://maven.aliyun.com/nexus/content/groups/public</url>
     </mirror>
 </mirrors>

2.3 配置JDK 版本

<!--默认 JDK 版本是 1.5-->
 <profiles>
     <profile>
       <id>jdk-1.8</id>
       <activation>
         <activeByDefault>true</activeByDefault>
         <jdk>1.8</jdk>
       </activation>
       <properties>
         <maven.compiler.source>1.8</maven.compiler.source>
         <maven.compiler.target>1.8</maven.compiler.target>
         <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
       </properties>
     </profile>
 </profiles>

3. Maven 核心概念

3.1 坐标

Maven中 使用三个向量在Maven的仓库中唯一的定位到一个jar包。

  • groupId:公司或组织的ID

  • artifactId:一个项目或者是项目中的一个模块的ID

  • version:版本号

    • NAPSHOT 表示快照版本,正在迭代过程中,不稳定的版本

    • RELEASE 表示正式版本

<!--通过mysql\mysql-connector-java\8.0.25 即可定位到仓库中的mysql驱动包-->
 <dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version>8.0.25</version>
 </dependency>

3.2 POM

Project Object Model:项目对象模型

POM 理念集中体现在 Maven 工程根目录下 pom.xml 这个配置文件中,pom.xml 配置文件就是 Maven 工程的核心配置文件。

<!-- 当前Maven工程的坐标 -->
   <groupId>com.atguigu.maven</groupId>
   <artifactId>pro01-maven-java</artifactId>
   <version>1.0-SNAPSHOT</version>
   
   <!-- 当前Maven工程的打包方式,可选值有下面三种: -->
   <!-- jar:表示这个工程是一个Java工程  -->
   <!-- war:表示这个工程是一个Web工程 -->
   <!-- pom:表示这个工程是“管理其他工程”的工程 -->
   <packaging>jar</packaging>
 ​
   <name>pro01-maven-java</name>
   <url>http://maven.apache.org</url>
 ​
   <properties>
     <!-- 工程构建过程中读取源码时使用的字符集 -->
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>
 ​
   <!-- 当前工程所依赖的jar包 -->
   <dependencies>
     <!-- 使用dependency配置一个具体的依赖 -->
     <dependency>
     
       <!-- 在dependency标签内使用具体的坐标依赖我们需要的一个jar包 -->
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>4.12</version>
       
       <!-- scope标签配置依赖的范围 -->
       <scope>test</scope>
     </dependency>
   </dependencies>

3.3 依赖

  <scope>...</scope>
 <!-- scope标签中定义依赖 -->

3.3.1 依赖的范围

main目录test目录WEB-INF/lib
compile有效有效有效
test无效有效无效
provided有效有效无效

 

  • compile:默认,通常使用的第三方框架的 jar 包这样在项目实际运行时真正要用到的 jar 包都是以 compile 范围进行依赖的。比如 SSM 框架所需jar包。

  • test:测试过程中使用的 jar 包,以 test 范围依赖进来。比如 junit。

  • provided:在开发过程中需要用到的“服务器上的 jar 包”通常以 provided 范围依赖进来,比如 servlet-api。而这个范围的 jar 包服务器上已经有了所以不参与部署、不放进 war 包,就是避免和服务器上已有的同类 jar 包产生冲突,同时减轻服务器的负担

3.3.2 依赖的传递

传递的原则:在 A 依赖 B,B 依赖 C 的前提下,C 是否能够传递到 A,取决于 B 依赖 C 时使用的依赖范围。

  • B 依赖 C 时使用 compile 范围:可以传递

  • B 依赖 C 时使用 test 或 provided 范围:不能传递,所以需要这样的 jar 包时,就必须在需要的地方明确配置依赖才可以。

3.3.3 依赖的冲突

  • 路径最短者优先

  • 路径相同时先声明者优先

    • 指dependency标签配置顺序。

3.3.4 依赖的排除

概念:当 A 依赖 B,B 依赖 C 而且 C 可以传递到 A 的时候,A 不想要 C,需要在 A 里面把 C 排除掉

<dependency>
     <groupId>com.atguigu.maven</groupId>
     <artifactId>pro01-maven-java</artifactId>
     <version>1.0-SNAPSHOT</version>
     <scope>compile</scope>
     <!-- 使用excludes标签配置依赖的排除    -->
     <exclusions>
         <!-- 在exclude标签中配置一个具体的排除 -->
         <exclusion>
             <!-- 指定要排除的依赖的坐标(不需要写version) -->
             <groupId>commons-logging</groupId>
             <artifactId>commons-logging</artifactId>
         </exclusion>
     </exclusions>
 </dependency>

3.3.4 统一管理目标jar包的版本

<!--统一管理当前模块的jar包的版本-->
<properties>
    <spring.version>5.3.1</spring.version>
</properties>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>${spring.version}</version>
</dependency>

4. Maven 继承

4.1 概念

Maven工程之间,A 工程继承 B 工程

  • B 工程:父工程

  • A 工程:子工程

本质上是 A 工程的 pom.xml 中的配置继承了 B 工程中 pom.xml 的配置

4.2 创建父工程

<!-- 修改打包方式为pom -->

<groupId>com.atguigu.maven</groupId>
<artifactId>pro03-maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 当前工程作为父工程,它要去管理子工程,所以打包方式必须是 pom -->
<packaging>pom</packaging>

<!-- 添加管理的子工程 -->
<modules>  
	<module>pro04-maven-module</module>
	<module>pro05-maven-module</module>
	<module>pro06-maven-module</module>
</modules>

4.3 创建子工程

<!-- 使用parent标签指定当前工程的父工程 -->
<parent>
	<!-- 父工程的坐标 -->
	<groupId>com.atguigu.maven</groupId>
	<artifactId>pro03-maven-parent</artifactId>
	<version>1.0-SNAPSHOT</version>
</parent>

<!-- 子工程的坐标 -->
<!-- 如果子工程坐标中的groupId和version与父工程一致,那么可以省略 -->
<!-- <groupId>com.atguigu.maven</groupId> -->
<artifactId>pro04-maven-module</artifactId>
<!-- <version>1.0-SNAPSHOT</version> -->

4.4 父工程配置依赖统一管理

<!-- 使用dependencyManagement标签配置对依赖的管理 -->
<!-- 被管理的依赖并没有真正被引入到工程 -->
<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>4.0.0.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>4.0.0.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>4.0.0.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-expression</artifactId>
			<version>4.0.0.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>4.0.0.RELEASE</version>
		</dependency>
	</dependencies>
</dependencyManagement>

4.5 子工程引用父工程的依赖

<!-- 子工程引用父工程中的依赖信息时,可以把版本号去掉。	-->
<!-- 把版本号去掉就表示子工程中这个依赖的版本由父工程决定。 -->
<!-- 具体来说是由父工程的dependencyManagement来决定。 -->
<dependencies>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-core</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-beans</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-expression</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-aop</artifactId>
	</dependency>
</dependencies>

4.6 父工程中声明自定义属性

<!-- 通过自定义属性,统一指定Spring的版本 -->
<properties>
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	
	<!-- 自定义标签,维护Spring版本数据 -->
	<atguigu.spring.version>4.3.6.RELEASE</atguigu.spring.version>
</properties>
在需要的地方使用${}的形式来引用自定义的属性名:

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-core</artifactId>
	<version>${atguigu.spring.version}</version>
</dependency>

5. Maven 聚合

Maven 聚合概念是为了可以对工程进行模块统一清除、编译、测试、打包、安装

在总工程中配置 modules 即可:

<modules>  
	<module>pro04-maven-module</module>
	<module>pro05-maven-module</module>
	<module>pro06-maven-module</module>
</modules>

子工程继承总工程

<!--继承parent父工程-->
<parent>
    <groupId>com.atguigu.sz0704</groupId>
    <artifactId>parent</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--如果有聚合,子级需要添加配置   从当前文件出发寻找父级的pom.xml-->
    <relativePath>../parent/pom.xml</relativePath>
</parent>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值