一、Maven的下载与安装
1.)maven官网:maven官网
2.)点击下载:
3.)一些配置
① 配置本地仓库
② 配置阿里云镜像
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
③ 指定默认jdk版本为1.8
<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>
④ 环境变量配置
Maven 是一个用 Java 语言开发的程序,它必须基于 JDK 来运行,需要通过 JAVA_HOME 来找到 JDK 的安装位置。
配置 MAVEN_HOME
配置PATH
⑤ 验证maven是否正确安装
mvn -v
二、Maven的核心概念
1.)Maven中的坐标
groupId:公司或组织的 id
artifactId:一个项目或者是项目中的一个模块的 id
version:版本号
2.)使用命令行操作
①使用命令行生成Maven工程(java项目)
mvn archetype:generate
②执行Maven的构建命令
运行 Maven 中和构建操作相关的命令时,必须进入到 pom.xml 所在的目录。
1.清理操作:mvn clean
2.主程序编译:mvn compile
3.测试程序编译:mvn test-compile
主体程序编译结果存放的目录:target/classes
测试程序编译结果存放的目录:target/test-classes
4.测试操作 mvn test
测试的报告存放的目录:target/surefire-reports
5.打包操作 mvn package
打包的结果——jar 包,存放的目录:target
6.安装操作 mvn install
安装操作即将当前项目安装到本地仓库当中
③ 使用命令行生成maven工程(web项目)
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.4
生成的web工程的目录结构
④让web工程依赖java工程
明确一个意识:从来只有 Web 工程依赖 Java 工程,没有反过来 Java 工程依赖 Web 工程。本质上来说,Web 工程依赖的 Java 工程其实就是 Web 工程里导入的 jar 包。最终 Java 工程会变成 jar 包,放在 Web 工程的 WEB-INF/lib 目录下
⑤打印出已解决依赖项的详细信息。指定可选参数classifier=sources,将尝试分析下载对应的依赖的源代码。
mvn dependency:resolve -Dclassifier=sources
3.)约定的目录结构(java项目)
4.)测试依赖的范围
标签的可选值:compile/test/provided/system/runtime/import
provided:服务器上已经有了这个依赖,不用再重复提供。如果重复提供,可能会发生版本冲突。/
详细描述
import:
system:
runtime:
5.)测试依赖的传递性
A 依赖 B,B 依赖 C,那么在 A 没有配置对 C 的依赖的情况下,A 里面能不能直接使用 C?
如果B在依赖C时,scope属性为compile时,依赖是可以传递的,即A不用在pom文件中显示的引入依赖C,就可以直接用C
如果B在依赖C时,scope属性为test、provided时,依赖是不可以传递的。
6.)依赖的排除(阻断依赖的传递)
7.)继承
在父工程中统一管理项目中的依赖信息,具体来说是管理依赖信息的版本。
1.创建父工程和子工程
①创建父工程:maven003-parent
②修改父工程的pom文件中的打包方式:
③在父工程的根目录下,创建三个子项目
④查看结果
父工程的pom文件:
子工程的pom文件
2.在父工程管理依赖版本
只需要在父工程的pom文件,指定依赖的版本
子工程如果想要用某个依赖,也必须在子工程的pom文件下引入依赖,但不用指定版本
小技巧:
8.)生命周期
为了让构建过程自动化完成,Maven 设定了三个生命周期,生命周期中的每一个环节对应构建过程中的一个操作。
特点:
1.前面三个生命周期彼此是独立的。
2.在任何一个生命周期内部,执行任何一个具体环节的操作,都是从本周期最初的位置开始执行,直到指定的地方。(本节记住这句话就行了,其他的都不需要记)
9.)插件和目标
插件的作用:
Maven 的核心程序仅仅负责宏观调度,不做具体工作。具体工作都是由 Maven 插件完成的。例如:编译就是由 maven-compiler-plugin-3.1.jar 插件来执行的
目标:
一个插件可以对应多个目标,而每一个目标都和生命周期中的某一个环节对应
Default 生命周期中有 compile 和 test-compile 两个和编译相关的环节,这两个环节对应 compile 和 test-compile 两个目标,而这两个目标都是由 maven-compiler-plugin-3.1.jar 插件来执行的。
10.)仓库
三、使用Idea创建maven工程
1.) 在idea中配置Maven
每次新建project就必须设置以下内容,但是新建module就不用。
idea中有内置的maven,但是这个不太方便,我们用自己解压好的maven
2.)在idea中执行mvn命令的三种方式
第一种:
第二种:
第三种:
四、POM的深入与强化
Maven不仅仅可以用于构建管理和依赖管理他还可以进行项目管理。
1.)POM的四个层次
①超级POM:
所以我们自己的 POM 即使没有明确指定一个父工程(父 POM),其实也默认继承了超级 POM。就好比一个 Java 类默认继承了 Object 类
②父POM:
③当前POM:
④有效POM:
有效 POM 英文翻译为 effective POM,它的概念是这样的——在 POM 的继承关系中,子 POM 可以覆盖父 POM 中的配置;如果子 POM 没有覆盖,那么父 POM 中的配置将会被继承。按照这个规则,继承关系中的所有 POM 叠加到一起,就得到了一个最终生效的 POM。显然 Maven 实际运行过程中,执行构建操作就是按照这个最终生效的 POM 来运行的。这个最终生效的 POM 就是有效 POM,英文叫effective POM
查看当前项目的有效pom:
mvn help:effective-pom
2.)属性的声明和引用
使用mvn help:evalueate查看属性值:
①查看系统属性:
②查看系统环境变量
③访问当前项目中pom文件中的属性:
查看properties标签下的属性值
查看其他标签下的属性值:
④查看maven的settings的全局配置:
3.)build标签
build标签用来控制项目的构建过程。
build标签是由 约定的目录结构、备用插件管理、生命周期插件管理这三大部分组成
1.)约定的目录结构:通过这个我们可以指定相应的资源所存放的目录
2.)备用插件管理
3.)生命周期插件
4.)典型应用
①指定JDK版本
方法一、
<!-- build 标签:意思是告诉 Maven,你的构建行为,我要开始定制了! -->
<build>
<!-- plugins 标签:Maven 你给我听好了,你给我构建的时候要用到这些插件! -->
<plugins>
<!-- plugin 标签:这是我要指定的一个具体的插件 -->
<plugin>
<!-- 插件的坐标。此处引用的 maven-compiler-plugin 插件不是第三方的,是一个 Maven 自带的插件。 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<!-- configuration 标签:配置 maven-compiler-plugin 插件 -->
<configuration>
<!-- 具体配置信息会因为插件不同、需求不同而有所差异 -->
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
方法二、
②springboot定制化打包
很显然 spring-boot-maven-plugin 并不是 Maven 自带的插件,而是 SpringBoot 提供的,用来改变 Maven 默认的构建行为。具体来说是改变打包的行为。默认情况下 Maven 调用 maven-jar-plugin 插件的 jar 目标,生成普通的 jar 包。
普通 jar 包没法使用 java -jar xxx.jar 这样的命令来启动、运行,但是 SpringBoot 的设计理念就是每一个『微服务』导出为一个 jar 包,这个 jar 包可以使用 java -jar xxx.jar 这样的命令直接启动运行。
这样一来,打包的方式肯定要进行调整。所以 SpringBoot 提供了 spring-boot-maven-plugin 这个插件来定制打包行为。
③mybatis逆向工程
<!-- 控制 Maven 在构建过程中相关配置 -->
<build>
<!-- 构建过程中用到的插件 -->
<plugins>
<!-- 具体插件,逆向工程的操作是以构建过程中插件形式出现的 -->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.0</version>
<!-- 插件的依赖 -->
<dependencies>
<!-- 逆向工程的核心依赖 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.2</version>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.8</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
4.)依赖仲裁(解决一些依赖冲突)
5.)profile
profile标签为某一个环境的自己的配置:
比如:开发环境和测试环境的数据库链接的属性一般是不一样的,用maven的时候可以使用profile标签来设置。(一般不推荐用maven的形式来设置)
profile标签有两种配置方式:①settings全局配置文件②pom文件
五、生产实践
1.)搭建Maven私服
2.)jar包冲突问题
1.如何判断出了jar包冲突问题?
如果错误信息中完全没有我们所负责的部分,全部是第三方框架和工具类的错误,我们就可以推断jar包出现了问题。
2.解决方法:
找到jar包冲突的地方,排除掉或指定一个jar包。
3.)体系外jar包引入
①新建一个不用maven的java项目
②用maven将java项目安装到本地仓库
③其他就一样了,直接在pom文件中引入java项目的依赖
4.)下载不了别的部门发版的代码的源码
1.执行:mvn dependency:resolve -Dclassifier=sources
2.点击下载
3.多次尝试