没有使用maven的时候,我们在项目开始就要下载各种jar包,Spring、mybatis等等。
maven主要解决这几个问题:
- 生成源码(如果项目使用自动生成源码);
- 从源码生成项目文档;
- 编译源码;
- 将编译后的代码打包成JAR文件或者ZIP文件;
- 将打包好的代码安装到服务器、仓库或者其它的地方;
maven的中心思想是POM文件(项目对象模型)。POM文件是以XML文件的形式表述项目的资源,如源码、测试代码、依赖(用到的外部Jar包)等。POM文件应该位于项目的根目录下。
通过pom.xml对jar包进行集中管理。Maven工程不用手动导jar包,通过在pom.xml中定义坐标从maven仓库自动下载,方便且不易出错。
当执行maven命令的时候,会传入一个pom文件,maven会在pom文件的描述上进行依赖下载,执行生命周期,最后执行插件的构建任务,构建插件可以向构建阶段中增加额外的构建目标。
POM文件描述的是构建“什么”,而不是“如何”构建。
一个项目如果分为多个子项目,一般来讲,父项目有一个POM文件,每一个子项目都有一个POM文件。在这种结构下,既可以一步构建整个项目,也可以各个子项目分开构建。
POM
一个最小化的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>
<groupId>com.sysuzhyupeng</groupId>
<artifactId>java-web-project</artifactId>
<version>1.0.0</version>
</project>
modelVersion属性表示使用的POM模型的版本。选择和你正在使用的Maven版本一致的版本即可。版本4.0.0适用于Maven 2和3。
*groupId”属性是一个组织或者项目(比如开源项目)的唯一ID。大多数情况下,你会使用项目的java包的根名称作为group ID。
artifactId属性包含你正在构建的项目的名称。
上文中的groupId,artifactId和version属性,在项目构建后会生成一个jar文件,位于Maven仓库的如下路径中(目录和文件名):MAVEN_REPO/com/sysuzhyupeng/java-web-crawler/1.0.0/java-web-project-1.0.0.jar
父pom
所有的Maven pom文件都继承自一个父pom。如果没有指定父pom,则该pom文件继承自根pom。
可以让一个pom文件显式地继承另一个pom文件。这样,可以通过修改公共父pom文件的设置来修改所有子pom文件的设置。在pom文件的起始处指定父pom
<parent>
<groupId>com.taobao</groupId>
<artifactId>parent</artifactId>
<version>2.0.0</version>
</parent>
子pom文件的设置可以覆盖父pom文件的设置,只需要在子pom文件里指定新的设置即可。
Maven使用
运行Maven只需在命令行执行mvn
命令即可。当执行mvn
命令时,将构建周期、阶段或目标作为参数传进去,Maven就会执行它们。例如:
mvn install
你可以向mvn命令传入多个参数,执行多个构建周期或阶段,如:
mvn clean install
该命令首先执行clean构建周期,删除Maven输出目录中已编译的类文件,然后执行install构建阶段。
maven仓库
Maven的本地仓库默认在你本机的用户目录下。
Maven的中央仓库由Maven社区提供。默认情况下,所有不在本地仓库中的依赖都会去这个中央仓库查找。然后Maven会将这些依赖下载到你的本地仓库。访问中央仓库不需要做额外的配置。
远程仓库是位于web服务器上的一个仓库,Maven可以从该仓库下载依赖,就像从中央仓库下载依赖一样。远程仓库可以位于Internet上的任何地方,也可以是位于本地网络中。远程仓库中的依赖也会被Maven下载到本地仓库中。
可以在pom文件里配置远程仓库。将以下的xml片段放到属性之后:
<repositories>
<repository>
<id>jenkov.code</id>
<url>http://maven.sysuzhyupeng.com/maven2/lib</url>
</repository>
</repositories>
依赖管理
在dependencies属性下有两个dependency子属性,每一个dependency属性描述了一个外部依赖。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
每一个依赖由groupId, artifactId和version来描述。这里的示例为junit组织下的4.8.1版本的junit。上面示例中的两个依赖将会被放到以下子目录中MAVEN_REPOSITORY_ROOT/junit/junit/4.8.1。
有的时候,指定的依赖在Maven的中央仓库里没有。你可以直接下载这些依赖,然后放到Maven的本地仓库。这些依赖必须放到与groupId、 artifactId和version匹配的子目录中。用/替换所有的点(.)并且使用/分隔groupId、artifactId和version,这 就是与该依赖匹配的子目录。
外部依赖
Maven的外部依赖指的是不在Maven的仓库(包括本地仓库、中央仓库和远程仓库)中的依赖(jar包)。
配置外部依赖的示例如下:
<dependency>
<groupId>mydependency</groupId>
<artifactId>mydependency</artifactId>
<scope>system</scope>
<version>1.0</version>
<systemPath>${basedir}\war\WEB-INF\lib\mydependency.jar</systemPath>
</dependency>
groupId和artifactId为依赖的名称,即API的名称。scope属性为system。systemPath属性为jar文件的路径。${basedir}为pom文件所在的目录,路径中的其它部分是相对于该目录而言的。
快照依赖
快照依赖指的是那些还在开发中的依赖(jar包)。与其经常地更新版本号来获取最新版本,不如你直接依赖项目的快照版本。
在pom文件的最开头(设置groupId和artifactId的地方),在版本号后追加-SNAPSHOT,则告诉Maven你的项目是一个快照版本。如:
<dependency>
<groupId>com.sysuzhyupeng</groupId>
<artifactId>java-web-project</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
构建生命周期
Maven有三个内嵌的构建生命周期:
- default
- clean
- site
每一个构建生命期关注项目构建的不同方面。因此,它们是独立地执行的。Maven可以执行多个生命期,但是它们是串行执行的,相互独立,就像你执行了多条独立的Maven命令。
default生命期关注的是项目的编译和打包。clean生命期关注的是从输出目录中删掉临时文件,包括自动生成的源文件、编译后的类文件,之前版本的jar文件等。site生命期关注的是为项目生成文档。实际上,site可以使用文档为项目生成一个完整的网站。
default生命期中有这几个值得关注:
- validate 验证项目的正确性,以及所有必需的信息都是否都存在。同时也会确认项目的依赖是否都下载完毕。
- compile 编译项目的源代码
- test 选择合适的单元测试框架,对编译后的源码执行测试;这些测试不需要代码被打包或者部署。
- package 将编译后的代码以可分配的形式打包,如Jar包。
- install 将项目打包后安装到本地仓库,可以作为其它项目的本地依赖
- deploy 将最终的包复制到远程仓库,与其它开发者和项目共享。