maven
1.前提条件:正确配置了JDK的环境变量
命令提示符中检查:java -version
2.配置环境变量M2_HOME = maven的根目录
在path中追加%M2_HOME%\bin
mvn -version 也就是mvn -v
3.创建maven项目
项目名(根目录)
pom.xml
src
main
java
resources
test
java
resources
进入到项目的根目录(有pom.xml文件)下面,执行相关的命令
有如下命令:
mvn clean
mvn compile
mvn package
mvn install
命令的写法有两种:
直接写命令:mvn package
组合使用命令:mvn clean package
命令 的执行有如下特点:
TODO:下一阶段的命令会包含上面阶段的命令(还没有讲)
4.maven的配置
两级配置结构,一个用户级别,一个系统级别,两者都有以用户级别为准
系统级别的配置是在:maven安装目录下的conf/settings.xml
用户级别的配置:默认是没有配置文件的,可以把系统级别的settings.xml文件拷贝到用户目录下的 .m2 文件下
配置项有2个:
localRepository
E:/repo
:自己在E盘配置maven本地仓库repo
mirror
<localRepository>E:/repo</localRepository>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</morrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</morror>
5.maven 仓库使用方式
项目或者命令所要用到的依赖、插件都是需要下载的,默认是下从本地仓库查找,找不到就到远程的中央仓库去查找.
由于远程仓库在国外,国外有相关的镜像(mirror)
6.archetype创建项目
archetype翻译架构类型,就是说有一系列的项目模板结构(架构类型)
mvn archetype:generate
,接着按提示操作
用的是archetype: quickstart
Maven安装
下载与安装
1.从maven 官网下载Maven的安装包,下载地址:http://maven.apache.org/download.cgi
2.接下来查看自己的JDK环境变量是否配置,输入:java -version
3.配置maven环境变量
编辑path环境变量
4.检查是否配置好 :mvn -version
这就配置好了
maven的项目结构
目录 | 说明 |
---|---|
src/main/java | 存放Java源代码的目录,这个目录下存放package以及Java源文件 |
src/main/resources | 存放项目所需要 的资源文件和配置文件,例如xml、properties文件等 |
src/test/java | 存放单元测试类的源码目录 |
src/test/resources | 存放单元测试所需的资源文件或配置文件 |
target | 用于存放编译后的文件以及Maven打包的文件 |
pom.xml | 项目对象模型 |
项目名(根目录)如下:
pom.xml
src
main
java
resources
test
java
resources
进入到项目的根目录(有pom.xml文件)下面,执行相关的命令
有如下命令:
mvn clean
mvn compile
mvn package
mvn install
命令的写法有两种:
直接写命令:mvn package
组合使用命令:mvn clean package
Maven配置
两级配置结构,一个用户级别,一个是系统级别,两者都有以用户级别为准
系统级别的配置是在:maven安装目录下的conf/settings.xml
用户级别的配置:默认是没有配置文件的,可以吧系统级别的settings.xml文件拷贝到用户目录下的.m2
文件夹下
配置项有2个:
- localRepository
- mirror:mirrorOf与url是不能错的
<localRepository>E:/repo</localRepository>
<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>
配置本地仓库
1.首先将maven安装目录中的conf目录中settings.xml文件复制
到C盘配置maven后生产的.m2文件夹中,将.m2中原来的文件夹进行删除
2.接着对复制过来的settings.xml文件进行配置
加入 E:/repo
E盘中的repo就是我们的本地仓库了
那我们在接下来的项目实践中,本地仓库有的就从本地仓库取,没有的就需要从中央仓库中取了
私服
私服也是远程仓库的一种,私服通常和开发人员的本地仓库在一个局域网中,在一些公司内部都会见到私服的存在,当对外网访问有限制时,那么私服的所用就显现出来了。通俗的讲,私服是建立在本地仓库和远程仓库之间。
maven仓库的使用方式
项目或者命令所要用到的依赖、插件都是需要下载的,默认是先从本地仓库查找,找不到就到远程的中央仓库去查找。
由于远程仓库在国外,国内有相关的镜像(mirror)
maven下idea中的使用
单模块项目的搭建
1.新建一个Project,选择Maven,勾选create from archetype,选择图中webapp
2.next,项目名称
3.idea会自动帮我们下载好,我们把build删除掉
4.下面是我的一个项目中的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.nf</groupId>
<artifactId>maven-web-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
<configuration>
<warSourceDirectory>web</warSourceDirectory>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.5.v20170502</version>
<configuration>
<scanIntervalSeconds>3</scanIntervalSeconds>
<webAppSourceDirectory>web</webAppSourceDirectory>
<webAppConfig>
<contextPath>/</contextPath>
</webAppConfig>
<httpConnector>
<port>8088</port>
</httpConnector>
</configuration>
</plugin>
</plugins>
</build>
</project>
5.这些东西可以去玩一玩
多模块项目的搭建
1.New Project ,直接点机下一步
2.项目名称:xxx-parent,然后finish
3.Project Structure 中Modules 点 + 号
4.New Module,next
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TauWntpC-1648082652753)(images\m16.jpg)]
5.Parent中选择xxx-parent, Name中填写xxx-dao等,建多个
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IgjgCHX2-1648082652753)(images\m17.jpg)]
xxx-web中加一个构面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v2xpqkfP-1648082652754)(images\m18.jpg)]
6.各个模块中编写相应代码,在各个pom.xml中填写依赖(注意依赖传递性和排除依赖)
Maven依赖管理和模块化
依赖管理
Maven 一个核心的特性就是依赖管理。当我们处理多模块的项目(包含成百上千个模块或者子项目),模块间的依赖关系就变得非常复杂,管理也变得很困难。针对此种情形,Maven 提供了一种高度控制的方法。
功能 | 功能描述 |
---|---|
依赖调节 | 决定当多个手动创建的版本同时出现时,哪个依赖版本将会被使用。 如果两个依赖版本在依赖树里的深度是一样的时候,第一个被声明的依赖将会被使用。 |
依赖管理 | 直接的指定手动创建的某个版本被使用。例如当一个工程 C 在自己的依赖管理模块包含工程 B,即 B 依赖于 A, 那么 A 即可指定在 B 被引用时所使用的版本。 |
依赖范围 | 包含在构建过程每个阶段的依赖。 |
依赖排除 | 任何可传递的依赖都可以通过 “exclusion” 元素被排除在外。举例说明,A 依赖 B, B 依赖 C,因此 A 可以标记 C 为 “被排除的”。 |
依赖可选 | 任何可传递的依赖可以被标记为可选的,通过使用 “optional” 元素。例如:A 依赖 B, B 依赖 C。因此,B 可以标记 C 为可选的, 这样 A 就可以不再使用 C。 |
依赖的传递性
A–>B B–>C
A–>C
依赖的优先级别
路径最短优先
路径一样的话,声明优先的原则
依赖排除
假如A依赖B,B依赖C,想要B不依赖C就在<dependency>中添加
<exclusions>
<exclusion>
<groupId>com.nf</groupId>
<artifactId>C</artifactId>
<exclusion>
</exclusions>
可选依赖
同上,排除A对C的依赖,用可选依赖也能达到同样效果,即在B依赖C的时候设置为true
依赖范围
范围 | 说明 |
---|---|
compile | 在编译,测试,运行时都需要 |
test | 测试时需要,编译和运行不需要(例如:junit) |
runtime | 测试和运行时需要,编译不需要(例如:JDBC驱动) |
provided | 编译和测试时需要,运行时不需要,由运行环境提供(例如:servlet-api) |
system | 本地依赖,不在maven中央仓库 |
生命周期
maven在构建一个项目时将一个整体的任务划分为一个个的阶段,类似一个工作流水线,按顺序依次进行,这就是maven的构建生命周期。各生命周期之间相互独立
Clean生命周期
用于在进行真正的构建之前进行一些清理工作
阶段 | 说明 |
---|---|
pre-clean | 执行清理前需要完成的工作 |
clean | 清理上一次构建过程中生成的文件,比如编译后的 class 文件等 |
post-clean | 执行清理后需要完成的工作 |
Default生命周期
定义了构建项目时所需要的执行步骤,它是所有生命周期中最核心部分,包含的阶段如下表所述,比较常用的阶段用粗体标记
名称 | 说明 |
---|---|
validate | 验证项目结构是否正常,必要的配置文件是否存在 |
initialize | 做构建前的初始化操作,比如初始化参数、创建必要的目录等 |
generate-sources | 产生在编译过程中需要的源代码 |
process-sources | 处理源代码,比如过滤值 |
generate-resources | 产生主代码中的资源在 classpath 中的包 |
process-resources | 将资源文件复制到 classpath 的对应包中 |
compile | 编译项目中的源代码 |
process-classes | 产生编译过程中生成的文件 |
generate-test-sources | 产生编译过程中测试相关的代码 |
process-test-sources | 处理测试代码 |
generate-test-resources | 产生测试中资源在 classpath 中的包 |
process-test-resources | 将测试资源复制到 classpath 中 |
test-compile | 编译测试代码 |
process-test-classes | 产生编译测试代码过程的文件 |
test | 运行测试案例 |
prepare-package | 处理打包前需要初始化的准备工作 |
package | 将编译后的 class 和资源打包成压缩文件,比如 rar |
pre-integration-test | 做好集成测试前的准备工作,比如集成环境的参数设置 |
integration-test | 集成测试 |
post-integration-test | 完成集成测试后的收尾工作,比如清理集成环境的值 |
verify | 检测测试后的包是否完好 |
install | 将打包的组件以构件的形式,安装到本地依赖仓库中,以便共享给本地的其他项目 |
deploy | 运行集成和发布环境,将测试后的最终包以构件的方式发布到远程仓库中,方便所有程序员共享 |
site 生命周期
用于生成项目报告
阶段 | 说明 |
---|---|
pre-site | 执行生成站点前的准备工作 |
site | 生成站点文档 |
post-site | 执行生成站点后需要收尾的工作 |
site-deploy | 将生成的站点发布到服务器上 |
模块化
模块化的好处
1.通过合理的模块拆分,实现代码的复用性,便于维护和管理
2.maven的模块化可分为父模块和子模块,它同样具备面向对象思想中的继承和聚合
继承
继承就是避免重复,maven的继承也是这样,它还有一个好处就是让项目更加安全
我们在项目开发的过程中,可能多个模块独立开发,但是多个模块可能依赖相同的元素,比如说每个模块都需要Junit,使用spring的时候,其核心jar也必须都被引入,在编译的时候,maven-compiler-plugin插件也要被引入
1.说到继承肯定是一个父子结构,那么我们在aggregator中来创建一个parent project
2.: 作为父模块的POM,其打包类型也必须为POM
3.结构:父模块只是为了帮助我们消除重复,所以它也不需要src/main/java、src/test/java等目录
4.新的元素: , 它是被用在子模块中的
5.元素的属性:: 表示父模块POM的相对路径,在构建的时候,Maven会先根据relativePath检查父POM,如果找不到,再从本地仓库查找
6.relativePath的默认值: …/pom.xml
7.子模块省略groupId和version: 使用了继承的子模块中可以不声明groupId和version, 子模块将隐式的继承父模块的这两个元素
参考网址https://blog.csdn.net/wanghantong/article/details/36427411
聚合
把多个项目或模块聚合到一起,可以在父模块中聚和所有的子模块,只需要在父模块的pom文件中将所有的子模块配置在中,中的每一个分别指定各个子模块的名称
<packageing></packageing>
<!- 聚合所有子模块 ->
<modules>
<module>project-m1</module>
<module>project-m2</module>
<module>project-m3</module>
</modules>
好处
使用聚合的好处就是当构建整个项目的时候,不需要为每一个子模块分别构建一次,只需要在父模块(相当于整个项目)执行一次构建命令即可,此时会将所有的子模块一并进行构建
依赖子模块
pom属性 | 说明 |
---|---|
${project.build.directory} | 项目构建输出目录,默认为target/ |
${project.build.outputDirectory} | 项目主代码编译输出目录,默认为target/classes/ |
${project.build.testOutputDirectory} | 项目测试代码编译输出目录,默认为target/testclasses/ |
${project.build.sourceEncoding} | 表示主源码的编码格式 |
${project.build.sourceDirectory} | 项目的主源码目录,默认为src/main/java/ |
${project.build.testSourceDirectory} | 项目的测试源码目录,默认为/src/test/java/ |
${project.build.finalName} | 表示输出文件名称 |
${project.version} | 表示项目版本,与${version}相同 |
${project.groupId} | 项目的groupId |
${project.artifactId} | 项目的artifactId |