maven主要致力于让项目构建更加简单,提供统一的构建系统,提供优质的项目信息
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>...groupId>
<artifactId>...artifactId>
<version>...version>
<packaging>...packaging>
<dependencies>...dependencies>
<parent>...parent>
<dependencyManagement>...dependencyManagement>
<modules>...modules>
<properties>...properties>
<build>...build>
<reporting>...reporting>
<name>...name>
<description>...description>
<url>...url>
<inceptionYear>...inceptionYear>
<licenses>...licenses>
<organization>...organization>
<developers>...developers>
<contributors>...contributors>
<issueManagement>...issueManagement>
<ciManagement>...ciManagement>
<mailingLists>...mailingLists>
<scm>...scm>
<prerequisites>...prerequisites>
<repositories>...repositories>
<pluginRepositories>...pluginRepositories>
<distributionManagement>...distributionManagement>
<profiles>...profiles>
project>
groupId:代表一个组织或者一个项目,如公司或者公司的某个项目,以倒序的方式写,如com.baidu或者com.baidu.brower
artifactId:代码具体的项目或者模块,如果groupId划分是组织,那么这个应该写具体的项目,如果groupId是一个大的项目,这边应该划分到具体的模块
version:代表具体的版本号
通过这个三个最基本的参数,我们就可以定位到具体需要使用的jar包
默认值:jar
可选项:pom,jar,war,ejb,ear,rar,maven-plugin
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<type>jartype>
<scope>testscope>
<optional>trueoptional>
dependency>
...
dependencies>
...
project>
groupId,artifcatId,version定位三要素,来确定一个依赖
对于所选依赖的类型,即我们前面项目可以打成多种包,jar,pom之类。。。同样我们依赖的时候,也可以选择依赖的类型,默认是jar
指定依赖生效的范围,maven其实有三套classpath,即编译,测试,运行(即打包后生成的target文件中的lib,是你实际运行时候所需要依赖的jar)
默认选项是compile,指在代码编译,运行,测试三个阶段都生效。怎么理解这个,就是在你各个阶段的classpath里面都能找到这个依赖
这个选项的意思是只在运行和测试的时候生效,不需要经过编译。个人感觉比如动态加载某个类的时候才需要,比如常见的是数据库驱动。
正常情况下,你代码里加载驱动的时候都是class.forname(“xxx”),此时编译期间可以不用,但是你实际运行的时候是需要的,测试的时候也要要真正具体的驱动来生效。
test只在测试和编译的时候生效,在实际运行的时候不生效,因为实际target的lib包中不包含这些jar包
跟compile一样,三个阶段都生效,但是实际的打包的时候target的lib包里面不包含这个jar包,由外部提供比如由jdk或者容器提供
跟provided相似,不过是引用本地jar包,与systemPath一起使用,实际打包的时候也不含这个jar包,如果想要打进去需要配置额外的插件
<dependency>
<groupId>javax.sqlgroupId>
<artifactId>jdbc-stdextartifactId>
<version>2.0version>
<scope>systemscope>
<systemPath>${java.home}/lib/rt.jarsystemPath>
dependency>
默认为true, true or flase,代表这个依赖是否传递
在上述scope中,如果没有配置optional为false, compile和runtime是会依赖传递的,比如A依赖了B,B依赖了C,那么A也能使用C,这就是依赖的传递性
假如一个项目中,存在如下依赖
A->B->C(1.2.0)
A->D->F->C(2.3.0)
依赖都会传递,同时依赖了两个版本的C jar包,此时会怎么处理?遵循以下两个原则:
由于依赖调解,有时候也会导致依赖冲突,最常见的就是日志组件的冲突,大家的实现都不相同,有的是log4j,有的是logback,此时我们需要将其他的日志组件排除掉,在dependency中添加如下标签,只需groupId和artifactId即可。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<dependencies>
<dependency>
<groupId>org.apache.mavengroupId>
<artifactId>maven-embedderartifactId>
<version>2.0version>
<exclusions>
<exclusion>
<groupId>org.apache.mavengroupId>
<artifactId>maven-coreartifactId>
exclusion>
exclusions>
dependency>
...
dependencies>
...
project>