前言
Maven是一种项目管理工具,针对于Java开发,可以用来管理项目结构、JAR包依赖、插件、生成、发布的一系列流程,而且自身轻便易扩展。
Maven使用
Maven的基础-pom.xml
pom.xml既是最基础也是最核心的东西,POM–Project Object Model项目对象模型,Maven管理项目的依赖、插件、生成、发布都基于此文件内的配置.新建一个Maven项目或者将一个项目转为Maven管理,在项目根目录下都会自动生成此文件。一个基本的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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>test</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>test Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<artifactId>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>test</finalName>
</build>
</project>
基础配置分析
groupId
:定义了项目组织名,类似于公司名或者公司里的部门名。
artifactId
:定义了项目名,类似于公司或者部门里具体的项目名。
packaging
:定义项目打包的方式,可以选择打包成jar或者war。
version
:定义了项目当前的版本,比如开始就是0.0.1 快照版本。
name
:这个就不用具体介绍了。
<dependencies></dependencies>
:两个dependencies间定义了这个项目所有的依赖项,每一个依赖项用<dependency></dependency>
具体定义。
<dependency></dependency>
:俩个<dependency>
之间的<groupId>、<artifactId>、<artifactId>
可以定义一个唯一性的依赖jar包,其具体作用跟上边一样。而<scope>
定义了这个依赖包的作用范围:compile、import、provided、runtime、 system、test。
<build></build>
:定义编译的设置
扩展配置
生成一个基本的pom.xml后,在之后的使用中会需要用到其他很多配置,常用的比如:
<properties></properties>
:
配合 <dependency>
或者其他元素使用,可以在其内定义一些属性,如要使用的依赖包的版本、配置文件路径等等。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<struts2-version>2.3.28.1</struts2-version>
<spring-version>4.2.2.RELEASE</spring-version>
<spring-config-system>classpath:config/system.properties</spring-config-system>
</properties>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring-version}</version>
</dependency>
<plugin></plugin>
定义在<build><plugins>*</plugins></build>
内,定义一些编译、运行、发布所需要使用的插件,如编译用的编译插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source>
<target>1.7</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
定义插件信息的主要元素和定义依赖一致,定义编译时多的<configuration>
可以定义编译的具体java环境版本。
使用中碰到的小问题
- 依赖项的JAR包下载失败
有时候明明网络正常,直接去访问Maven中心库也能找到JAR包,但是项目构建时却会提示缺少JAR包,构建失败,主要可能是在首次下载所需要的那个JAR包时,因为网络、传输或者其他问题造成的下载失败,此时会在本地库内生成一个*.lastUpdated,在之后的再次构建时就不会再次主动去下载这个JAR包了,这时需要删去这个文件,然后再次构建就会自动下载了。
- 依赖项的版本冲突问题
假定以下场景:
场景一:假定项目需要依赖与A、B俩个依赖项,
A又依赖与C,C依赖与版本为1.1的依赖项D,即:A-->C--> 1.1D;
而B依赖与版本为1.2的D,即B--> 1.2D。
场景二:假定项目需要依赖与A、B俩个依赖项,
A依赖与版本为1.1的D,
B依赖与版本为1.2的D
那么此时产生的问题就是如果都在pom.xml文件进行了声明,项目构建时会使用哪一个呢?
此时遵循俩个原则:
第一优先原则:短路径优先,即依赖传递路径短的优先
第二优先原则:先声明优先原则,即谁最先在pom内声明使用谁。
放入以上俩个场景内,在场景一中项目会使用1.2版本的依赖项D;场景二中会使用1.1版本的依赖项D。