maven和pom.xml详解

来源:互联网 发布:mac 一个或多个 编辑:程序博客网 时间:2024/06/13 02:12

一、maven的定义

简单地说maven是一个比较常用的项目构建管理工具。

二、maven的作用

  1. 统一开发规范
  2. 统一管理jar包
统一开发规:普通web工程的目录结构没有一个统一的规范,因开发人员的习惯往往目录结构不统一(需要自己动手创建)。如图1:


图1:非maven项目
图1是非maven项目自动生成的目录结构。这种方式就比较随意,Java代码放在src下,有人会问配置文件放在哪里?单元测试类放在哪里?没有统一的规范,都是开发者根据个人习惯而创建的,这样并不能达到一个团队协作的作用。下面看图2,使用maven插件创建的maven项目。

图2:maven项目

图2是maven项目自动生成的目录结构。此结构作用一目了然:

  • src/main/java放源代码
  • src/main/resources放配置文件
  • src/test/java放单元测试代码
  • targer文件下放编译输出后的代码
  • pom.xml是Maven的配置文件

统一管理jar包:我们在pom.xml管理jar包,接下来会介绍pom.xml

三、pom.xml介绍

<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/maven-v4_0_0.xsd">

<!--指定了当前Maven模型的版本号,对于Maven2和Maven3来说,它只能是4.0.0-->
<modelVersion>4.0.0</modelVersion>
        <!-- 项目或者组织的唯一标志,并且配置时生成的路径也是由此生成,如com.wangzuojia生成的相对路径为:/com/wangzuojia-->
<groupId>com.wangzuojia</groupId>
<!--maven构建的项目名,项目的通用名称-->
<artifactId>testwebapp</artifactId>
<!--版本号。SNAPSHOT意为快照,说明该项目还在开发中,是不稳定的版本。groupId、artifactId、version三个元素生成了一个Maven坐标-->
<version>0.0.1-SNAPSHOT</version>
<!--打包的机制,如pom、 jar、 maven-plugin、 ejb、 war、 ear, rar、 par,默认是jar-->
<packaging>war</packaging>
<!-- 项目的名称, Maven 产生的文档用 -->
<name>testwebapp Maven Webapp</name>
<!-- 哪个网站可以找到这个项目,提示如果 Maven 资源列表没有,可以直接上该网站寻找, Maven 产生的文档用 -->
<url>http://maven.apache.org</url>

<!--properties是用来定义一些配置属性的,例如project.build.sourceEncoding(项目构建源码编码方式),可以设置为UTF-8,防止中文乱码,也可定义相关构建版本号,便于日后统一升级。-->
<properties>
<!-- spring版本号 4.0.2.RELEASE -->
<spring.version>4.2.3.RELEASE</spring.version>
</properties>

<!-- 依赖关系 -->
<dependencies>


<!-- 导入java ee jar 包 -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<!-- 表示开发的时候引入,发布的时候不会加载此包 -->
<!-- scope 说明
- compile :默认范围,用于编译
- provided:类似于编译,但支持你期待jdk或者容器提供,类似于classpath
- runtime: 在执行时,需要使用
- system: 需要外在提供相应得元素。通过systemPath来取得
- systemPath: 仅用于范围为system。提供相应的路径
- optional: 标注可选,当项目自身也是依赖时。用于连续依赖时使用
-->
<scope>test</scope>
</dependency>

<!-- spring核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
 <!-- 与构建相关的配置-->
 <build><!--最终构建之后的名称-->
<finalName>testwebapp</finalName></build></project>
传递性依赖
使用Spring的时候会依赖于其他开源的类库。如A项目依赖了spring-core,spring-core又依赖了spring-asm和commons-logging,那么spring-asm和commons-logging就是A项目的一个传递性依赖。

有了传递性依赖机制,在使用spring-core的时候就不用去考虑它依赖了什么,也不用担心引入多余的依赖,Maven会解析各个直接依赖的POM,将那些必要的间接依赖,以传递性依赖的形式引入到当前的项目中去。

依赖调节
传递性依赖有时会产生冲突。此时,我们需要明天传递性依赖的具体路径,这就叫依赖调解,依赖调解主要有两点原则:

1、A->B->C->M,A->D->M,两条依赖路径上都有M,此时遵循路径最近者优先,因此A->D->M将被解析使用

2、A->B->N,A->C->N,N的依赖长度是一样的,从Maven2.0.9开始,此时遵循第一声明者优先,因此A->B->N将被解析使用
 依赖排除
 maven默认是将所依赖的jar都引用进来。有时候当前项目依赖不同的jar依赖于某些第三方jar包的不同版本,这时就会出现同时依赖用一个jar文件的不同版本,有时会有依赖冲突。解决方法就是配置排除依赖。
<dependency>   
    <groupId>org.springframework</groupId> 
    <artifactId>spring-core</artifactId> 
    <version>2.5.6</version>  
    <exclusions>  
          <exclusion>     
              <groupId>commons-logging</groupId>        
             <artifactId>commons-logging</artifactId>  
          </exclusion>  
    </exclusions>  
</dependency> 


      注:exclusions是在某个具体依赖里面配置的,也就是说要找到需排除的jar包的依赖路径,这个可以在开发工具中查看pom.xml的依赖图。

1 0