Maven笔记

来自Wikioe
跳到导航 跳到搜索


关于Maven

介绍

maven翻译为“专家”、“内行”,是Apache下的一个纯Java开发的开源项目, 它是一个项目管理工具,可以使用maven对java进行项目构建、依赖管理

项目构建

  • 项目构建,是一个项目从编写源代码到编译、 测试、 运行、 打包、 部署、 运行的过程;

传统项目构建过程:

传统项目构建.jpg

  1. 在eclipse中创建一 个javaweb工程
  2. 在工程中编写源代码及配置文件等
  3. 对源代码进行编译,java文件编译成 class文件
  4. 执行Junit单元测试
  5. 将工程打成war包部署至tomcat运行


maven项目构建过程:

  • maven将项目构建的过程进行标准化,每个阶段使用一个命令完成。

Maven项目构建.jpg 上图中部分阶段对应命令如下:

  1. 清理阶段:“clean”,用于清理输出的class 文件;
  2. 编译阶段:“compile”, 用于将java代码编译成 class文件;
  3. 打包阶段:“package”,java工程可以打成jar包,web包可以打成war包;
  • 运行maven工程(web工程)需要命令:“tomat:run


优点:

  1. 一个命令完成构建、运行,方便快捷。
  2. maven对每个构建阶段进行规范,非常有利千大型团队协作开发。

依赖管理

是依赖管理:就是对项目所有依赖的 jar 包进行规范化管理。

传统项目的依赖管理

传统的项目工程要管理所依赖的jar包完全靠人工进行,程序员从网上下载jar包添加到项目工程中。这个过程中容易出现很多问题:

  1. 没有对jar包的版本统一管理, 容易导致版本冲突
  2. 从网上找jar包非常不方便, 有些jar找不到。
  3. jar包添加到工程中导致工程过大。

Maven项目的依赖管理

maven项目管理所依赖的jar包不需要 手动向工程添加jar包,只需要在“pom.xml”(maven工程的配置文件)添加jar包的坐标,自动从maven仓库中下载jar包、运行,如下图: Maven项目的依赖管理.jpg


优点:

  1. 通过pom.xml文件对jar包的版本进行统一管理, 可避免版本冲突
  2. maven团队维护了一个非常全的maven仓库, 里边包括了当前使用的jar包, maven工程可以自动从maven仓库下载jar包, 非常方便。

使用Maven的优点

  1. 一步构建
    maven对项目构建的过程进行标准化, 通过一个命令即可完成构建过程。
  2. 依赖管理
    maven工程不用手动导jar包, 通过在 pom.xml 中定义坐标从maven仓库自动下载,方便且不易出错。
  3. maven的跨平台, 可在window、linux上使用。
  4. maven遴循规范开发有利于提高大型团队的开发效率, 降低项目的维护成本, 大公司都会考虑使用maven来构建项目。

入门

下载

  • [1]可下载maven最新版本。

安装与配置

解压:将maven解压到一个不含有中文和空格的目录中。

Maven目录结构.jpg
  1. “bin”:“mvn.bat”(以run方式运行项目)、“mvnDebug.bat”(以debug方式运行项目);
  2. “boot”:maven运行需要类加载器;
  3. “conf”:“settings.xml”整个maven工具核心配置文件;
  4. “lib”:maven运行依赖jar包;


环境变量:

  • 添加“%MAVEN_HOME%/bin”到path;
    Maven环境变量.png


验证安装:

  • 通过“mvn -v”命令检查maven是否安装成功:
    Maven验证安装.jpg

Maven 仓库

maven的工作需要从仓库下载些jar包,本地项目都会通过maven软件从远程仓库下载jar包并存在本地仓库,本地仓库存在的jar包就不用每次从远程仓库下载了。

仓库类型

  1. 本地仓库: 用来存储从远程仓库或中央仓库下载的插件和jar 包,项目使用一些插件或jar包,优先从本地仓库查找。
    默认本地仓库位置在“${user.dir}/.m2/repository”中,(“${user.dir}”表示windows用户目录)。
  2. 远程仓库: 如果本地需要插件或者jar包,本地仓库没有,默认去远程仓库下载。
    远程仓库可以在互联网内也可以在局域网内。
  3. 中央仓库: 在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>

入门程序

项目工程目录约定

Maven项目工程目录约定.jpg

常用命令

compile

compile 是maven工程的编译命令,作用是将“src/main/java”下的文件编译为class文件输出到“target”目录下。

  1. 执行mvn compile:
    执行mvn compile.jpg
  2. 查看target目录, class文件已生成, 编译完成:
    执行mvn compile完成.jpg

test

test 是maven工程的测试命令, 会执行src/test/java下的单元测试类。


cmd执行mvn test执行src/test/java下单元测试类:

执行mvn test.jpg

clean

clean 是maven工程的清理命令, 执行clean会删除target目录的内容。

package

package是maven工程的打包命令, 对于java工程执行package打成jar包, 对于web工程打成war包。

install

install 是maven工程的安装命令,执行 install将maven打成jar包或war包发布到本地仓库

生命周期

maven对项目构建过程分为三套相互独立的生命周期,(“三套",而“相互独立”):

  1. “Clean Lifecycle”:在进行真正的构建之前进行一些清理工作。
  2. “Default Lifecycle”:构建的核心部分,编译,测试,打包,部署等等。
  3. “Site Lifecycle”:生成项目报告,站点,发布站点;

生命周期的阶段

每个生命周期都有很多阶段, 每个阶段对应一个执行命令:

  1. clean生命周期的阶段
    pre-clean:执行一些需要在clean之前完成的工作
    clean:移除所有上一次构建生成的文件
    post-clean:执行一些需要在clean之后立刻完成的工作
  2. 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:将最终的包复制到远程的仓库, 以让其它开发人员与项目共享。
  3. 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)的逻辑。


下图是maven的概念模型图: Maven的概念模型图.jpg

项目对象模型(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项目生命周期.jpg

  • maven 通过执行一些简单命令即可实现上边生命周期的各各过程,比如执行mvn compile编译、 执行mvn clean清理。

一组标准集合

maven将整个项目管理过程定义一组标准,比如:通过maven构建工程有标准的目录结构,有标准的生命周期阶段、依赖管理有标准的坐标定义等。

插件(plugin)、目标(goal)

maven 管理项目生命周期过程都是基于插件完成的。

项目构建

M2e 插件安装配置

在eclipse 集成maven软件, 最终通过eclipse创建maven工程

插件安装

  • 一些高版本的eclipse 已经内置了maven 的安装

在eclipse插件市场之间搜索安装即可。

Eclipes 设置 M2e

指定maven安装目录

Eclipse设置M2e.jpg

User Setting 配置

Eclipse设置M2e的User Setting 配置.jpg

  • 如果修改了setting.xml文件需要点击上图中的"up date settings"按钮
  • 对本地仓库重建索引,点击"Reindex"。
eclipse浏览仓库

测试在eclipse中是否可以浏览maven的本地仓库(“Window”->“Show View”->“Other...”),如果可以正常浏览maven本地仓库则说明eclipse集成maven已经完成。

  • 不能显示则尝试“Reindex”;

Eclipse浏览Maven仓库.jpg

坐标定义

每个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:

Eclipse使用Maven的命令.jpg

  • “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包的的坐标,可以通过如下方式查询:

  1. 相关网站或仓库中查询:
    http://search.maven.org/
    http://mvnrepository.com/
  2. 使用maven插件的索引功能:
    Eclipse中maven插件的索引功能.jpg

依赖范围

A依赖B, 需要在A的pom.xml文件中添加B的坐标,添加坐标时需要指定依赖范围,依赖范围包括:

  1. compile:(默认依赖范围)编译范围的依赖会用在编译、测试、运行,由于运行时需要所以编译范围的依赖会被打包
  2. provided:provided依赖在编译和测试时需要,在运行时不需要(provided依赖只有在当JDK或者一个容器已提供该依赖之后才使用);
    比如:servlet api被tomcat容器提供。
  3. runtime:runtime依赖在运行和测试系统的时候需要,但在编译的时候不需要。
    比如:jdbc的驱动包
  4. test:在编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用;
    比如:junit
  5. system:(不推荐使用)system范围依赖与provided类似,但是必须显式的提供一个对于本地系统中JAR文件的路径,需要指定systemPath磁盘路径。
  • 依赖范围由强到弱的顺序是: compile > provided > runtime > test

Maven 依赖范围.png

Tomcat 插件