1.什么是pom.xml
pom.xml作为项目对象模型。通过xml表示maven项目,使用pom.xml来实现。主要描述了项目:包括配置文件;开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的url,项目的依赖性,以及其他所有的项目相关因素。
2.settings.xml和pom.xml的区别
settings.xml与pom.xml,可以说是Maven中最重要的两个配置文件,决定了Maven的核心功能。settings.xml配置maven本身的一些设置如maven仓库地址等,pom.xml里统一管理你项目所需jar包
3.pom.xml相关属性详解
①modelVersion
<!--maven超级pom版本-->
<modelVersion>4.0.0</modelVersion>
②groupId
groupId、artifactId、version三者被称为Maven坐标,可以唯一确定
<!--公司名称(公司域名倒过来写)-->
<groupId>com.gupao</groupId>
③artifacted
<!--功能命名-->
<artifactId>maven-project</artifactId>
④version
<!--版本号-->
<version>1.0-SNAPSHOT</version>
⑤packaging
<!--当前工程打包方式(不配置默认是打jar包,打war包需要配置)-->
<packaging>war</packaging>
⑥description
<!--项目描述信息-->
<description>描述信息</description>
⑦properties
<!--定义pom中用到的一些参数,变量,在使用时通过${xxx}的形式来使用-->
<properties>
<org.springframework-version>4.3.7.RELEASE</org.springframework-version>
<druid.version>1.0.9</druid.version>
<mybatis.version>3.3.0</mybatis.version>
<mybatis-spring.version>1.2.4</mybatis-spring.version>
</properties>
⑧dependencyManagement
<!--dependencyManagement强烈建议只在父pom中使用-->
<!--在父pom中声明,相当于提前声明整个工程需要使用的某些jar包,并且给定了版本号,在子pom中如果需要使用,和普通引入jar的形式一样,只是不需要再定义version版本号。因为子pom会层层向上到dependencyManagement面去找有没有对该artifactId和groupId进行过版本声明。如果有,就继承它,如果
没有就会报错,告诉你必须为dependency声明一个version-->
<!--主要作用:1.统一版本号 2.提前声明引用的jar(子pom里用到时,需要再引入)-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
⑨dependency
<!--dependency中包括groupId、artifactId、version等,此处主要讲解scope作用域-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.1.2</version>
<scope>test</scope>
</dependency>
⑩scope
<!--scope元素的作用:控制 dependency 元素的使用范围。通俗的讲,就是控制 Jar 包在哪些范围被加载和使用。-->
scope有五种可选:
a)compile
<!--编译:默认值。如果没有指定 scope 值,该元素的默认值为 compile。被依赖项目需要参与到当前项目的编译,测试,打包,运行等阶段。-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
b)test
<!--测试:表示被依赖项目仅仅参与测试相关的工作,包括测试代码的编译,执行。-->
<!--适用场景:例如,junit包,我们只有在进行单元测试等的时候才会用到,所以scope可以定义为test-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.1.2</version>
<scope>test</scope>
</dependency>
c)provided
<!--可以认为这个provided是目标容器已经provided这个artifact。换句话说,它只影响到编译,测试阶段。在编译测试阶段,我们需要这个artifact对应的jar包在classpath中,而在运行阶段,假定目标的容器(比如我们这里的liferay容器)已经提供了这个jar包,所以无需我们这个artifact对应的jar包了。-->
<!--适用场景:例如,如果我们在开发一个web 应用,在编译时我们需要依赖 servlet-api.jar,但是在运行时我们不需要该jar包,因为这个jar包已由应用服务器提供,此时我们需要使用 provided 进行范围修饰-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
d)runtime
<!--运行时:runntime表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过编译而已-->
<!--适用场景:例如,在编译的时候我们不需要JDBC API的jar包,而在运行的时候我们才需要JDBC驱动包-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.15-bin</version>
<scope>runtime</scope>
</dependency>
e)system
<!--被依赖项不会从 maven 中央仓库中查找,而是从本地系统中获取。配合systemPath使用,systemPath元素用于制定本地系统中 jar 文件的路径-->
<!--使用场景:比如:公司写了一个common-lib包,不在maven中央仓库的情况,那么该怎么办才能够使用到该jar包???-->
<!--有如下三种方法:
1.放到公司私服中去
2.用之前的方式add到classpath中(不方便)
3.使用system配以systemPath的形式
团队使用:最好建议放到私服中去!!!
-->
<dependency>
<groupId>com.gp.springmvc</groupId>
<artifactId>gp-common-lib</artifactId>
<scope>system</scope>
<systemPath>${basedir}/WEB-INF/lib/common-lib.jar</systemPath>
</dependency>
⑪exclusions
<!--排除的意思,jar包冲突的时候排除使用-->
<!--用maven管理库依赖,有个好处就是连同库的依赖的全部jar文件一起下载,免去手工添加的麻烦,但同时也带来了同一个jar会被下载了不同版本的问题,好在pom的配置里面允许用<exclusion>来排除一些不需要同时下载的依赖jar -->
<!--多技术默认依赖common-logging.jar,某些人并不想使用默认的,或者想使用slf4j等等处理日志。在Spring中,可以通过如下配置干掉common-logging,引入slf4j日志系统。-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.8.RELEASE</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>