Maven遵循 : Convention over Configuration 约定优于配置
文章目录
1.maven 的配置文件
1.1 加载顺序
~/.m2/setting.xml -> conf/setting.xml(maven解压包里面的)
1.2 配置setting.xml
#本地仓库地址
<localRepository>/path/to/local/repo</localRepository>
#镜像下载,相比普通的下载,
<mirrors>
#阿里提供的镜像仓库下载更加快
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
#其他镜像仓库
<mirror>
<id>ui</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://uk.maven.org/maven2/</url>
</mirror>
<mirror>
<id>osc</id>
<mirrorOf>central</mirrorOf>
<url>http://maven.oschina.net/content/groups/public/</url>
</mirror>
<mirror>
<id>osc_thirdparty</id>
<mirrorOf>thirdparty</mirrorOf>
<url>http://maven.oschina.net/content/repositories/thirdparty/</url>
</mirror>
</mirrors>
1.3 setting.xml的其他配置
可以百度下,或者看setting.xml中的英文说明。
2.Maven的插件运行机制
Maven的所有构成都是由plugin构成。
在这个包中,${M2_HOME}/lib/maven-model-builder-3.0.4.jar,打开该文件,能找到超级父POM:\org\apache\maven\model\pom-4.0.0.xml,它是所有Maven POM的父POM,所有Maven项目都继承该配置。
具体可以参考:http://www.cnblogs.com/AlanLee/p/6208562.html
3.Maven的pom.xml
<!-- 指的就是上面的超级父pom -- >
<modelVersion>4.0.0</modelVersion>
<!-- 用坐标的方式来唯一定制jar的唯一性 -- >
<groupId>com.vison</groupId> <!-- 公司域名倒写 -- >
<artifactId>testhttps</artifactId> <!-- 功能命名 -- >
<version>0.0.1-SNAPSHOT</version> <!-- 版本号 -- >
<!-- 父类型都为pom类型 jar内部调用或者是作服务使用 war需要部署的项目-- >
<packaging>jar</packaging> <!-- 打包方式默认是jar 项目的打包类型有:pom、jar、war、maven-plugin等-- >
<parent></parent> <!-- 配置父工程的坐标 -- >
<!-- 这个是定义变量,一般可以在父pom文件中定义版本号 -- >
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencyManagement></dependencyManagement> <!-- 只能放在父pom文件中 -- >
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- scope的值定义
* compile,默认值,适用于所有阶段,会随着项目一起发布,会打包
* provided,类似compile,期望JDK、容器或使用者会提供这个依赖,其他提供后采用。如servlet.jar,不会打包
* runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段,与compile相比,跳过了编译而已,会打包
* test,只在测试时使用,用于编译和运行测试代码。不会随项目发布, 不会打包
* system,类似provided,需要显式提供包含依赖的jar,通过 systemPath指定路径;一般都不会用 Maven不会在Repository中查找它
* 具体可以参考 https://www.cnblogs.com/hzzll/p/6738955.html
-- >
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<!-- exclusions 排除包中依赖的包,例如排除依赖包中的日志包 -- >
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
其他:
1)依赖仲裁
当一个模块同时依赖了两个相同的jar包,最终选择哪个jar,取决于如下两个准则:
- 最短路径原则
- 加载先后原则
2)scope的传递
第一列表示直接依赖的scope,第一行表示间接依赖的scope
compile | test | provided | runtime | |
---|---|---|---|---|
compile | compile | - | - | runtime |
test | test | - | - | test |
provided | provided | - | provided | provided |
runtime | runtime | - | - | runtime |
4.版本管理
4.1 1.0-SNAPSHOT命名
SNAPSHOT是快照版本,不稳定版本,如果依赖包中有SNAPSHOT版本,要更新这个包可以两种方式:
- 1)删除本地repository
- 2)执行命令:mvn clean package -U (强制拉一次)
如果要发布上线,一定是要用RELAESE版本。
具体的release和snapshot 区别可以参考:
https://blog.csdn.net/yxz8102/article/details/80975542
4.2 版本名称
主版本号.次版本号.增量版本号-<里程碑版本>
1.0.0-RELAESE
5.Maven的生命周期
1)层级关系:lifecycle/phase/goal;
- A Build Lifecycle is Made Up of Phases(Lifecycle 是由phase构成)
- A Build Phase is Made Up of Plugin Goals(Phase 是由Goals构成)
Maven有三套相互独立的生命周期,分别是clean、default和site。每个生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。执行后面的phase会把之前的全都执行。
- clean:清理上一次构建生成的文件
- compile:编译项目的源代码。
- package:把已编译的代码打包成可发布的格式,比如jar。
- site:生成项目站点文档
2)插件可以放在生命周期某个地方执行
6. Maven常用命令
- compile 编译成class文件
- clean 删除target/
- test 运行test文件内容
- package 打包
- install 把项目install到 local repo;如果是多模块都需要先install,因为其他模块引用的是jar包,而不是编译后target中的class文件。
- deploy 把本地jar发布到remote