Maven
1. 简介
- 1. 简介
- 2. 安装
- 3. 目录结构
- 4. 生命周期(Lifecycle)
- 5. 仓库
- 5.1 作用
- 5.2 分类
- 6. 坐标
- 6.1 作用
- 6.2 格式
- 7. 依赖
- 7.1 简介
- 7.2 配置排除依赖
- 7.3 依赖范围
- 7.4 依赖冲突
- 8. 聚合
- 9. 继承
- 9.1 作用
- 9.2 父 pom 配置
- 9.3 子 pom 配置
- 10. pom.xml
- 10.1 打包类型:packaging
- 10.2 其他
- 10.3 properties
- 10.4 作用域 scope
- 10.4 版本号 version
- 10.5 打包执行的插件 build
- 10.5.1 build 标签分类
- 10.5.1.1 全局配置(project build)
- 10.5.1.2 环境配置(profile build)
- 10.5.2 配置说明
- 10.5.2.1 基本元素
- 10.5.2.2 Resources 配置
- 10.5.3 plugins 配置
- 10.5.4 pluginManagement 配置
- 一款帮助程序员构建项目的工具,我们只需要告诉 Maven 需要哪些 jar 包,它会帮助我们下载所有的 jar,极大提升开发效率。
- 可从本地仓库或远程仓库(默认为 MvnRepository)中自动导入 jar 包。
- 同一 jar 包资源路径,版本管理,统一项目结构,第三方良好的集成。
- 通过联网在远程仓库下载的 jar 包,会存储至本地仓库(默认c:\User\用户名.m2)。
- 是一种 XML 标记语言。
- 可以使用指定的 Maven 版本,或使用 IDEA 自带的 Maven(版本3.3.9)。
- 使用指定的 Maven 版本:需要配置环境变量,第一个变量的变量名为 M2_HOME 或 MAVEN_HOME,值为 maven 的路径。第二个变量名为 Path,值为 %MAVEN_HOME%\bin。
- 使用 IDEA 自带的 Maven 版本:无需配置。
- 若要使用 Maven,那么项目的目录结构必须符合 Maven 的规范。
- project:存放 pom.xml(Maven 项目的配置文件)和所有的子目录。
- project/src/main/java:存放项目的 java 源代码。
- project/src/main/resources:存放项目资源文件(如:property 文件)
- project/src/main/webapp:web 项目的根目录。
- project/src/test/java:存放单元测试源代码(如:JUnit)。
- project/src/test/resources:存放单元测试资源文件。
- project/target:存放打包(编译)后的项目文件。
- 清空:clean
- 验证:validate
- 编译:compile
- 测试:test
- 打包:package
- 核实:verify
- 安装,重新下载 jar 包:install
- 站点,显示 jar 包来源:site
- 部署:deploy
- 用来存放 Maven 管理的所有 Jar 包。
- 当项目编译时,Maven 首先从本地仓库中寻找项目所需的 Jar 包,若本地仓库没有,再到 Maven 的中央仓库下载所需 Jar 包。
- 本地仓库:本地的 Jar 包仓库。
- 中央仓库:官方提供的远程仓库(默认为:MvnRepository)
- 是 Jar 包的唯一标识,Maven 通过坐标在仓库中找到项目所需的 Jar 包。
- 添加时,添加至 pom.xml 的
所需Jar包的项目名
所需Jar包的模块名
jar
所需Jar包的版本号
test(依赖范围)
7. 依赖
7.1 简介
- 传递依赖:如果引用了一个 Jar 包,而该 Jar 包又引用了其他 Jar 包,那么在默认情况下项目编译,Maven 会把直接引用和间接引用(传递引用)的 Jar 包都下载到本地。
- 排除依赖:如果只想下载直接引用的 Jar 包,那么需要在 pom.xml 中进行配置。
需排除Jar包的项目名
需排除Jar包的模块名
pom
需排除jar包的版本号
7.3 依赖范围
- 在项目发布过程中,帮助决定哪些构件被包括进来。
- 若项目中多个 Jar 同时引用了相同的 Jar 时,会产生以来冲突,但 Maven 采用了两种避免冲突的策略,因此在 Maven 中是不存在依赖冲突的。
- 短路优先:本项目->A.jar->B.jar->X1.1.jar、本项目->C.jar->X1.0.jar。若本项目引用了A.jar,A.jar又引用了B.jar,B.jar又引用了X1.1.jar,并且C.jar也引用了X1.0.jar。此时,Maven 只会引用路径最短的 X1.0.jar。
- 声明优先:若引用长度形相同时,在 pom.xml 中谁先被声明,就使用谁。
- 作用:将多个项目同时运行就称为聚合。
- 实现聚合:在 pom 中进行配置:
web-connection-pool
web-java-crawler
9. 继承
9.1 作用
- 在聚合多个项目时,如果这些被聚合的项目中需要引入相同的 Jar,那么可以将这些 Jar 写入父 pom 中,各个子项目继承该 pom 即可。
- 可以通过标签来整合子模块的编译顺序。
- 可以将一些子项目中共用的依赖或将其版本统一写到父级配置中,以便统一管理。
- groupId、artifactId、version 可直接继承,减少子项目的 pom 配置。
- 父级的 pom 文件只作项目的子模块的整合,在 maven install 时不会生成 jar/war压缩包。
- 将父级项目的 pom.xml 文件的 packaging 配置设为 pom。
- 将需要继承的 jar 包的坐标放入标签即可。
需继承的Jar包的项目名
需继承的Jar包的模块名
pom
需继承的jar包的版本号
9.3 子 pom 配置
父pom所在项目的groupId
父pom所在项目的artifactId
父pom所在项目的版本号
10. pom.xml
10.1 打包类型:packaging
- jar:默认,将所有 java 文件编译为 .class 文件,且按照原来的层级结构放置,最终压缩为一个 jar 文件。一般是内部调用或作为服务使用。
- war:将所有 java 文件编译为 .class 文件,且将项目中依赖的所有 jar 包放在 WEB-INF/lib 文件夹,最终压缩为一个 war 包。一般用于部署。
- pom:聚合、且父类都为 pom
- 协议版本:model/Version
- 公司名称:name
- 公司地址:url
- 依赖集合:dependencies
- 依赖:dependency
- 可在其中配置自定义属性
- 配置:值
- 调用属性的值:${属性名}
- compile:默认的scope,表示 dependency 都可以在生命周期中使用。而且,这些 dependencies 会传递到依赖的项目中。适用于所有阶段,会随着项目一起发布。
- provided:跟 compile 相似,但是表明了 dependency 由JDK或者容器提供,例如 Servlet API和一些 Java EE APIs。这个 scope 只能作用在编译和测试时,同时没有传递性。
- runtime:表示 dependency 不作用在编译时,但会作用在运行和测试时,如 JDBC 驱动,适用运行和测试阶段。
- test:表示 dependency 作用在测试时,不作用在运行时。只在测试时使用,用于编译和运行测试。不会随项目发布。
- system:跟 provided 相似,但是在系统中要以外部 JAR 包的形式提供,maven 不会在 repository 查找它。
- SNAPSHOT(快照版本):动态监测,非稳定版本
- RELEASE(正式版本):根据版本号监测,版本号一致则不更新,稳定版本
build 标签根据作用域分为以下两类:
10.5.1.1 全局配置(project build)针对整个项目的所有情况都有效
...
…
...
10.5.1.2 环境配置(profile build)
针对不同的 profile 配置
...
…
...
10.5.2 配置说明
10.5.2.1 基本元素
install
${basedir}/target
${artifactId}-${version}
filters/filter1.properties
...
- defaultGoal:执行 build 任务时,如果没有指定目标,将使用的默认值。如上配置,在命令行中执行 mvn,则相当于执行 mvn install。
- directory:build 目标文件的存放目录,默认在 ${basedir}/target 目录.
- finalName:build 目标文件的名称,默认情况为 ${artifactId}-{version}
- filter:定义 *.properties 文件,包含一个 properties 列表,该列表会应用到支持 filter 的 resources 中。也就是说,定义在 filter 的文件中的 name=value 键值对,会在 build 时代替 ${name} 值应用到resources 中。maven 的默认 filter 文件夹为 ${basedir}/src/main/filters
...
META-INF/plexus
false
${basedir}/src/main/plexus
configuration.xml
**/*.properties
...
...
用于包含或者排除某些资源文件
- resources:一个 resources 元素的列表。每一个都描述与项目关联的文件是什么和在哪里
- targetPath:指定 build 后的 resource 存放的文件夹,默认是 basedir。通常被打包在 jar 中的 resources 的目标路径是META_INF
- filtering:true/false,表示为这个 resource,filter 是否激活
- directory:定义 resource 文件所在的文件夹,默认为:${basedir}/src/main/resources
- includes:指定那些文件将被匹配,以 * 作为通配符。
- excludes:指定那些文件将被忽略。
- testResources:定义和 resource 类似,只不过在 test 时使用。
...
org.apache.maven.plugins
maven-jar-plugin
2.0
false
true
test
...
...
用于指定使用的插件
- GAV:指定插件的标准坐标。
- extensions:是否加载 plugin 的 extensions,默认为 false。
- inherited:true/false,这个 plugin 是否应用到该 pom 的孩子 pom,默认为true。
- configuration:配置该 plugin 期望得到的 properties。
- dependencies:作为 plugin 的依赖。
- executions:plugin 可以有多个目标,每一个目标都可以有一个分开的配置,可以将一个 plugin 绑定到不同的阶段。假如绑定 antrun:run 目标到 verify 阶段。
...
org.apache.maven.plugins
maven-jar-plugin
2.2
pre-process-classes
compile
jar
pre-process
...
pluginManagement的配置和plugins的配置是一样的,只是用于继承,使得可以在孩子pom中使用。 则在子pom中,我们只需要配置:
...
org.apache.maven.plugins
maven-jar-plugin
...