目录
一、 Maven的相关概念
1.1 Maven介绍
1.1.1 什么是Maven
Maven是项目进行模型抽象,充分运用的面向对象的思想,Maven可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具。Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。
1.1.2 Maven的作用
依赖管理: maven对项目的第三方构件(jar包)进行统一管理。向工程中加入jar包不要手工从其它地方拷贝,通过maven定义jar包的坐标,自动从maven仓库中去下载到工程中。
项目构建: maven提供一套对项目生命周期管理的标准,开发人员、和测试人员统一使用maven进行项目构建。项目生命周期管理:编译、测试、打包、安装、部署、运行。
maven对工程分模块构建,提高开发效率。
1.1.3 Maven的好处
节省磁盘空间 、可以一键构建 、可以跨平台 、应用在大型项目时可以提高开发效率 (maven工程分解)
1.2 Maven仓库和坐标
1.2.1 Maven的仓库
本地仓库 | 相当于缓存,工程第一次会从远程仓库(互联网)去下载jar 包,将jar包存在本地仓库(在程序员的电脑上)。第二次不需要从远程仓库去下载。先从本地仓库找,如果找不到才会去远程仓库找。 |
中央仓库 | 就是远程仓库,仓库中jar由专业团队(maven团队)统一维护。中央仓库的地址:http://repo1.maven.org/maven2/ |
远程仓库 | 在公司内部架设一台私服,其它公司架设一台仓库,对外公开。 |
1.2.2 Maven的坐标
Maven的一个核心的作用就是管理项目的依赖,引入我们所需的各种jar包等。为了能自动化的解析任何一个Java构件,Maven必须将这些Jar包或者其他资源进行唯一标识,这是管理项目的依赖的基础,也就是我们要说的坐标。包括我们自己开发的项目,也是要通过坐标进行唯一标识的,这样才能才其它项目中进行依赖引用。
坐标的定义元素如下:
- groupId:项目组织唯一的标识符,实际对应JAVA的包的结构 (一般写公司的组织名称 eg:com.alibaba)
- artifactId: 项目的名称
- version:定义项目的当前版本
举例:要引入junit,只要在 pom.xml 配置文件中配置引入junit的坐标即可
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
总结:如果我们要使用jar,只需要在项目里添加对应的坐标(先从本地仓库找,有就使用,没有就从中央仓库中找,会下载到本地仓库)
二、Maven 的常用命令
2.1 clean命令
独立的生命周期,清楚编译产生的 target 文件夹内容,可以配合相应命令一起使用,如mvn clean package,mvn clean test
2.2 compile 命令
maven 的生命周期:compile、test、package、install,该命令可以对src/main/java目录下的代码进行编译
2.3 test 命令
测试命令,会执行src/test/java下的所有junit测试用例(要先导入junit的jar包坐标)
2.4 package 命令
mvn package:打包项目
如果javase项目,打包成jar包;如果javaee项目,打包成war包(打包后的项目会在target目录下找到)
2.5 install 命令
mvn install:打包后将其安装在本地仓库
2.6 生命周期
clean 命令是一个独立的生命周期,如果想要执行先清理,再打包,可以执行 clean package 的组合命令完成
compile、test、package、install:执行后边的命令,会先执行前面的命令
eg:install 先执行 compile、test、package 命令
三、依赖管理
3.1 导入依赖
导入依赖坐标,无需手动导入jar包就可以引入jar包
在 pom.xml 中使用 <dependency> 标签引入依赖,这里提供Maven的官网:http://mvnrepository.com/
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
3.2 依赖范围
依赖范围 | 对于编译 classpath 有效 | 对于测试 classpath 有效 | 对于运行时 classpath 有效 | 例子 |
compile | Y | Y | Y | spring-core |
test | - | Y | - | Junit |
provided | Y | Y | - | servlet-api |
runtime | - | Y | Y | JDBC驱动 |
system | Y | Y | - | 本地的,Maven仓库之外的类库 |
1.compile 编译、测试、运行,A在编译时依赖B,并且在测试和运行时也依赖
例如:strus-core、spring-beans, C3P0,Druid。会打到war包或jar包
2.provided 编译、和测试有效,A在编译和测试时需要B,在运行时不需要。
例如:servlet-api就是编译和测试有用,在运行时不用(tomcat容器已提供)。不会打到war包中
3.runtime:测试、运行有效,编译时不需要。
例如:jdbc驱动包 ,在开发代码中针对java的jdbc接口开发,编译不用在运行和测试时需要通过jdbc驱动包(mysql驱动)连接数据库。会打到war包中
4.test:只是测试有效,只在单元测试类中用。
例如:junit不会打到war包中
5.按照依赖强度,由强到弱来排序:compile> provided> runtime> test
四、插件
4.1 简介
Maven是一个核心引擎,提供了基本的项目处理能力和建设过程的管理,以及一系列的插件是用来执行实际建设任务。maven插件可以完成一些特定的功能。例如,集成jdk插件可以方便的修改项目的编译环境;集成tomcat插件后,无需安装tomcat服务器就可以运行tomcat进行项目的发布与测试。在pom.xml中通过plugin标签引入maven的功能插件。
4.2 JDK编译版本的插件
<build>
<plugins>
<!--jdk编译插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>utf-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
4.3 Tomcat7 服务端的插件
<!--tomcat插件-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<!-- 指定端口 -->
<port>82</port>
<!-- 请求路径 -->
<path>/</path>
</configuration>
</plugin>