1 基本概念
定义
一个项目管理工具,一个项目对象模型(pom文件 project object model),有着项目生命周期的一个依赖管理系统。
作用
-
解决jar包冲突,减少重复性代码,方便管理和维护
-
管理依赖
-
一键构建项目(不再使用本地tomcat,使用maven自带的tomcat工具)
-
单元测试
-
打包项目
优势
- 节省项目空间(jar包被集中放置在仓库)
- 快速构建项目
2 maven的仓库
仓库分类
- 本地仓库
- 远程仓库(私服)
- 中央仓库
当一个maven工程启动时,会通过pom文件提供的坐标从本地仓库寻找jar包,如果本地仓库没有jar包,会从中央仓库下载jar包。
在公司中往往使用私服,这时项目运行时会先从私服找jar包,如果不存在,可以从本地上传jar包到私服,或者中央仓库下载jar包。
maven仓库间的关系
3 maven项目标准目录结构
传统项目
src
config
resources
maven项目
src/main/java (核心代码部分)
src/main/resources(配置文件部分)
src/main/webapp(页面部分,jsp,html,css,js,image等)
src/test/java(测试代码部分)
src/test/resources(测试配置文件部分)
4 maven常用命令
编译,生成target目录
mvn compile
删除target目录
mvn clean
编译,生成target目录,同时生成war文件(pom文件指定类型)
mvn package
编译,生成target目录,生成test目录
mvn test
编译,生成target目录,安装到maven仓库
mvn install
上传到私服
mvn deploy
5 maven生命周期
maven有三个生命周期:clean、默认生命周期、site。
-
默认生命周期
需要注意的是:默认生命周期的每执行后一个命令,都会先执行之前的命令。顺序为:
complie
->package
->install
->deploy
-
验证
验证项目是否正确并且必要信息都可用。
-
complie
编译项目源文件,将会编译
src\main
下面的代码。 -
test
使用合适的单元测试框架测试编译的源代码。这些测试不包括打包和部署项目。它将编译
src\main
和src\test
下面的代码。 -
package
将已经编译的代码(
src\main
和src\test
下面的代码)打包为pom文件指定的格式,如war包和jar包。 -
install
将软件包安装到本地仓库中,方便其他项目依赖。
-
deploy
在发布或者集成环境中完成,将最终包复制到远程仓库,然后和其他开发人员项目共享。
-
-
clean
清理构建项目时产生的文件。
-
site
为该项目生成站点文档。
6 maven概念模型
概念模型图示例
pom文件构成
- 项目自身信息
<modelVersion>4.0.0</modelVersion>
<groupId>com.cncs</groupId>
<artifactId>ssm_test1</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>ssm_test1 Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
- 项目依赖的jar包信息
公司组织名称
<groupId>org.aspectj</groupId>
项目名称
<artifactId>aspectjweaver</artifactId>
版本号
<version>1.6.8</version>
-
项目运行环境信息
项目运行环境信息包括:Jdk、Tomcat等等常用插件。每一个maven命令都对应maven底层一个插件。
<build>
<finalName>ssm_test1</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
7 jar包冲突与依赖作用域
在导坐标的时候,如果不清楚jar包的作用域,很可能会造成jar包冲突。例如,该jar包可能在tomcat中已经存在如下图,程序运行的时候tomcat直接依赖,不需要再从maven项目中获取jar包,如果此时没有规定jar的作用范围(默认为compile)运行程序,程序就会报错。
在dependency
标签内部的scope
标签确定范围。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
为避免后期错误,导坐标的时候最好先思考该包的作用范围在哪里。
范围 | 说明 | 常用 |
---|---|---|
test | 测试范围有效,在编译和打包时都不会使用这个依赖 | junit |
compile | 编译范围有效,在编译和打包时都会将依赖存储进去 | |
provided | 在编译和测试的过程有效,最后生成war包时不会加入 | servlet-api,jsp-api.因为servlet-api,tomcat等web服务器已经存在了,如果再打包会冲突。 |
runtime | 在运行的时候依赖,在编译的时候不依赖 | mysql,ojdbc |
PS:默认的依赖范围是compile