1)项目的自动构建,帮助开发人员做项目代码的编译,测试, 打包,安装,部署等工作。
2)管理依赖(管理项目中使用的各种jar包)。
依赖:项目中需要使用的其他资源, 常见的是jar 。 比如项目要使用mysql驱动。我们就说项目依赖mysql驱动。
maven是apache基金会的开源项目,使用java语法开发。 Maven 这个单词的本意是:专家,内行。读音是['meɪv(ə)n] 或 ['mevn]。
maven是项目的自动化构建工具。 管理项目的依赖。
①POM
②约定的目录结构
③坐标
④依赖管理
⑤仓库管理
⑥生命周期
⑦插件和目标
⑧继承
⑨聚合
地址: http://maven.apache.org/ 从中下载 .zip文件。
安装:
确定JAVA_HOME 指定jdk的安装目录, 如果没有JAVA_HOME, 需要在windows的环境变量中创建JAVA_HOME, 它的值是jdk的安装目录
解压缩 apache-maven-3.3.9-bin.zip ,把解压后的文件放到一个目录中。
目录的路径不要有中文, 不要有空格。
把maven安装目录中下的bin的路径添加到path中
测试maven的安装。 在命令行执行 mvn -v
C:\Users\NING MEI>mvn -v
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: D:\tools\apache-maven-3.3.9\bin\..
Java version: 1.8.0_101, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.8.0_101\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "dos"
maven的其他安装方式:
确定JAVA_HOME是否有效
在环境变量中,创建一个叫做M2_HOME (或者MAVEN_HOME) ,它的值是maven的安装目录
M2_HOME=D:\tools\apache-maven-3.3.9
在path环境变量中,加入 %M2_HOME%\bin
测试maven的安装,在命令行执行 mvn -v
C:\Users\NING MEI>mvn -v
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: D:\tools\apache-maven-3.3.9\bin\..
Java version: 1.8.0_101, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk1.8.0_101\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "dos"
maven项目使用的大多人 遵循的目录结构。 叫做约定的目录结构。
一个maven项目是一个文件夹。 比如项目叫做Hello
Hello 项目文件夹
\src
\main 叫做主程序目录(完成项目功能的代码和配置文件)
\java 源代码(包和相关的类定义)
\resources 配置文件
\test 放置测试程序代码的(开发人员自己写的测试代码)
\java 测试代码的(junit)
\resources 测试程序需要的配置文件
\pom.xml maven的配置文件, 核心文件
POM: Project Object Model 项目对象模型, maven把项目当做模型处理。 操作这个模型就是操作项目。
maven通过pom.xml文件实现 项目的构建和依赖的管理。
<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.0modelVersion>
<groupId>com.bjpowernodegroupId>
<artifactId>ch01-mavenartifactId>
<version>1.0-SNAPSHOTversion>
<properties>
<java.version>1.8java.version>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
properties>
project>
坐标组成是 groupid, artifiactId, version。
坐标作用:确定资源的,是资源的唯一标识。 在maven中,每个资源都是坐标。 坐标值是唯一的。简称叫gav
<groupId>com.bjpowernodegroupId>
<artifactId>ch01-mavenartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>jarpackaging>
groupId: 组织名称,代码。 公司,团体或者单位的标识。 这个值常使用的公司域名的倒写。
例如:学校的网站 www.bjpowernode.com, groupId: com.bjpowernode
如果项目规模比较大, 也可以是 域名倒写+大项目名称。
例如: www.baidu.com , 无人车: com.baidu.appollo
artifactId:项目名称, 如果groupId中有项目, 此时当前的值就是子项目名。 项目名称是唯一的。
version:版本, 项目的版本号, 使用的数字。 三位组成。 例如 主版本号.次版本号.小版本号, 例如: 5.2.5。
注意:版本号中有-SNAPSHOT, 表示快照,不是稳定的版本。
packaging 项目打包的类型, 有jar ,war, ear, pom等等 默认是jar
项目使用gav:
1.每个maven项目,都需要有一个自己的gav
2.管理依赖,需要使用其他的jar ,也需要使用gav作为标识。
搜索坐标的地址: https://mvnrepository.com/
依赖:项目中要使用的其他资源(jar)。
需要使用maven表示依赖,管理依赖。 通过使用dependency和gav一起完成依赖的使用
需要在pom.xml文件中,使用dependencies 和dependency, 还有gav 完成依赖的说明。
格式:
<dependencies>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.16version>
dependency>
dependencies>
maven使用gav作为标识,从互联网下载依赖的jar。 下载到你的本机上。 由maven管理项目使用的这些jar
仓库是存东西的,maven的仓库存放的是:
1.Maven 的插件,插件也是一些 jar,这些 jar 可以完成一定的功能。
2.我们自己开发项目的模块
3.第三方框架或工具的 jar 包
仓库的分类:
本地仓库(本机仓库): 位于你自己的计算机, 它是磁盘中的某个目录。
本地仓库:默认路径,是你登录操作系统的账号的目录中/.m2/repository
修改本地仓库的位置:修改maven工具的配置文件(maven的安装路径\conf\setting.xml)
<localRepository>D:/openrepositorylocalRepository>
远程仓库: 需要通过联网访问的
1)中央仓库: 通过Internet访问,为全世界所有 Maven工程服务。 最权威的。
2)中央仓库的镜像: 架设在不同位置,欧洲,美洲,亚洲等每个洲都有若干的服务器,为中央仓库分担流量。减轻中央仓库的访问,下载的压力
3)私服:在局域网环境中部署的服务器,为当前局域网范围内的所有 Maven工程服务
配置仓库
修改 conf/settings.xml 文件
<servers>
<server>
<id>nexus-releasesid>
<username>adminusername>
<password>admin123password>
server>
<server>
<id>nexus-snapshotsid>
<username>adminusername>
<password>admin123password>
server>
servers>
<mirror>
<id>nexus-releasesid>
<mirrorOf>*mirrorOf>
<url>http://192.168.0.50:8081/repository/maven-public/url>
mirror>
<mirror>
<id>nexus-snapshotsid>
<mirrorOf>*mirrorOf>
<url>http://192.168.0.50:8081/repository/maven-snapshots/url>
mirror>
<mirror>
<id>alimavenid>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
<mirrorOf>centralmirrorOf>
mirror>
<profile>
<id>nexusid>
<repositories>
<repository>
<id>nexus-releasesid>
<url>http://nexus-releasesurl>
<releases><enabled>trueenabled>releases>
<snapshots><enabled>trueenabled>snapshots>
repository>
<repository>
<id>nexus-snapshotsid>
<url>http://nexus-snapshotsurl>
<releases><enabled>trueenabled>releases>
<snapshots><enabled>trueenabled>snapshots>
repository>
repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus-releasesid>
<url>http://nexus-releasesurl>
<releases><enabled>trueenabled>releases>
<snapshots><enabled>trueenabled>snapshots>
pluginRepository>
<pluginRepository>
<id>nexus-snapshotsid>
<url>http://nexus-snapshotsurl>
<releases><enabled>trueenabled>releases>
<snapshots><enabled>trueenabled>snapshots>
pluginRepository>
pluginRepositories>
profile>
<activeProfiles>
<activeProfile>nexusactiveProfile>
activeProfiles>
maven使用仓库: maven自动使用仓库, 当项目启动后, 执行了maven的命令, maven首先访问的是本地仓库, 从仓库中获取所需的jar, 如果本地仓库没有 ,需要访问私服或者中央仓库或者镜像。
Maven有三套相互独立的生命周期
**Clean Lifecycle 在进行真正的构建之前进行一些清理工作。**Clean生命周期一共包含了三个阶段:
Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
生命周期阶段 | 描述 |
---|---|
validate | 检查工程配置是否正确,完成构建过程的所有必要信息是否能够获取到。 |
initialize | 初始化构建状态,例如设置属性。 |
generate-sources | 生成编译阶段需要包含的任何源码文件。 |
process-sources | 处理源代码,例如,过滤任何值(filter any value)。 |
generate-resources | 生成工程包中需要包含的资源文件。 |
process-resources | 拷贝和处理资源文件到目的目录中,为打包阶段做准备。 |
compile | 编译工程源码。 |
process-classes | 处理编译生成的文件,例如 Java Class 字节码的加强和优化。 |
generate-test-sources | 生成编译阶段需要包含的任何测试源代码。 |
process-test-sources | 处理测试源代码,例如,过滤任何值(filter any values)。 |
test-compile | 编译测试源代码到测试目的目录。 |
process-test-classes | 处理测试代码文件编译后生成的文件。 |
test | 使用适当的单元测试框架(例如JUnit)运行测试。 |
prepare-package | 在真正打包之前,为准备打包执行任何必要的操作。 |
package | 获取编译后的代码,并按照可发布的格式进行打包,例如 JAR、WAR 或者 EAR 文件。 |
pre-integration-test | 在集成测试执行之前,执行所需的操作。例如,设置所需的环境变量。 |
integration-test | 处理和部署必须的工程包到集成测试能够运行的环境中。 |
post-integration-test | 在集成测试被执行后执行必要的操作。例如,清理环境。 |
verify | 运行检查操作来验证工程包是有效的,并满足质量要求。 |
install | 安装工程包到本地仓库中,该仓库可以作为本地其他工程的依赖。 |
deploy | 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程。 |
Site Lifecycle 生成项目报告,站点,发布站点。
插件:要完成构建项目的各个阶段,要使用maven的命令, 执行命令的功能是通过插件完成的。插件就是jar,一些类。
命令: 执行maven功能是 由命令发出的。 比如 mvn compile
命令:
1) mvn clean: 清理命令, 作用删除以前生成的数据, 删除target目录。
插件: maven-clean-plugin
2)mvn compile:编译命令,执行的代码编译, 把src/main/java目录中的java代码编译为class文件。
同时把class文件拷贝到 target/classes目录。 这个目录classes是存放类文件的根目录(也叫做类路径,classpath)
插件: maven-compiler-plugin 编译代码的插件
maven-resources-plugin 资源插件, 处理文件的。 作用是把src/main/resources目录中的文件拷贝target/classes目录中。
3)mvn test-compile: 编译命令, 编译src/test/java目录中的源文件, 把生成的class拷贝到target/test-classes目录。同时把src/test/resources目录中的文件拷贝到 test-clasess目录
插件: maven-compiler-plugin 编译代码的插件
maven-resources-plugin 资源插件, 处理文件的
4)mvn test:测试命令, 作用执行 test-classes目录的程序, 测试src/main/java目录中的主程序代码是否符合要求。
插件: maven-surefire-plugin
5)mvn package:打包,作用是把项目中的资源class文件和配置文件都放到一个压缩文件中, 默认压缩文件是jar类型的。 web应用是war类型, 扩展是jar,war的。
插件:maven-jar-plugin 执行打包处理。 生成一个jar扩展的文件, 放在target目录下。打包的文件包含的是 src/main目录中的所有的生成的class和配置文件和test无关。
6)mvn install : 把生成的打包的文件 ,安装到maven仓库。
插件: maven-install-plugin 把生成的jar文件安装到本地仓库。
<modules>
<module>project1module>
<module>project2module>
<module>project3module>
...
modules>
<parent>
<groupId>it.com.pyggroupId>
<artifactId>PYG-ParentartifactId>
<version>0.0.1-SNAPSHOTversion>
parent>
聚合工程的依赖传递
一般都是在父模块的 pom 中定义项目用到的依赖以及版本,
然后在子模块的 pom 中, 需要什么依赖就直接引入, 不引入版本号, 依赖会自动从父模块中传递到子模块中
在pom.xml文件中, build标签中。设置插件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.8.1version>
<configuration>
<source>1.8source>
<target>1.8target>
configuration>
plugin>
plugins>
build>
idea中有一个自带的maven。 我们要让idea使用自己安装的maven。
2) File - Other Settings
①、dependencies:一个 pom.xml 文件中只能存在一个这样的标签。用来管理依赖的总标签。
②、dependency:包含在dependencies标签中,可以有无数个,每一个表示一个依赖
③、groupId,artifactId和version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven根据坐标才能找到需要的依赖。
④、type:依赖的类型,对应于项目坐标定义的packaging。大部分情况下,该元素不必声明,其默认值是jar。
⑤、scope:依赖的范围,默认值是 compile。后面会进行详解。
⑥、optional:标记依赖是否可选。
⑦、exclusions:用来排除传递性依赖,后面会进行详细介绍。
<project>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>3.8.1version>
<type>...type>
<scope>...scope>
<optional>...optional>
<exclusions>
<exclusion>
<groupId>...groupId>
<artifactId>...artifactId>
exclusion>
exclusions>
dependency>
dependencies>
project>
依赖范围:使用scope表示依赖的范围。
依赖范围表示: 这个依赖(jar和里面类)在项目构建的那个阶段起作用。
依赖范围scope :
compile:默认, 参与构建项目的所有阶段
test:测试,在测试阶段使用, 比如执行mvn test会使用junit 。
provided:提供者。 项目在部署到服务器时,不需要提供这个依赖的jar , 而是由服务器这个依赖的jar包
明显的是servlet 和jsp 依赖
runtime:只在运行时使用,如JDBC驱动,适用运行和测试阶段。
system:类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
路径最短者优先原则
路径相同先声明优先原则
如果我们在当前工程中引入了一个依赖是 A,而 A 又依赖了 B,那么 Maven 会自动将 A 依赖的 B 引入当前工程,但是个别情况下 B 有可能是一个不稳定版,或对当前工程有不良影响。这时我们可以在引入 A 的时候将 B 排除。
exclusions:用来排除传递性依赖
Optional标签标示该依赖是否可选,默认是false。可以理解为,如果为true,则表示该依赖不会传递下去,如果为false,则会传递下去
1)讲的是properties它里面的配置
<properties>
<maven.compiler.source>1.8maven.compiler.source> 源码编译 jdk 版本
<maven.compiler.target>1.8maven.compiler.target> 运行代码的 jdk 版本
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding> 项目构建使用的编码,避免中文乱码
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding> 生成报告的编码
properties>
在properties定义标签,这个标签就是一个变量, 标签的文本就是变量的值。
使用全局变量表示 多个依赖使用的版本号。
使用步骤:
1.在properties标签中,定义一个标签,指定版本的值
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
<spring.version>5.2.5.RELEASEspring.version>
<junit.version>4.11junit.version>
properties>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webartifactId>
<version>${spring.version}version>
dependency>
3)使用资源插件
处理的配置文件的信息, maven默认处理配置文件
①:maven会把src/main/resources目录中的文件, 拷贝到target/classes目录下
②:maven只处理src/main/java目录中的 .java文件,把这些java文件编译为class,拷贝到 target/classes目录中。 不处理其他文件。
<build>
<resources>
<resource>
<directory>src/main/javadirectory>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.xmlinclude>
includes>
<filtering>falsefiltering>
resource>
resources>
build>