JavaWeb(7)——Maven学习

来源:互联网 发布:德比鞋 搭配 知乎 编辑:程序博客网 时间:2024/06/14 03:59

开发过程中经常使用Maven,以为掌握了Maven,知道自己要写一个小项目,才意识根本不会maven。重新系统的学习Maven。

Maven的基本概念

Maven是一个方便程序员创建,配置,发布,部署项目的管理工具。

约定优于配置

Maven采用“约定优于配置”的策略(这一点最具代表性的是Ruby on Rails)。

所谓约定由于配置,就是不需要对每一个文件写配置来说明彼此间的关系,而是规定不同作用的文件存放的位置,常见的约定:

源代码应存放于: ${basedir}/src/main/java子源代码存放在:${basedir}/src/main/resources测试代码存放在:${basedir}/src/test编译生成class存在:${basedir}/target/classes项目产生jar文件存放在: ${basedir}/target

遵守这样的规定可以让开发变得轻松,当然也可以修改约定使它符合自己的习惯。

于是我就明白之前用IDE创建Maven项目为什么会有一各环节要选定模板,选定的实际上就是一组约定。

我们经常使用的约定模板通过maven插件来设定的,这又涉及到Maven的又一个重要概念——插件。

插件

maven的强大是因为它的插件,有的插件可以用来确定项目“约定”,有的用于下载依赖库,有的用于比编译,测试,发布等等。插件会根据需要自动下载,因此maven使用过程中经常会下载东西,一个大项目的首次编译,往往要等很久来下载各种插件和依赖库。

使用Maven的archetype插件创建一个maven约定结构的项目:

mvn archetype:generate -DinteractiveMode=false -DgroupId=org.wayblink -DartifactId=mavenQs -Dpackage=org.wayblink.mavenqs

稍等一下,可能会下载一些东西,然后就会创建一个mavenQs的项目,项目的目录结构:

.├── pom.xml└── src    ├── main    │   └── java    │       └── org    │           └── wayblink    │               └── mavenqs    │                   └── App.java    └── test        └── java            └── org                └── wayblink                    └── mavenqs                        └── AppTest.java

会发现一个符合经典约定的项目创建了,在项目的根目录,我们看到了一个文件,pom.xml,这是陌生的新事物,它是Maven中非常重要的东西,我们接下来就讲它,而插件的作用会在后续再深入理解。

pom.xml

pom.xml称为项目对象模型(project object model)描述文件,描述了项目的一系列信息。

打开上面创建项目的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>org.wayblink</groupId>  <artifactId>mavenQs</artifactId>  <packaging>jar</packaging>  <version>1.0-SNAPSHOT</version>  <name>mavenQs</name>  <url>http://maven.apache.org</url>  <dependencies>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>3.8.1</version>      <scope>test</scope>    </dependency>  </dependencies></project>

我们看到了上面在创建项目命令行中定义的项目信息:<groupId>org.wayblink</groupId><artifactId>mavenQs</artifactId><name>mavenQs</name>,可知pom文件保存了项目的许多基本信息。pom.xml包含着丰富的信息,在下面会详细描述。

Maven生命周期

项目的开发经历着类似的流程,从开发到测试,到打包,到发布,Maven作为一个项目管理工具也就应运而生适应于此的生命周期。

Maven的包括三个基本生命周期:

cleandefaultsite

clean生命周期用于构建项目之前的清理工作,包含:

pre-cleancleanpost-clean

default生命轴器包含项目构建的核心,包括:

compile 编译项目test 单元测试package 项目打包install 安装到本地仓库deploy 部署到远程仓库

site生命周期用于生成项目报告站点,发布站点:

pre-sitesitepost-sitesite-deploy

对于每一个生命后期,不同的阶段遵从着严格的顺序,命令指定要执行到某一环节,它前面的环节也会执行。例如:

mvn clean package

就会分别顺序执行到pre-cleancleancompile,test,package

Maven资源库

Maven的资源库Repository保存着各种插件的第三方依赖库。在运行maven进场会发现它在下载东西,实际上就是从公共的Repository下载需要的插件或者依赖库到本地。

资源科按照存放位置分为三种:

1,本地资源库
从远程或中央资源库下载到本地的插件和依赖库,存放在本地的一个文件夹中,可以通过Maven安装目录的conf/settings.xml或者用户home目录下的m2/settings.xml中的localRepository元素进行设置。

2,远程资源库
远程资源库由公司或者团队集中进行维护。

3,中央资源库
中央资源库也可以成为官方资源库,有Maven官方维护,方便Maven用户使用,几乎所有的开源插件和第三方库都可以在官方库中找到。但官方库下载往往是比较慢的,一个大项目的第一次build往往需要花费很长时间。

详解POM.xml

坐标

返回上面的pom.xml示例,会发现项目的几个描述元素

  <groupId>org.wayblink</groupId>  <artifactId>mavenQs</artifactId>  <packaging>jar</packaging>  <version>1.0-SNAPSHOT</version>

下面的junit也有类似的属性

<dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>3.8.1</version>      <scope>test</scope></dependency>

这其中,groupId,artifactId,packaging,version被称为Maven坐标,坐标可以唯一标定项目。有了这个标记就知道它是有那个组织开发的什么项目,项目的编号是多少,格式是什么。以这个项目为例,使用maven package命令打包项目后,会产生mavenQs-1.0-SNAPSHOT.jar的包,可见与坐标是对应的。同理junit的坐标实际上就是在项目中引入了junit-3.8.1.jar的依赖。至于什么是依赖,见下小节。

依赖管理

pom.xml中最关键的功能就是以来管理,也就是<dependencies></dependencies>的部分。

项目所需要的依赖豆油dependencis来管理,dependencies标签包含着多个dependency标签,每一个对应着一个依赖包。

dependency标签还包含着以下标签:

<groupId>组织ID<artifactId>项目名<version>项目版本号<scope>依赖库作弄范围<type>依赖库类型,默认是jar<optional>指定该依赖库是否为可选<classifier>JDK版本号<exclusions>用于排除依赖

其中,scope可以取以下值:

compile 默认范围,编译测试打包时需要provided 表示容器会在runtime时提供runtime 表示编译时不需要,但在测试和运行时需要,最终打包会打包进去test 只用于测试阶段system 与provided类似,但要求该jar是系统自带的import 继承父pom文件中使用dependencyManagement配置的依赖

需要说明的是Maven依赖具有传递性,项目依赖于a.jar,a.jar又依赖于b.jar,不用显示声明项目依赖于b.jar,Maven会自动管理这种依赖传递。

其他元素

pom.xml除了dependencies还有其他元素,如:

buildreportinglicensesorganizationdevelopers......

这些详细使用参看文档,如果之后遇到,再做学习。

原创粉丝点击