POM表明“项目对象模型”。它是一个名为pom.xml的文件,是Maven项目的XML表示形式。 在Maven眼中,一个项目根本不须要包含任何代码,只须要一个pom.xmlmysql
这是直接位于project元素下的元素列表sql
请注意,modelVersion 为 4.0.0 这是目前惟一支持Maven 2和3的POM版本,且是必填项 数据库
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- The Basics -->
<groupId>...</groupId>
<artifactId>...</artifactId>
<version>...</version>
<packaging>...</packaging>
<dependencies>...</dependencies>
<parent>...</parent>
<dependencyManagement>...</dependencyManagement>
<modules>...</modules>
<properties>...</properties>
<!-- Build Settings -->
<build>...</build>
<reporting>...</reporting>
<!-- More Project Information -->
<name>...</name>
<description>...</description>
<url>...</url>
<inceptionYear>...</inceptionYear>
<licenses>...</licenses>
<organization>...</organization>
<developers>...</developers>
<contributors>...</contributors>
<!-- Environment Settings -->
<issueManagement>...</issueManagement>
<ciManagement>...</ciManagement>
<mailingLists>...</mailingLists>
<scm>...</scm>
<prerequisites>...</prerequisites>
<repositories>...</repositories>
<pluginRepositories>...</pluginRepositories>
<distributionManagement>...</distributionManagement>
<profiles>...</profiles>
</project>
复制代码
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-project</artifactId>
<version>1.0</version>
</project>
复制代码
上面定义的POM是Maven容许的最小值。groupId、artifactId、version是必填字段,他们三者构成了 maven 的惟一坐标。apache
<groupId>
: 组织id,推荐公司域名反写,例如com.ailibaba<artifactId>
:项目名称<version>
:版本号经过坐标咱们在maven中定义了一个项目,除此以外咱们还须要告诉maven咱们要如何打包这个项目tomcat
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
...
<packaging>war</packaging>
...
</project>
复制代码
如上,咱们指定打包方式为 war
包,经常使用的还有jar
包bash
Maven的一个强大功能是它处理项目关系:这包括依赖项(和传递依赖项),继承和聚合(多模块项目)oracle
若是你的项目须要依赖其余项目,就必须配置依赖框架
<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>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<type>jar</type>
<scope>test</scope>
<optional>true</optional>
</dependency>
...
</dependencies>
...
</project>
复制代码
不是全部依赖项均可以在 maven 仓库中找到,要配置这种依赖,可使用install插件在本地安装。maven
mvn install:install-file -Dfile = c:\\non-maven-proj.jar -DgroupId = some.group -DartifactId = non-maven-proj -Dversion = 1 -Dpackaging = jar
复制代码
scope 有两个做用ide
做用范围
包括项目的测试、编译、运行、打包等生命周期。其中,编译和运行还分为
scope 的五个可选值,分别是
compile :这是默认范围,参与编译、测试、运行、打包等生命周期,可传递
provided :参与编译、测试、运行,不参与打包,不可传递。依赖由运行的环境提供,好比tomcat或者基础类库等
runtime :不参与编译,参与测试、运行,可传递。好比JDBC类库,在编译之时仅依赖相关的接口,在具体的运行之时,才须要具体的mysql、oracle等等数据的驱动程序。
test 该依赖仅参与测试用例的编译和执行,不可传递,好比Junit。
system :范围依赖与provided 类似,但依赖项不会从maven仓库下载,而是从本地系统指定路径下寻找,须要 systemPath 属性。
传递依赖
A -> B -> C, 当前项目 A,A依赖于B,B依赖于C,知道B在 A中的scope,怎么知道 C在 A 中的 scope
即,A需不须要 C的问题,本质由 C在B中的scope决定
当 C 在 B 中的scope 是test 或 provided 时,C 直接被丢弃,A不依赖C
不然 A 依赖 C,C的scope 继承与B 的scope
optional 表示可选依赖,它的值有两种
在Maven中可选依赖是不会进行传递的
什么是可选依赖? 假如A依赖B,B中有可选依赖C,那么除非A显示声明,不然可选依赖包是不会导入进依赖的。
为何要有可选选依赖?
好比,一个持久层模块不但能够持久化Oracle数据库,也能够持久化Mysql数据库,那么在这个持化层框架中应该对应了两份代码,一份是关于Oracle持久化的处理,一份是关于Mysql持久化的处理,若是将持久层模块的Oracle与Mysql驱动均设置为非可选依赖,那么依赖这个持久层框架的项目类路径中将同时出现Mysql以及Oracle的驱动Jar包,若是真的这样,你会不会感受到这种设计很奇葩,所以Maven经过Optional关键字来处理这种问题