Maven学习笔记

1.Maven概念

Maven 是目前最流行的自动化构建工具,Maven是一款在大型项目开发过程中不可或缺的重要工具。

  1. maven可以管理jar文件
  2. 自动下载jar和他的文档,源代码
  3. 管理jar直接的依赖, a.jar需要b.jar , maven会自动下载b.jar
  4. 管理你需要的jar版本
  5. 帮你编译程序,把java编译为class
  6. 帮你测试你的代码是否正确。
  7. 帮你打包文件,形成jar文件,或者war文件
  8. 帮你部署项目

其中5.6.7.8属于Maven项目构建的过程,所以Maven不仅可以完成jar包的管理,还能完成项目的构建。

2.Maven项目构建

项目构建是面向过程的,就是一些步骤,完成项目代码的编译,测试,运行,打包,部署等等。maven支持的构建包括有:

  • 清理:把之前项目编译的东西删除,为新的编译代码做准备。
  • 编译: 把java文件编译为class文件,Maven的编译功能是批量的,可以同时把成千上万的文件编译为class。与命令javac不同,javac一次编译一个文件。
  • 测试:maven可以执行测试程序代码,验证你的功能是否正确。同时也是批量操作,即maven可以同时执行多个测试代码,同时测试很多功能。
  • 报告:生成测试结果的文件, 通过报告查看测试是否通过。
  • 打包:如果测试通过,就可以对项目进行打包。打包的含义就是 把你的项目中所有的class文件,配置文件等所有资源放到一个压缩文件中。通常java程序,压缩文件是jar扩展名的。对于web应用,压缩文件扩展名是.war。
  • 安装:在Maven环境下把“打包”生成的jar、war文件安装到本地仓库。
  • 部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行

部署一般采用手动完成,前6个步骤都是通过Maven进行实现。

3.Maven的核心概念

  • POM:Maven的核心,它是一个文件,名称通常为pom.xml,开发人员通过管理pom.xml可以完成控制maven构建项目的过程以及jar包依赖的管理。

  • 约定的目录结构 : maven项目的目录和文件的位置都是规定的。

  • 坐标 : 是一个唯一的字符串,用来表示资源的。

  • 依赖管理 : 管理项目中可以使用的jar文件。

  • 仓库管理(了解) :资源存放的具体位置。

  • 生命周期 (了解) : maven工具构建项目的过程,就是生命周期。即Maven项目构建的7个步骤就代表Maven的生命周期。

  • 插件和目标(了解):执行maven构建的时候用的工具是插件

  • 继承(后期讲解)

  • 聚合(后期讲解)

可以使用maven的命令完成相关操作,同时也可以在idea中直接使用maven,代替命令。

Maven的构建直接看视频即可。

4.Maven的核心概念详述

4.1 Maven工程约定的目录结构

mvn compile:编译src/main/java下的所有java文件,生成class文件,正确执行mvn compile命令的结果是在项目的根目录(Hello)下生成target目录,maven对java文件进行编译,将编译完成的class文件放在target/classes

4.2 pom文件

pom在maven中是一个pom.xml文件,该文件是maven的灵魂,maven的项目构建以及管理依赖的功能都是通过编写该文件实现的。

4.2.1 pom.xml文件的组成

(1) 坐标

唯一值, 在互联网中唯一标识一个项目的。坐标由三部分构成

<groupId>公司域名的倒写</groupId>
<artifactId>自定义项目名称</artifactId>
<version>自定版本号</version>

(2) packaging

打包后压缩文件的扩展名,默认是jar ,web应用是war

(3) 依赖

dependenciesdependency ,相当于是 java代码中import

你的项目中要使用的各种资源说明, 比我的项目要使用mysql驱动
<dependencies>
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.9</version>
	 </dependency>
</dependencies>

先在本地仓库中找mysql文件夹(groupId对应的文件夹),找到后在mysql文件夹中找mysql-connector-java文件夹(artifactId对应的文件夹),最后在mysql-connector-java文件夹中找5.1.9版本对应的文件夹(version对应的文件夹),然后把对应的jar包引入我们的项目中,如果有任意一步没找到对应文件夹,则从中央仓库拉取。

Maven的一个重要作用就是管理jar包,为了一个项目可以构建或运行,项目中不可避免的,会依赖很多其他的jar包,在Maven中,这些jar就被称为依赖,使用标签dependency来配置。而这种依赖的配置正是通过坐标来定位的,由此我们也不难看出,maven把所有的 jar 包也都视为项目存在了。

(4) properties

properties 是用来定义一些配置属性的 , 例 如 project.build.sourceEncoding(项目构建源码编码方式),可以设置为 UTF-8,防止中文乱码。同时也可以设置项目的运行的Java版本。

<properties>
	<java.version>1.8</java.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
</properties>

(5) build

build表示与构建相关的配置,例如设置编译插件的 jdk 版本

<build>
     配置插件
     <plugins> 
         配置具体的插件
         <plugin>
             <groupId>org.apache.maven.plugins</groupId> 
             插件的名称
             <artifactId>maven-compiler-plugin</artifactId> 
             插件的版本
             <version>3.8.1</version> 
             配置插件的具体信息
             <configuration> 
                 告诉Maven 我们写的代码需要在jdk1.8下编译
                 <source>1.8</source> 
                 告诉Maven 我们写的代码需要在jdk1.8下运行
                 <target>1.8</target> 
             </configuration> 
         </plugin> 
     </plugins> 
</build>

(6) parent

在 Maven 中,如果多个模块都需要声明相同的配置,例如:groupId、 version、有相同的依赖、或者相同的组件配置等,也有类似 Java 的继承机 制,用 parent 声明要继承的父工程的 pom 配置。

(7) modules

在 Maven 的多模块开发中,为了统一构建整个项目的所有模块,可以提供一 个额外的模块,该模块打包方式为 pom,并且在其中使用 modules 聚合的 其它模块,这样通过本模块就可以一键自动识别模块间的依赖关系来构建所有 模块,叫 Maven 的聚合。

4.3 Maven的生命周期和插件

  • Maven的生命周期指的就是maven构建项目的过程,包括清理、编译、测试、报告、打包、安装、部署这几个阶段。这几个阶段都可以通过Maven相对应的命令进行完成。

  • Maven的插件:在Maven执行命令的过程中,真正完成命令对应功能的就是这些插件。这些插件就是一些jar文件。

4.4 Maven单元测试

(1)加入依赖,在pom.xml加入单元测试依赖

<!-- 单元测试 -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>

(2)在maven项目中的src/test/java目录下,创建测试程序。

推荐的创建类和方法:
1.测试类的名称:Test + 你要测试的类名(注意类名Test必须大写,否则报错)
2.测试的方法名称:Test + 方法名称

例如你要测试Hello类中的add方法,则创建测试类TestHello
@Test
public void Testadd(){
    测试HelloMaven的add方法是否正确
}
其中testAdd叫做测试方法,它的定义规则
1.方法是public的,必须的
2.方法没有返回值, 必须的
3.方法名称是自定义的,推荐是Test + 方法名称
4.在方法的上面加入 @Test

具体实例如下:

//该测试用例表示测试Myapp类中的add()方法。
public class TestMyapp {
    @Test
    public void Testadd(){
        int ans = myapp.add(10,20);
        //Assert.assertEquals(期望值,实际值),当两者不一样的时候将会抛出异常。
        Assert.assertEquals(30,ans);
    }
}

4.5 Maven常用命令

Maven可以独立使用,通过以下的命令就可以单独完成maven的生命周期的执行

  • mvn clean:清理(会删除原来编译和测试的目录,即 target 目录,但是已经 install 到仓库里的包不会删除) ,该命令由maven-clean-plugin插件实现。
  • mvn compile:编译主程序(会在当前目录下生成一个 target,里边存放编译主程序之后生成的字节码文件,并同时把main\resources下的配置文件复制一份至target\classes中) ,该命令由maven-compiler-plugin插件实现。
  • mvn test-compile:编译测试程序(会在当前目录下生成一个 target,里边存放编译测试程序之后生成的字节码文件)
  • mvn test:测试(会生成一个目录surefire-reports,保存测试结果)
  • mvn package:打包主程序(会编译、编译测试、测试、并且按照 pom.xml 配置把主程序打包生成 jar 包或者 war 包) (该命令生成的jar包只包含src/main目录下的所有文件,test不包含。)
  • mvn install:安装主程序(会把本工程打包,并且按照本工程的坐标保存到本地仓库中)
  • mvn deploy:部署主程序(会把本工程打包,按照本工程的坐标保存到本地库中,并且还会保存到私服仓库中。 还会自动把项目部署到 web 容器中)。

注意:执行以上命令必须在命令行进入 pom.xml 所在目录,同时比如你执行mvn test,Maven会自动从上往下帮你执行,因此你不必在执行mvn test-compile等命令。

5.Maven在IDEA中的使用

5.1 Maven在IDEA中的配置

idea中内置了maven ,一般不使用内置的, 因为用内置修改maven的设置不方便。使用自己安装的maven, 需要覆盖idea中的默认的设置。让idea指定maven安装位置等信息

(1)配置当前工程的设置, 
file--settings ---Build, Excution,Deployment--Build Tools--Maven 
    Maven Home directory: maven的安装目录
    User Settings File :  就是maven安装目录conf/setting.xml配置文件
    Local Repository :    本机仓库的目录位置

--Build Tools--Maven--Runner  
	VM Option: -DarchetypeCatalog=internal
	JRE: 你项目的jdk

maven项目创建时,会联网下载模版文件,模版文件比较大, 使用-DarchetypeCatalog=internal,不用下载, 创建maven项目速度快。

(2)配置以后新建工程的设置, file--other settings--Settings for New Project

5.2 使用Maven模板创建项目

  • maven-archetype-quickstart : 普通的java项目
  • maven-archetype-webapp : web工程

6.Maven依赖的范围

Maven中的依赖范围利用<scope></scope>标签表示。scope的值有 compile, test, provided ,默认是compile

scope:表示依赖使用的范围,也就是在maven构建项目的相应阶段中起作用。maven构建项目的过程即生命周期,包括编译,测试,打包,安装,部署过程(阶段)。

例如junit的依赖范围是 test,表示junit只在测试阶段使用。
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>

provided的含义在于:在编译、测试阶段需要提供相关的jar包,而在安装部署过程则不需要提供。
posted @ 2021-06-05 12:58  控球强迫症  阅读(369)  评论(1编辑  收藏  举报