Maven
每个依赖都可以包含以下元素:
- groupId、artifactId 和 version:依赖的基本坐标,对于任何一个依赖来说,基本坐标是最重要的,Maven 根据坐标才能找到需要的依赖。
- type:依赖的类型,对应于项目坐标定义的 packaging。大部分情况下,该元素不必声明,其默认值是 jar。
- scope:依赖的范围。
- optional:标记依赖是否可选。
- exclusions:用来排除传递性依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
基础常用命令
mvn compile 编译,将Java 源程序编译成 class 字节码文件。
mvn test 测试,并生成测试报告
mvn clean 将以前编译得到的旧的 class 字节码文件删除
mvn pakage 打包,动态 web工程打 war包,Java工程打 jar 包。
mvn install 将项目生成 jar 包放在仓库中,以便别的模块调用
type
type:指明依赖需要引入的类型(jar、war、pom等),默认jar。
scope范围
compile 默认依赖范围,编译的时候和打包的时候把此依赖加入
provided 编译和测试的加入,打包的时候不加入.例如:serveltapi在tomcat中有存在,打包的时候则不需要
runtime 编译的时候不加入,运行的时候加入依赖
system 和provide相同,不过被依赖项不会从maven仓库抓,而是从本地系统文件拿,一定要配合systemPath使用
test 只有在测试的时候加入,对应编译时对应src/test中代码时也才会加入
import 指明依赖需要引入的类型(jar、war、pom等)默认jar。必须要声明<type>pom</type>。
system示例
<dependency>
<groupId>org.xx</groupId>
<artifactId>xx-jar</artifactId>
<version>1.1.1</version>
<scope>system</scope>
<systemPath>${basedir}/WebContent/WEB-INF/lib/xx-jar-1.1.1.jar</systemPath>
</dependency>
option
两个项目A和B,其中A为父项目,B为子项目。在父A项目中引入了单元测试的依赖,optional元素默认值(false)
如果项目B不需要Junit的jar包,那么在其pom文件中不需进行任何处理便可以。如果B项目也需要对应的jar包依赖,可以有两种选择:第一、A项目中对应依赖的optional设置为false或去掉;第二、B项目中直接引入需要的该依赖。
依赖搜索顺序原则
1. 从本地仓库查找构件,如果没有找到,跳到第 2 步,否则继续执行其他处理。
2. 从中央仓库查找构件,如果没有找到,并且已经设置其他远程仓库,然后移动到第 4 步;如果找到,那么将构件下载到本地仓库中使用。
3. 如果没有设置其他远程仓库,Maven 则会停止处理并抛出错误。
4. 在远程仓库查找构件,如果找到,则会下载到本地仓库并使用,否则 Maven 停止处理并抛出错误。
最短路径,最先声明
最短路径如
A->B->C->D
A-E->D
则A依赖E中的D
最先声明
A->B->C
A->D->C
此时路径一致,看pom中谁先声明C,就取谁
聚合
我们可以使用聚合,一次编译多个项目模块
新建简单pom项目
注意:选择packing为pom
<artifactId>Parent</artifactId>
<groupId>com.parent</groupId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
然后导入模块
<modules>
<module>A</module>
<module>B</module>
</modules>
继承
<parent>
<artifactId>Parent</artifactId>
<groupId>com.parent</groupId>
<version>1.0-SNAPSHOT</version>
<!-- 相对路径pom文件 -->
<relativePath>../pom.xml</relativePath>
</parent>
依赖管理dependencyManagement
管理依赖,子模块继承之后就无需声明版本
也可导入
<dependencyManagement>
<dependencies>
<!-- SpringCloud 微服务 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>