Maven笔记
关于Maven
介绍
maven翻译为“专家”、“内行”,是Apache下的一个纯Java开发的开源项目, 它是一个项目管理工具,可以使用maven对java进行项目构建、依赖管理。
项目构建
- 项目构建,是一个项目从编写源代码到编译、 测试、 运行、 打包、 部署、 运行的过程;
传统项目构建过程:
- 在eclipse中创建一 个javaweb工程
- 在工程中编写源代码及配置文件等
- 对源代码进行编译,java文件编译成 class文件
- 执行Junit单元测试
- 将工程打成war包部署至tomcat运行
maven项目构建过程:
- maven将项目构建的过程进行标准化,每个阶段使用一个命令完成。
- 清理阶段:“clean”,用于清理输出的class 文件;
- 编译阶段:“compile”, 用于将java代码编译成 class文件;
- 打包阶段:“package”,java工程可以打成jar包,web包可以打成war包;
- 运行maven工程(web工程)需要命令:“tomat:run”
优点:
- 一个命令完成构建、运行,方便快捷。
- maven对每个构建阶段进行规范,非常有利千大型团队协作开发。
依赖管理
是依赖管理:就是对项目所有依赖的 jar 包进行规范化管理。
传统项目的依赖管理
传统的项目工程要管理所依赖的jar包完全靠人工进行,程序员从网上下载jar包添加到项目工程中。这个过程中容易出现很多问题:
- 没有对jar包的版本统一管理, 容易导致版本冲突。
- 从网上找jar包非常不方便, 有些jar找不到。
- jar包添加到工程中导致工程过大。
Maven项目的依赖管理
maven项目管理所依赖的jar包不需要 手动向工程添加jar包,只需要在“pom.xml”(maven工程的配置文件)添加jar包的坐标,自动从maven仓库中下载jar包、运行,如下图:
优点:
- 通过pom.xml文件对jar包的版本进行统一管理, 可避免版本冲突。
- maven团队维护了一个非常全的maven仓库, 里边包括了当前使用的jar包, maven工程可以自动从maven仓库下载jar包, 非常方便。
使用Maven的优点
- 一步构建
- maven对项目构建的过程进行标准化, 通过一个命令即可完成构建过程。
- 依赖管理
- maven工程不用手动导jar包, 通过在 pom.xml 中定义坐标从maven仓库自动下载,方便且不易出错。
- maven的跨平台, 可在window、linux上使用。
- maven遴循规范开发有利于提高大型团队的开发效率, 降低项目的维护成本, 大公司都会考虑使用maven来构建项目。
入门
下载
- 从[1]可下载maven最新版本。
安装与配置
解压:将maven解压到一个不含有中文和空格的目录中。
- “bin”:“mvn.bat”(以run方式运行项目)、“mvnDebug.bat”(以debug方式运行项目);
- “boot”:maven运行需要类加载器;
- “conf”:“settings.xml”整个maven工具核心配置文件;
- “lib”:maven运行依赖jar包;
环境变量:
验证安装:
Maven 仓库
maven的工作需要从仓库下载些jar包,本地项目都会通过maven软件从远程仓库下载jar包并存在本地仓库,本地仓库存在的jar包就不用每次从远程仓库下载了。
仓库类型
- 本地仓库: 用来存储从远程仓库或中央仓库下载的插件和jar 包,项目使用一些插件或jar包,优先从本地仓库查找。
- 默认本地仓库位置在“${user.dir}/.m2/repository”中,(“${user.dir}”表示windows用户目录)。
- 远程仓库: 如果本地需要插件或者jar包,本地仓库没有,默认去远程仓库下载。
- 远程仓库可以在互联网内也可以在局域网内。
- 中央仓库: 在maven软件中内置一个远程仓库地址“ http://repol.maven.org/maven2 ”,它是中央仓库,由Maven团队维护,服务于整个互联网,里面存储了非常全的jar包,包含了世界上大部分流行的开源项目构件。
配置本地仓库
在“%MAVEN_HOME%/conf/settings.xml”文件中配置本地仓库位置:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<!-- localRepository
| The path to the local repository maven will use to store artifacts.
|
| Default: ${user.home}/.m2/repository
<localRepository>/path/to/local/repo</localRepository>
-->
<localRepository>D:\Repository</localRepository>
...
</settings>
入门程序
项目工程目录约定
常用命令
compile
compile 是maven工程的编译命令,作用是将“src/main/java”下的文件编译为class文件输出到“target”目录下。
test
test 是maven工程的测试命令, 会执行src/test/java下的单元测试类。
cmd执行mvn test执行src/test/java下单元测试类:
clean
clean 是maven工程的清理命令, 执行clean会删除target目录的内容。
package
package是maven工程的打包命令, 对于java工程执行package打成jar包, 对于web工程打成war包。
install
install 是maven工程的安装命令,执行 install将maven打成jar包或war包发布到本地仓库。
生命周期
maven对项目构建过程分为三套相互独立的生命周期,(“三套",而“相互独立”):
- “Clean Lifecycle”:在进行真正的构建之前进行一些清理工作。
- “Default Lifecycle”:构建的核心部分,编译,测试,打包,部署等等。
- “Site Lifecycle”:生成项目报告,站点,发布站点;
生命周期的阶段
每个生命周期都有很多阶段, 每个阶段对应一个执行命令:
- clean生命周期的阶段
- pre-clean:执行一些需要在clean之前完成的工作
- clean:移除所有上一次构建生成的文件
- post-clean:执行一些需要在clean之后立刻完成的工作
- default周期的内容:
- validate
- generate-sources
- process-sources
- generate-resources
- process-resources:复制并处理资源文件,至目标目录,准备打包。
- compile:编译项目的源代码。
- process-classes
- generate-test-sources
- process-test-sources
- generate-test-resources
- process-test-resources:复制并处理资源文件, 至目标 测试目录。
- test-compile:编译、测试源代码。
- process-test-classes
- test:使用合适的单元测试框架运行测试。 这些测试 代码不会被打包或部署。
- prepare-package
- package:接受编译好的代码, 打包成可发布的格式, 如JAR。
- pre-integration-test
- integration-test
- post-integration-test
- verify
- install:将包安装至本地仓库, 以让其它项目依赖。
- deploy:将最终的包复制到远程的仓库, 以让其它开发人员与项目共享。
- site:生命周期的阶段
- pre-site:执行些需要在生成站点文档之前完成的工作
- site:生成项目的站点文档
- post-site:执行些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy:将生成的站点文档部署到特定的服务器上
命令与生命周期的阶段
执行命令会将该命令 在的在生命周期当中之前的阶段自动执行,比如:执行“mvn clean”命令会自动执行pre-clean和clean两个阶段, “mvn test”命令会自动执行validate、compile、test等阶段。
- 执行某个生命周期的某个阶段不会影响其它的生命周期!
- 如果要同时执行多个生命周期的阶段可在命令行输入多个命令,中间以空格隔开,例如:“mvn clean package”该命令执行clean生命周期的 clean阶段 和default生命周期的 package阶段。
Maven 概念模型
Maven包含了:一个项目对象模型(Project Object Model), 一组标准集合, 一个项目生命周期(Project Lifecycle), 一个依赖管理系统(Dependency Management System), 和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。
项目对象模型(Project Object Model)
一个maven工程都有一个pom.xml文件,通过pom.xml文件定义项目的坐标、项目依赖、项目信息、插件目标等。
依赖管理系统(Dependency Management System)
通过maven的依赖管理对项目所依赖的jar 包进行统一管理。
比如:项目依赖 Junit4.9, 通过在 pom.xml 中定义 Junit4.9 的依赖:
<!--依赖关系-->
<dependencies>
<!--此项目运行使用junit, 所以此项目依赖junit-->
<dependency>
<!-- junit的项目名称-->
<groupld>junit</groupld>
<!-- junit的模块名称-->
<artifactld>junit</artifactld>
<!-- junit版本-->
<version>4.9</version>
<!--依赖范围:单元测试时使用junit -->
<scope>test</scope>
</dependency>
...
<dependencies>
一个项目生命周期(Project Lifecycle)
使用maven完成项目的构建, 项目构建包括:清理、编译、测试、部署等过程,maven将这些过程规范为一个生命周期,如下所示是生命周期的各各阶段:
- maven 通过执行一些简单命令即可实现上边生命周期的各各过程,比如执行mvn compile编译、 执行mvn clean清理。
一组标准集合
maven将整个项目管理过程定义一组标准,比如:通过maven构建工程有标准的目录结构,有标准的生命周期阶段、依赖管理有标准的坐标定义等。
插件(plugin)、目标(goal)
maven 管理项目生命周期过程都是基于插件完成的。
项目构建
M2e 插件安装配置
在eclipse 集成maven软件, 最终通过eclipse创建maven工程
插件安装
- 一些高版本的eclipse 已经内置了maven 的安装
在eclipse插件市场之间搜索安装即可。
Eclipes 设置 M2e
指定maven安装目录
User Setting 配置
- 如果修改了setting.xml文件需要点击上图中的"up date settings"按钮
- 对本地仓库重建索引,点击"Reindex"。
eclipse浏览仓库
测试在eclipse中是否可以浏览maven的本地仓库(“Window”->“Show View”->“Other...”),如果可以正常浏览maven本地仓库则说明eclipse集成maven已经完成。
- 不能显示则尝试“Reindex”;
坐标定义
每个maven工程都需要定义本工程的坐标(项目的“pom.xml”文件), 坐标是maven对jar 包的身份定义。如:
<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">
<!-- 项目名称,定义为组织名+项目名,类似包名-->
<groupld>n.itcast.maven</groupld>
<!-- junit的模块名称-->
<artifactld>maven-first</artifactld>
<!-- 当前项目版本号, snapshot 为快照版本即非正式版本, release 为正式发布版本-->
<version>0.0.1-SNAPSHOT</version>
<!--依赖范围:test 为单元测试时使用 -->
<!--打包类型
jar: 执行package 会打成jar 包
war: 执行package 会打成war 包
porn : 用于maven 工程的继承,
通常父工程设置为porn
-->
<packaging>war</packaging>
...
<dependencies>
构建 Web 项目
【略】
Eclipse下的命令
在eclipse下测试命令 clean、compile、test、package、install:
- “Run as”采用“mvn”命令运行,“Debug as”采用“mvnDebug”命令调试方式运行(可打断点)
依赖管理
添加依赖(dependency)
在项目的“pom.xml”中添加“dependency”标签,如:
<dependencies>
<!-- 添加junit4.9依赖 -->
<dependency>
<groupld>junit</groupld>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>provided</scope>
</dependency>
</dependencies>
查找坐标
添加依赖需要指定依赖jar包的坐标,但是很多情况我们是不知道jar包的的坐标,可以通过如下方式查询:
- 相关网站或仓库中查询:
- 使用maven插件的索引功能:
依赖范围
A依赖B, 需要在A的pom.xml文件中添加B的坐标,添加坐标时需要指定依赖范围,依赖范围包括:
- compile:(默认依赖范围)编译范围的依赖会用在编译、测试、运行,由于运行时需要所以编译范围的依赖会被打包。
- provided:provided依赖在编译和测试时需要,在运行时不需要(provided依赖只有在当JDK或者一个容器已提供该依赖之后才使用);
- 比如:servlet api被tomcat容器提供。
- runtime:runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。
- 比如:jdbc的驱动包
- test:在编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用;
- 比如:junit
- system:(不推荐使用)system范围依赖与provided类似,但是必须显式的提供一个对于本地系统中JAR文件的路径,需要指定systemPath磁盘路径。
- 依赖范围由强到弱的顺序是: compile > provided > runtime > test