1. 什么是Maven?

  • Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具
  • Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建,依赖管理和项目信息管理
  • Maven的好处:
    • 方便jar的管理
    • 不需要上传jar包到svn

2. Maven常用命令

2.1. mvn compile
  • 完成编译操作
  • 执行完毕后,会生成target目录,该目录中存放了编译后的字节码文件
2.2. mvn clean
  • 执行完毕后,会将target目录删除
2.3. mvn test
  • 完成单元测试操作
  • 执行完毕后,会在target目录中生成三个文件夹:surefire、surefire-reports(测试报告)、test-classe(测试的字节码文件)
2.4. mvn package
  • 完成打包操作
  • 执行完毕后,会在target生成一个文件,该文件可能是jar、war
2.5. mvn install
  • 执行mvn install命令,完成将打好的jar包安装到本地仓库的操作
  • 执行完毕后,会在本地仓库中出现安装后的jar包,方便其他工程引用
2.6. mvn 组合命令
  • mvn clean compile
  • mvn clean test
  • mvn clean package
  • mvn clean install

3. Maven的核心概念

3.1. 坐标
  • 在平面几何中坐标(x,y)可以标识平面中唯一的一点。在maven中坐标就是为了定位这一个唯一确定的jar包。
  • Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范,拥有了统一规范,就可以把查找工作交给机器
  • Maven坐标主要组成(GAV)——确定一个jar包在互联网上的位置
    • groupId:定义当前Maven组织名称
    • artifactId:定义实际项目名称
    • version:定义当前项目的当前版本
3.2. 坐标的查找
  • 访问https://mvnrepository.com/或者https://search.maven.org/网站
3.3. 依赖管理
  • scope依赖范围

    依赖范围(Scope) 对于主代码classpath有效 对于测试代码classpath有效 被打包,对于运行时classpath有效 例子
    compile Y Y Y log4j
    test - Y - junit
    provided Y Y - servlet-api
    runtime - - Y JDBC Driver Implementation
  • 其中依赖范围scope用来控制依赖和编译,测试,运行的classpath的关系。主要的是三种依赖关系如下:

    • compile:默认编译依赖范围。对于编译,测试,运行三种classpath都有效
    • test:测试依赖范围。只对于测试classpath有效
    • provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
    • runtime:运行时提供。例如:jdbc驱动
  • 依赖传递

    • 直接依赖和间接依赖
      • test2依赖test1,test3依赖test2
      • test2直接依赖test1,test3间接依赖test1
    • 当第二直接依赖的范围是compile的时候,依赖可以传递
    • 当第二直接依赖的范围是test的时候,依赖不会得以传递
    • provided和runtime一般很少用
  • 依赖冲突

    • 假如test1使用junit4.10依赖,并且scope是compile,那test2,test3都可以使用test1的junit4.10,因为传递下来了
    • 假如test2使用junit4.9依赖,那test3会使用就近的一个依赖,也就是使用junit4.9
  • 可选依赖

    • <optional>true/false</optional>是否可选,也可以理解为是否向下传递
    • 在依赖中添加optional选项决定此依赖是否向下传递,如果是true则不传递,如果是false就传递,默认为false
  • 排除依赖

    • exclusions可用于排除依赖,注意exclusions是写在dependency中
3.4. 生命周期
  • Maven生命周期就是为了对所有的构建过程进行抽象和统一

  • 包括项目清理、初始化、编译、打包、测试、部署等几乎所有构建步骤

  • 生命周期可以理解为构建工程的步骤

  • 在Maven中有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是:

    • Clean Lifecycle:在进行真正的构建之前进行一些清理工作
    • Default Lifecycle:构建的核心部分,编译,测试,打包,部署
    • Site Lifecycle:生成项目报告,站点,发布站点
  • Clean 生命周期:清理项目

    • Clean 生命周期一共包含了三个阶段:

      pre-clean 执行一些需要在clean之前完成的工作
      clean 移除所有上一次构建生成的文件
      post-clean 执行一些需要在clean之后立刻完成的工作
      
    • 也就是说,mvn clean等同于mvn pre-clean clean

    • 如果我们运行mvn post-clean,那么pre-clean,clean都会被执行

    • 这是Maven很重要的一个规则,可以大大简化命令行的输入

  • Default 生命周期:构造项目

    • Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中

      // 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 将最终的包复制到远程的仓库,以让其它开发人员与项目共享
      
    • 运行任何一个阶段的时候,它前面的所有阶段都会被运行

    • 运行mvn install的时候,代码会被编译,测试,打包,安装到本地仓库

    • Maven的插件机制是完全起来Maven的生命周期的,因此

  • Site 生命周期:生成项目站点

    • 经常用到site阶段和site-deploy阶段,用以生成和发布Maven站点

    • Manager比较喜欢,文档及统计数据自动生成,很好看

      pre-site 执行一些需要在生成站点文档之前完成的工作 
      site 生成项目的站点文档
      post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备 
      site-deploy 将生成的站点文档部署到特定的服务器上
      

4. compile插件

<build>
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-compiler-plugin</artifactId>
			<configuration>
				<source>1.8</source>
				<target>1.8</target>
				<encoding>UTF-8</encoding>
			</configuration>
		</plugin>
	</plugins>
</build>

5. tomcat7插件

<build>		
    <plugins>
        <plugin>
			<!-- 配置tomcat7 -->
			<groupId>org.apache.tomcat.maven</groupId>
			<artifactId>tomcat7-maven-plugin</artifactId>
			<configuration>
				<port>8080</port>
				<path>/maven_test4</path>
			</configuration>
		</plugin>
    </plugins>
</build>

6. 聚合

  • 聚合一般是指一个工程拆分成多个模块开发,每个模块是一个独立的工程,但是要是运行时必须把所有模块聚合到一起才是一个完整的工程,此时可以使用maven的聚合工程