声明: 1. 本文为我的个人复习总结, 并非那种从零基础开始普及知识 内容详细全面, 言辞官方的文章
2. 由于是个人总结, 所以用最精简的话语来写文章
3. 若有错误不当之处, 请指出
-
Maven 是一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理
依赖, 就是jar包的意思
Make→Ant→Maven→Gradle→其他……
-
安装好后
-
设置Path变量
-
设置镜像网站
-
修改JDK版本
-
修改本地仓库
-
-
构建环节(构建不等于搭建)
①清理:删除以前的编译结果,为重新编译做好准备。
②编译:将 Java 源程序编译为字节码文件。
③测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
④报告:在每一次测试后以标准的格式记录和展示测试结果。
⑤打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应 jar 包,Web工程对应 war 包。 mvn source:jar是单独打包源码(类路径下),不含其他所用jar包
⑥安装:在 Maven 环境下特指将打包的结果 jar 包或 war 包安装到本地仓库中。
⑦部署:将打包的结果部署到远程仓库或将 war 包部署到服务器上运行。
-
jar 包冲突时:
①路径最短者优先
②路径相同时先声明者优先
即最短路径优先, 先声明者优先
-
<propertie>中属性可以重写父亲中的内容
-
生命周期
11.1 什么是 Maven 的生命周期
Maven 生命周期定义了各个构建环节的执行顺序,有了这个清单,Maven 就可以自动化的执行构建
命令了。
Maven 有三套相互独立的生命周期,分别是:
①Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
②Default Lifecycle 构建的核心部分,编译,测试,打包,安装,部署等等。
③Site Lifecycle 生成项目报告,站点,发布站点。
再次强调一下它们是相互独立的,你可以仅仅调用 clean 来清理工作目录,仅仅调用 site 来生成站点。
当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期。
每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。
比如,运行 mvn clean,这个 clean 是 Clean 生命周期的一个阶段。有 Clean 生命周期,也有 clean 阶段。
11.2 clean 生命周期
Clean 生命周期一共包含了三个阶段:
①pre-clean 执行一些需要在 clean 之前完成的工作
②clean 移除所有上一次构建生成的文件
③post-clean 执行一些需要在 clean 之后立刻完成的工作
11.3 Site 生命周期
①pre-site 执行一些需要在生成站点文档之前完成的工作
②site 生成项目的站点文档
③post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
④site-deploy 将生成的站点文档部署到特定的服务器上
这里经常用到的是 site 阶段和 site-deploy 阶段,用以生成和发布 Maven 站点,这可是 Maven 相当强
大的功能,Manager 比较喜欢,文档及统计数据自动生成,很好看。
11.4 Default 生命周期
Default 生命周期是 Maven 生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,
只解释一些比较重要和常用的阶段:
validate
generate-sources
process-sources
generate-resources
process-resources 复制并处理资源文件,至目标目录,准备打包。
compile 编译项目的源代码。
process-classes
generate-test-sources
process-test-sources
generate-test-resources
process-test-resources 复制并处理资源文件,至目标测试目录。
test-compile 编译测试源代码。
process-test-classes
test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
prepare-package
package 接受编译好的代码,打包成可发布的格式,如 JAR。
pre-integration-test
integration-test
post-integration-test
verify
install 将包安装至本地仓库,以让其它项目依赖。
deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享或部署到服务器上运行。
11.5 生命周期与自动化构建
运行任何一个阶段的时候,它前面的所有阶段都会被运行,例如我们运行 mvn install 的时候,代码会
被编译,测试,打包。这就是 Maven 为什么能够自动执行构建过程的各个环节的原因。此外,Maven
的插件机制是完全依赖 Maven 的生命周期的,因此理解生命周期至关重要
-
插件与目标
●Maven 的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。
●每个插件都能实现多个功能,每个功能就是一个插件目标。
●Maven 的生命周期与插件目标相互绑定,以完成某个具体的构建任务。
-
dependencyManagement(只是做个声明并不是直接导入jar包到该工程以及子模块, 在子模块里实际用到jar包时, 才真正进行导入; 常用来父工程里做依赖的版本管理)
-
import(对单继承的扩展, 相当于多继承懒模式导入一些jar包)
-
继承
是为了让父pom的 dependencyManagement能替他管理jar包版本,
以及继承父pom的 dependency中的jar包
-
聚合
是为了一键操作,让父亲(未必一定是父亲),不是父子也可以发生聚合,缕清孩子们之间的打包顺序, 为了快速的构建项目(构建不是搭建)
-
scope,默认为compile,也是活的最久的
-
坑处:
- system不用管, 它只从本地仓库找jar包,不会从maven中央仓库找jar包
- test, provided都会阻断依赖的传递
- 所以想进行传递的依赖都会被打包进去, 建议想只在idea里用&&又想依赖传递
- parent工程里需要去掉spring-boot的maven打包插件,因为里插件会继承, 不然子模块里的非服务工程会报找不到main.class
- SpringBoot打包, 祖先工程为spring-boot-starter-parent,且使用专用的maven打包插件
- maven的某个jar包不想依赖传递,千万别用scope provide的方式,因为这样会在运行期类不起作用,报ClassNotFoundException,可以使用true的方式阻止依赖传递
- 打包是在运行后面的
-
打包时跳过单元测试:
mvn package -DskipTests,不执行测试用例,但编译测试用例类到target/test-classes下。
mvn package -Dmaven.test.skip=true,不执行测试用例,也不编译测试用例类。
-
maven安装jar包到本地
mvn install:install-file -Dfile=E:\\phoenix-core-5.0.0-HBase-2.0.jar -DgroupId=org.apache.phoenix -DartifactId=phoenix-core -Dversion=5.0.0-HBase-2.0 -Dpackaging=jar
-
打包用的shade插件
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <!-- 修改Main类名 --> <mainClass>com.hellosrc.count.BiliBiliTimeCountMain</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build>