maven总结
1、初始配置
<?xml version="1.0" encoding="UTF-8"?>
<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.my.bookstore</groupId>
<packaging>war</packaging>
<artifactId>user-core</artifactId>
<version>1.0-SNAPSHOT</version>
<name>bookstore maven project</name>
</project>
代码的第一行是xml头,指定了该xml文档的版本和编码方式。紧接着是project元素,project是所有pom.xml的根元素,它还声明了一些POM相关的命名空间及xsd元素,虽然这些属性不是必须的,但使用这些属性能够让第三方工具(如:IDE中的xml编辑器)帮助我们快速编辑POM。
modelVersion指定了当前POM模型的版本。
groupId定义了项目属于哪个组,这个组往往和项目所在的组织或公司存在关联。例如你的公司是mycom,有一个项目为myapp,那么groupId应该是com.mycom.myapp。
artifactId定义了当前maven项目在组中唯一的ID,一个项目会分很多模块,模块可以相互引用,如在前面的groupId为com.mycom.myapp的例子中,你可能会为不同的子项目(模块)分配artifactId,如:myapp-util,myapp-domain,myapp-web等。
version指定了项目当前的版本--1.0-SNAPSHOT。SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本。随着项目的发展,version会不断更新,如升级为1.0,1.1-SNAPSHOT,1.1,2.0等。
name元素声明了一个对于用户更为友好的项目名称,虽然这不是必须的,但还是推荐为每个pom声明name,以方便信息交流。
Maven的常用命令
mvn compile 编译
mvn test 测试,运行所以的testcase
mvn clean 清空
mvn package 打包
mvn install 安装,这个可以把自己的项目打包放到库中供引用
Scope 依赖范围
test 测试范围有效,编译和打包不会引入jar
compile 编译范围有效,编译和打包都会引入jar(默认为compile)
provided 编译和测试有效,编译时引入jar,打包时不引入jar(如servlet-api)
runtime 运行时依赖,编译时不引入jar,一般不用
Maven 内置隐式变量
${basedir} 项目根目录
${project.build.directory} 构建目录,缺省为target
${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes
${project.build.finalName} 产出物名称,缺省为${project.artifactId}-${project.version}
${project.packaging} 打包类型,缺省为jar
${project.xxx} 当前pom文件的任意节点的内容,如${project.groupId},${project.artifactId}
依赖传递
依赖级别相同的时候,哪一个先依赖用哪一个,级别不一样的时候,用依赖层级低的
排除依赖
<exclusions>
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
</exclusion>
</exclusions>
例:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
<exclusions>
<exclusion>
<groupId></groupId>
<artifactId></artifactId>
</exclusion>
</exclusions>
</dependency>
聚合
为了能够使用一条命令就能构建一个完整的项目(包含多个子模块)
如一个bookstore项目有3个子模块分别为bookstore-shiro、bookstore-log、bookstore-core
我们就会创建一个聚合项目bookstore,在pom.xml下面配置,这样3个子模块就构建在一起,变成了bookstore
<modules>
<!--引用路径为pom.xml 的相对路径-->
<module>../bookstore-shiro</module>
<module>../bookstore-log</module>
<module>../bookstore-core</module>
</modules>
继承
如父项目配置
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.my.cn.bookstore</groupId>
<artifactId>bookstore</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>bookstore Maven Project</name>
</project>
子项目如下配置
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.my.cn.bookstore</groupId>
<artifactId>bookstore/artifactId>
<version>0.0.1SNAPSHOT</version>
<relativePath>../bookstore/pom.xml</relativePath>
</parent>
</project>
配置完后,子项目就可以直接使用父项目上配置的一些公共变量和属性
如
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>4.0.1.RELEASE</spring.version>
<junit.version>4.10</junit.version>
<hibernate.version>4.3.5.Final</hibernate.version>
<mysql.version>5.1.6</mysql.version>
<shiro.version>1.2.2</shiro.version>
</properties>
更有父级配置dependencyManagement,子项目这不用version和scope等
如父项目配置
<dependencyManagement>
<dependencies>
<!-- junit test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
则子项目配置如下即可
<dependencies>
<!-- junit test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
集合和继承一起使用
一般情况下,我们会把聚合和继承一起配置在一个项目中,bookstore的配置如下
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.my.cn.bookstore</groupId>
<artifactId>bookstore</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>bookstore Maven Project</name>
<modules>
<!--引用路径为pom.xml 的相对路径-->
<module>../bookstore-shiro</module>
<module>../bookstore-log</module>
<module>../bookstore-core</module>
</modules>
</project>