《Maven 实战》总结

1、maven不仅是一款优秀的构建工具,而且是一款优秀的依赖管理工具和项目信息管理工具。
构建体现在从清理、编译、测试到生产文档,再到打包、部署,maven都可以帮助使用者快速完成。依赖管理体现在可以从一个中央仓库下载、上传jar文件。项目信息管理体现在可以通过maven的一些插件获取项目的信息如:测试报告、静态分析报告。
2、尽量不要使用IDE自带的Maven插件,设置成本地的安装路径,这样做的目的是有两点
    1)IDE自带的Maven插件一般是最新的,一般不太稳定
    2)通常我们都会用到命令行,如果使用IDE自带的Maven插件,两者的版本可能不一致,这样会导致构建的过程有差别
3、pom.xml文件下常见的标签
    modleVersion:POM模型对象的版本(Maven 2、3的版本为4.0.0)
    groupId:所属组,一般为公司域名+实际项目名(如:com.zbj.alg.commons)
    artifactId:所属组中的唯一id
    version:版本号(如:1.0.0-SNAPSHOT)
    name:项目名
    packaging:打包方式,如:jar、war,默认为jar
    properties:包含多个property
    property:全局变量,如jdk版本、maven.test.skip等
    dependencies:包含多个dependency
    dependency:包含一个依赖项目的信息,如:groupId、artifactId、version等
    scope:依赖范围,详情可参考第7点
    type:依赖类型,如:jar、war,默认为jar
    build:包括项目的源码目录配置,输出目录配置,插件配置,插件管理配置
    plugins:包含多个plugin
    plugin:某插件配置。常见的配置包括compiler插件(用来指定编译的jdk版本)、assembly插件、war插件、tomcat7插件、springBoot插件
    distributionMenagement:项目的部署配置,通常在在该标签下配置release版本的,SNAPSHOT版本的
    
4、创建Maven项目时,需要在根目录下创建一个pom.xml文件,此时还没有任何的java代码,从耦合度上来说,这实现了项目对象模型与java代码的解耦。
5、在Maven中有一个约定(习惯)由于配置的理念,该理念在SpringBoot中也十分重要,意思是使用Maven来构建项目的时候采用Maven默认的配置即可,无须人为地再配置一些参数。比如,默认情况下,主源码放在src/main/java目录下,测试
    代码放在src/test/java目录下,资源放在src/main/resources目录下,Maven构建的输出放在target目录下(比如主源码编译后放在target/classes下,测试代码编译后放在target/test-classes下)。
    
6、依赖范围
Maven中定义了三种classpath,编译项目主源码时需要用到一套classpath,编译和运行测试代码用到一套classpath,运行项目又用到一套classpath。
依赖范围就是用来控制依赖与三种classpath(编译主源码classpath,测试classpath,运行classpath)的关系。
compile:对于三种classpath都有效
test: 对于测试classpath有效(包括编译和运行测试代码)。
provided: 对编译和测试classpath有效,对于运行classpath无效。典型的例子就是servlet-api,编译和测试的时候需要,但是当项目部署到容器后由容器提供。
runtime: 对于测试classpath和运行classpath有效,只对运行时classpath有效,典型的例子是JDBC驱动实现。编译时只需要JDK提供的JDBC接口,到了执行测试或者运行项目时才需要具体的JDBC实现类。
system: 作用范围与provided一致。不过使用system依赖范围时必须sysPath显示地指定依赖文件的路径(本地的,Maven仓库之外的类库)
7、传递性依赖:A依赖B,B依赖C,那么A自动依赖C。该原则带来的好处是只关注当前依赖什么。
8、依赖调解:A->B->D(1.x.x) A->C->D(2.x.x),该种情况下,传递性依赖带来了一个问题,依赖同一个包的不同版本怎么办?Maven提供了两条原则。第一原则:路径最近优先。若路径长度一样,则使用第二原则:第一声明者优先。
9、由于传递性依赖的机制,项目中的依赖会很繁琐,若是需要排除依赖或者产看依赖列表,会更加头疼。此时使用一款插件来管理依赖是十分有效的手段。这里推荐使用Maven Helper,获取方式参照《IDEA常用插件推荐》
10、任何项目中直接使用的依赖最好显示声明。
11、Maven仓库分为本地仓库和远程仓库,远程仓库又分为中央仓库、私服、其他公共仓库(如阿里远程仓库)。查找依赖的顺序是先到本地仓库查找,若没有则到远程仓库下载。大多数的路径与坐标的对应关系用一个表达式即可概括:
/groupId/artifactId/version/artifactId-version.packaging
12、生命周期
Maven有三套相互独立的周期,它们分别是clean、default、site。
(1)clean生命周期
clean生命周期的目的是清理项目,它包含三个阶段:
1)pre-clean 执行一些清理前需要完成的工作
2)clean 清理上一次构建生成的文件
3)post-clean 执行一些清理后需要完成的工作
(2)default生命周期
default生命周期定义真正构建项目时需要执行的阶段,它是生命周期中最核心的部分,它包含多个阶段,只对重要的阶段加以描述,感兴趣的请查询官网。
process-sources:处理项目主资源文件
compile:编译主源码
process-test-sources:处理测试资源文件
test-compile:编译项目测试代码
test:使用单元测试框架进行单元测试,测试代码不会被打包或部署
package:打包项目成packaging格式,如jar、war
install:将包安装到本地Maven仓库,供本地其他Maven项目使用
deploy:将包上传到远程Maven仓库,供其他开发人员使用
(3)site生命周期
site生命周期的目的是建立和发布项目站点。
pre-site 执行一些在项目站点生成之前需要完成的工作
sit    生成项目站点文档
post-site 执行一些项目站点生成之后需要完成的工作    
site-deploy 将生成的项目站点发布到服务器上
需要注意的是,执行某一生命周期的某一阶段不会影响到其他生命周期。
13、命令行、生命周期、插件任务
Maven中定义了生命周期以及它包含的阶段,但是这些阶段是抽象的,就像接口一样,具体的实现由插件任务来完成。Maven命令的作用就像桥梁一样,每一个命令对应某些生命周期的阶段,调用绑定的插件任务来执行对应的阶段。
14、Maven中的常见命令
    执行打包安装命令需要涉及到的任务:
    清理target目录(clean:clean) -> 处理主资源(resources:resources) -> 编译主源码(compiler:compile) -> 处理测试资源(resources:testResources) -> 编译测试代码(compiler:testCompile)  -> 执行测试代码(surefire:test) -> 打包(jar:jar) -> 安装(install:install)
mvn clean compile : clean:clean -> resources:resources -> compiler:compile -> resources:testResources -> compiler:testCompile
mvn clean test : clean:clean -> resources:resources -> compiler:compile -> resources:testResources -> compiler:testCompile -> surefire:test
mvn clean package : clean:clean -> resources:resources -> compiler:compile -> resources:testResources -> compiler:testCompile -> surefire:test -> jar:jar
mvn clean install : clean:clean -> resources:resources -> compiler:compile -> resources:testResources -> compiler:testCompile -> surefire:test -> jar:jar -> install:install    
15、往往一个项目会被分成多个模块进行开发,Maven的聚合特性能将多个模块聚合在一起构建,Maven的继承特性能够抽取各个模块相同的依赖和插件,在简化POM的同时,还能促进各个模块配置的一致性。
16、常用maven插件简介
1)maven-compiler-plugin:该插件是用来编译源代码的。maven3.0开始,默认的编译器支持编译jdk1.6,所以如果你使用的jdk版本大于1.6就可以使用该插件来指定编译的jdk版本。
2)tomcat7-maven-plugin:通过Tomcat容器操纵war项目。主要用途是使用该插件运行war项目,而无需将其部署到Tomcat中。
3)maven-assembly-plugin:可以控制打包的类型并且可以在打包时将依赖的jar包解压,放入到包中。
4)maven-war-plugin:可以灵活控制war包打包过程,比如过滤资源文件,依赖包等等。
5)spring-boot-maven-plugin:在工程打包之后,重新打包为可执行的jar/war包,通过java -jar的方式即可运行(多用于将tomcat嵌入到应用中)。

17、pom.xml中常用的两个内置属性,${basedir}表示根目录,${version}表示项目版本

你可能感兴趣的:(Maven)