查看原文
maven--一种项目自动化构建工具
- 所谓自动构建,那eclipse举例,eclipse是半自动构建。
- 全自动构建:包括编译(.java --> .class )、部署(Java project --> Web Project )、jar管理,项目管理等等
- 半自动构建:eclipse只能做到编译和部署
- 自动化构建工具有:Make -> Ant -> Maven -> Gradle(从旧到新,Make和Ant已淘汰),Maven主流,用xml配置,Gragle使用自己的语言Groovy配置。
基本概念
- 仓库
总仓库有着几乎全世界的jar包,备份到n个镜像上,分布在世界各地,你可以指定一个离你最近的镜像(如阿里云镜像),写项目时所有用到的jar包(除了jdk)都由maven管理。不用每次都复制粘贴到项目的lib文件夹中, maven首先在本地仓库找,找不到就去私服(局域网,使用nexus搭建)找,再找不到才去镜像(中央仓库)下载。项目也可以放在本地仓库中
- 目录结构
maven目录结构为:(以下均为文件夹)
src
main
java
包
resources
配置文件
** test**
java
包
resources
配置文件
** pom.xml**
src存放源代码,main是项目代码,java下面就是各个包了,resource是配置文件。
test是测试代码,内容结构和main一样。
与src同级的是maven配置文件pom.xml。
测试:
package com.ezeta.maven
import org.junit.Test
public class HelloWorld{
Hello hel = new Hellp();
//随便调用Hello类一个方法,取得String类型返回值
String returns = hel.returnmathod();
//测试返回值是否是“success”
assertEquals("success",returns);//此步称之为【断言】
}
在maven进行test时,会汇报有多少断言通过,有多少失败。
配置文件(pom.xml)
这个很重要,maven就靠这个来运行
pom.xml是项目对象模型,和dom对比区别在于dom是如html当中一个标签为一个对象。
pom结构
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.1.5.RELEASE
com.ezeta
signSystem
0.0.1-SNAPSHOT
signSystem
jar
11.0
mysql
mysql-connector-java
com.alibaba
druid-spring-boot-starter
1.1.13
org.springframework.boot
spring-boot-maven-plugin
org.apache.maven.plugins
maven-surefire-plugin
2.4.2
true
(未完待补)
常用命令(cmd需在项目pom.xml所在目录执行)
- mvn compile --编译main目录中的java文件
- mvn test --测试(编译test目录的java文件)
- mvn package --打包,java文件打包成jar/war/pom(测试通过才能打包)
- mvn install --将开发的模块放入本地仓库,供其他模块使用(放入的位置由GAV决定)
- mvn clean --删除target(编译文件)目录
- update project --在pom.xml配置完新的依赖后,需要右键项目->Maven->update project来更新依赖
ps:在eclipse中,右键pom.xml点击Run as->Maven build...在Goals里面写上命令,Eclipse就会自动执行命令行(此处不需要写mvn,直接写命令即可),再次点击Run as->****Maven build就可以执行上一次命令。
Maven生命周期
举个例子:在Maven命令中,有个package命令,执行后会发现Console里面实际执行了四个个命令:
(resource->compile->test->package),这就是生命周期。
- 当Maven中存在一个命令生命周期顺序:A命令 B命令 C命令 D命令 E命令
执行D命令,实际执行:A B C D
- 生命周期包含三个阶段(了解):
clean lifecycle:清理
pre-clean clean post-clean
default lifecycle
有非常多命令,省略。。
site lifecycle:站点(发布)
pre-site site post-site site -dedeploy
依赖
- 依赖
形如pom.xml中
这种就是依赖,即对jar包的依赖。这里省略了 ,三个标签即GAV来定位jar包。
2. **依赖有效性**
先看这段依赖:
```xml
junit
junit
4.0
test
compile(不声明则默认这个),test,provided。区别是:
原因:Maven在编译、测试、运行时,各自使用一套不同的classpath。
举个例子,如果我写了个Servlet,此时需要用到Servlet-api.jar,那么我编译时(主程序)会用到这个jar,测试时也会,但是部署时(运行)就不需要了(因为tomcat自带Servlet-api.jar),所以我可以将有效性设置为provide。
- 依赖排除
当B.jar依赖于A.jar时,引入B.jar会自动引入A.jar,如果此时依赖是部分依赖,而我只需要没有依赖的部分,那么我引入B.jar时,就不需要A.jar,此时就需要将A.jar排除。
org.springframework
spring-context
4.3.18.RELEASE
org.springframework
spring-beans
org.springframework
spring-aop
如上,在dependency标签GAV下面写exclusions标签,标签内写n个exclusion标签,里面是需要排除的jar包的GA(通常不写V,因为排除的肯定是依赖同版本的)。
- 依赖传递性
如果A.jar->B.jar->C.jar;
那么A.jar->C.jar的充要条件是:但且仅当B.jar->C.jar的范围(有效性)是compile。
- 依赖原则
- 路径最短优先原则
b. 路径相同的情况下:
i. 在同一个pom.xml中(路径长度相同),有两个相同的jar(版本不同),则后面声明的覆盖前面声明的。 (但是原则上严格禁止在同一个pom中有两个版本不同的依赖)。
ii. 在不同的pom.xml中(路径长度相同),分别有两个相同的jar(版本不同),则前面声明的覆盖后面声明的 (反过来了)。
项目整合
Maven可以将多个项目整合成一个项目,当项目A->项目B时,两者需要通信,只需:1.将A执行install命令(将项目A打包到仓库中);2.然后让B依赖(配置)A就行了。
这里需要注意一下:由于Maven的“约定由于配置”,假如B在cn.hello包下的类,依赖调用了A当中cn.hello包下类,此时不需要import,因为Maven已将同样包名的类打包到了一起(哪怕不是同一个文件、甚至不是同一个项目)。
同一版本&编码
- 统一JDK版本
用
- 统一依赖版本&编码
一般用变量的方式,动态管理版本。在
4.0.0
com.ezeta
signSystem
0.0.1-SNAPSHOT
signSystem
11.0
UTF-8
1.2.3
1.1.13
mysql
mysql-connector-java
${cn.ezeta.jdbc.version}
com.alibaba
druid-spring-boot-starter
${cn.ezeta.druid.version}
将properties标签写在pom上面,随意命名一个标签(名字最好显而易见,方便他人知道是什么依赖的版本),标签内容即版本号,然后在依赖标签的
继承
在依赖传递时,需要compile约束,如果使用继承,则子工程可以使用父工程所有依赖。
如A->(继承)B,则A能使用B的所有依赖(jar),不用管什么compile。
但通常用于更好的版本管理
这里需注意:父工程打包方式需要是“pom”(不是jar,不是war)。
- 在父工程中
...
需要再
- 子工程的配置见例子
- 子工程需要声明要用到父工程哪些依赖。
聚合
前面说到,如果A->B则需要将Binstall到仓库中,A才能依赖B,但是如果A依赖很多很多项目,一个个install太麻烦
所以有了聚合
聚合有个前 置条件:聚合需要配置在一个总工程里面,这个总工程也需要pom方式打包
配置方式:
4.0.0
com.ezeta
project
0.0.1-SNAPSHOT
project
../A
../B
../C
在
聚合的本质就是,对总工程进行什么操作,就相当于对所有聚合工程按合适的顺序依次或同时进行一样的操作(如install,package等等)
部署Web项目
标签配置cargo插件 - mvn命令deploy(部署)
实际开发中,还是不太会用cargo,一般还是开发工程师打包成war包后交给实施工程师部署。