***> 刚学完Maven,今天抽空把Maven的基本知识点进行整理,作为自己复习和查阅使用。(最近想要把自己学过的东西从按照自己平时的思维导图做个整理,哈哈哈,不忘初心,方得始终)
一、Maven的作用
Maven 是一个项目管理工具,可以对 Java 项目进行构建、依赖管理。简单来说,就是构建项目和管理依赖,我们之前的项目都是一直在导jar包,而且会因为jar包的版本问题或者其他问题,增加了我们在jar包的使用难度,这些问题Maven都可以解决。
二、Maven的安装和配置
因为Maven是一个基于java的工具,所以我们先安装jdk,这个在之前就已经安装完成了,如果不确定可以查看自己的jdk版本。步骤是打开命令行输入java -version
如果显示java version则说明之前安装过jdk,那就可以开始下一个步骤了
Maven的下载和安装
Maven 下载地址:maven.apache.org/download.cg…
红色框框是windows版本,存储位置自己定,然后解压缩安装,我的是:
这一步之后要指定本地仓库,做法是建一个mavenRepository文件夹,我的建在D盘,所以路径是D:\mavenRepository,先复制这个路径,后面会用到。
注意:压缩包和本地仓库路径都是要求使用非中文、没有空格的目录
Maven的配置
-
settings.xml文件配置
打开上一步解压缩的文件中的conf文件夹中的settings.xml,里面的参数配置很重要,一定要配置。
在文件里我们要完成三个改动
1. 本地仓库路径
就是上面的D:\mavenRepository,做法是在图中位置加上(大概56行)<localRepository>D:\mavenRepository</localRepository>
D:\mavenRepository是自己设定的本地仓库路径
2. 阿里云镜像
阿里云提供的镜像仓库,访问国内网站,可以让Maven下载jar包的时候速度更快。配置的方式是:将下面mirror标签整体复制到mirrors标签的内部。
<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>
3. 配置Maven工程的基础JDK版本
配置的方式是:将profile标签整个复制到profiles标签内。(profile标签在mirrors标签下面)
<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>
-
环境变量的配置
完成上面的步骤之后,我们要进行环境变量的配置,步骤同配置jdk一样。
- 添加环境变量 MAVEN_HOME:
变量值是安装路径
- 配置path
配置环境变量的规律:
- XXX_HOME指向的是bin目录的上一级
- PATH指向的是bin目录
- 验证
输入mvn -version/mvn -v
这里Maven就安装配置好了
三、Maven的仓库和坐标
仓库
Maven 仓库能帮助我们管理构件(主要是JAR),它就是放置所有JAR文件(WAR,ZIP,POM等等)的地方。
| 仓库名称 | 简介 |
|---|---|
| 本地仓库(local) | 在第一次执行 maven 命令的时候才被创建 |
| 中央仓库(central) | 这个仓库由 Maven 社区管理,不需要配置,需要通过网络才能访问地址:search.maven.org/#browse 和repo1.maven.org/maven2/ |
| 远程仓库(remote) | 在公司内部架设一台私服,其它公司架设一台仓库,对外公开。 |
坐标
坐标是为了让我们识别我们要管理项目的依赖的。
| 节点 | 描述 |
|---|---|
| groupId | 项目组织唯一的标识符,实际对应JAVA的包的结构 (一般写公司的组织名称。例如,一个银行组织 com.companyname.project-group 拥有所有的和银行相关的项目。 |
| artifactId | 项目/工程的名称。 |
| version | 这是工程的版本号。在 artifact 的仓库中,它用来区分不同的版本 |
四、在idea中集成Maven
- 配置maven软件的安装路径和本地仓库路径
2. 配置maven的runner参数
-DarchetypeCatalog=internal -Dfile.encoding=GB2312
- 参数一: -DarchetypeCatalog=internal 解决使用骨架构建Maven项目时候会卡住的问题
- 参数二: -Dfile.encoding=GB2312 解决Maven工程中控制台输出中文乱码的问题
五、使用IDEA创建基于Maven的工程
创建JavaSE工程
1、 第一步
2、 第二步
创建JavaWeb工程
- 在IDEA中安装一个插件(JBLJavaToWeb)
0. 按照创建javase工程的方式创建(此时创建出来的是javase工程)
0. 使用JBLJavaToWeb插件将javase工程转成javaweb工程
注意:转换之后会在main目录中多出一个web目录,并且pom.xml文件中会自动添加打包方式为
<packaging>war<packaging/>因为我们需要在javaweb项目中使用Servlet,所以需要引入Servlet的依赖
六、Maven构建命令(生命周期)
| 阶段 | 处理 | 描述 |
|---|---|---|
| 清理 clean | 清除项目的构建的内容 | 具体的效果是删除target目录 |
| 验证 validate | 验证项目 | 验证项目是否正确且所有必须信息是可用的 |
| 编译 compile | 执行编译 | 源代码编译在此阶段完成 |
| 测试 Test | 测试 | 使用适当的单元测试框架(例如JUnit)运行测试。 |
| 包装 package | 打包 | 创建JAR/WAR包如在 pom.xml 中定义提及的包 |
| 检查 verify | 检查 | 对集成测试的结果进行检查,以保证质量达标 |
| 安装 install | 安装 | 安装打包的项目到本地仓库,以供其他项目使用 |
| 部署 deploy | 部署 | 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程 |
七、Maven的依赖
1、依赖的范围
注意:只有运行时的依赖才会导到jar包或者web包里
2、依赖的传递性
依赖的传递性,是指A 依赖于B,B依赖于C,A依赖C。但C是否传递到A,取决于B依赖C时使用的依赖范围(上面说的运行时的依赖才会打包,这时候才可以传递),因此
- B依赖C时使用compile和runtime范围:可以传递
- B依赖C时使用test或provided范围:不能传递,所以需要这样的jar包时,就必须在需要的地方明确配置依赖才可以。
3、依赖的排除
当A依赖B,B依赖C而且C可以传递到A的时候,但是A不想要C,需要在A里面把C排除掉。而往往这种情况都是为了避免jar包之间的冲突。只需要在依赖里添加 ,如:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.2.4.RELEASE</version>
<!--直接排除-->
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
</exclusions>
</dependency>
八、继承和耦合
1、继承
在父工程中统一管理项目中的依赖信息,具体来说是管理依赖信息的版本,各个子工程使用依赖的时候版本就统一了,配置方法时:在子工程的pom.xml文件中通过<parent>标签指定当前子工程的父工程
<parent>
<artifactId>maven-parent</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
2、耦合
配置
2.1 在总工程的pom.xml中指定总工程的打包方式为pom
<groupId>com.atguigu</groupId>
<artifactId>maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
2.2 在总工程的pom.xml中指定总工程需要聚合的所有分工程
<modules>
<module>maven-child-01</module>
<module>maven-child-02</module>
<module>maven-child-03</module>
</modules>
3、实例
1、以创建Javase方式创建父工程maven-parent
1.1 在pom文件指定打包方式为pom
<groupId>com.atguigu.maven</groupId>
<artifactId>maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
1.2 管理依赖信息,pom代码如下:
<?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>maven-parent</artifactId>
<!--maven-parent工程,既是一个父工程,又是聚合里面的总工程
打包方式为pom就表示它是聚合里面的总工程-->
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<properties>
<!--自定义属性,进行版本锁定-->
<spring.version>4.0.0.RELEASE</spring.version>
<junit.version>4.12</junit.version>
</properties>
<!--用来描述当前总工程聚合了多少个子工程-->
<modules>
<module>maven-child01</module>
<module>maven-child02</module>
<module>maven-child03</module>
</modules>
<!--继承的效果:在父工程中管理依赖-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
版本锁定就是自定义一个属性,属性值就是要统一的版本,然后在
<version>标签体中引入该属性值 2、创建三个子模块
2.1 指定parent为maven-parent
观察子工程的pom.xml文件可以看到,pom.xml文件中自动生成了
<parent>标签用于指定父工程
<parent>
<artifactId>maven-parent</artifactId>
<groupId>com.atguigu</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
观察父工程的pom.xml文件可以看到,pom.xml文件中自动生成了<modules>标签用于指定父工程聚合的所有子工程
<modules>
<module>maven-child-01</module>
<module>maven-child-02</module>
<module>maven-child-03</module>
</modules>
2.2 在子工程中引入依赖
这是子工程2
<?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">
<parent>
<artifactId>maven-parent</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>maven-child02</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
</project>
后面就可以测试了,还可以在子工程1中依赖2,测试一下依赖的传递性。Maven大概就简单介绍这么多啦,请指教。