Maven小记

本文最后更新于:2021年10月10日 上午

Maven小记

一.Maven简介

Maven是由Apache开发的一个工具软件。用来管理java项目依赖管理(jar包的管理),项目构建.

二.Maven的作用

Maven的作用可以分成三类:

  • 项目构建

  • 依赖管理

  • 统一开发结构

    HelloMaven(Maven工程的根目录,目录名可以自定义)
    |-- pom.xml(Maven工程的核心配置文件)
    |-- src(存放源码的目录)
        |-- main(主程序,简单来说就是我们写的非测试代码)
        |   |-- java(主程序的Java代码)
        |   |-- resources(主程序的配置文件,xml文件,properties文件等)
        |-- test(测试程序)
            |-- java(测试程序的Java代码)
            |-- resources(测试程序的配置文件,xml文件,properties文件等)

三.Maven环境搭建

3.1,下载maven压缩包

maven官网:https://maven.apache.org/

maven下载地址:http://maven.apache.org/download.cgi

我下的.zip

image-20211009091852503

下载下来解压即可.

各目录的作用:

bin:可执行程序目录,

boot:maven自身的启动加载器

conf:maven配置文件的存放目录

lib:maven运行所需库的存放目录

3.2,配置环境变量

配置JAVA_HOME—你的java安装目录

image-20211009092614772

配置maven环境变量:在系统变量—Path—配置你的maven的bin目录

image-20211009092507066

测试配置后的结果:—cmd–mvn -v

image-20211009092936716

出现一堆信息表示配置成功.

四.Maven核心概念

4.1 仓库

仓库:用于存储资源,主要是各种jar包

maven仓库可以分为两种:本地仓库和远程仓库.

**本地仓库:**开发者自己电脑上存储资源的仓库,也可从远程仓库获取资源

**远程仓库:**可以分为中央仓库和私服

  • 中央仓库:maven团队维护的仓库, 仓库地址
  • 私服:各公司/部门等小范围内存储资源的仓库,私服也可以从中央仓库获取资源

4.2 坐标

坐标元素:

  • groupId : 定义当前Maven项目组织名称(通常是域名反写,如:org.mybatis;)

  • artifactId : 定义实际项目名称

  • version : 定义当前项目的当前版本或者是所依赖的jar包的版本

<groupId>com.codeanime</groupId>
<artifactId>HelloMaven</artifactId>
<version>1.0.1</version>

坐标的作用:

使用唯一标识,唯一性定义资源位置,通过该标识可以将资源的识别与下载工作交由机器完成

4.3 生命周期

Maven生命周期就是为了对所有的构建过程进行抽象和统一。包括项目清理、初始化、编译、打包、测 试、部署等几乎所有构建步骤。生命周期可以理解为构建工程的步骤。

maven生命周期(项目构建的过程):

对项目进行清理、编译、测试、报告、打包、安装、部署上传到私服的过程。

清理(mvn clean):它删除在构建编译和测试时在项目目录中生成target目录的文件。但是已经install到仓库里的包不会删除。
编译(mvn compile):maven可以批量的把程序源代码编译为执行代码(.java编译成.class),maven可以同时把成千上百的文件编译为class,javac不一样,javac一次编译一个文件。在pom.xml同级目录下生成target目录存放主程序编译之后的.class字节码文件。
测试编译(mvn test-compile):maven可以批量的同时执行测试程序代码以及测试功能,验证功能正确性,在pom.xml目录下生成target目录存放主程序编译之后的.class字节码文件。
测试(mvn test):maven可以批量的同时测试很多功能,在pom.xml同级目录下生成surefire-reports目录,保存测试结果。
报告:生成测试结果的文件存放在surefire-reports目录,测试通过没有。
打包(mvn package):把你的项目中src/main/java目录下所有的.class文件,src/main/resources目录下配置文件等所有资源放到一个压缩文件中。这个压缩文件就是项目的结果文件,通常java程序,压缩文件是.jar扩展名的。对于web应用,压缩文件扩展名是.war。总而言之,会把编译、编译测试、测试、并且按照pom.xml配置把主程序打包生成jar包或者war包。
安装(mvn install):把打包(mvn package)中生成的文件jar、war安装到本地仓库。会把本工程打包,并且按照本工程的项目坐标(三个参数)保存到本地仓库中。
部署(mvn deploy):程序安装后可以执行,把本工程打包,按照本项目工程的项目坐标(三个参数)保存到本地仓库中,并且还会保存到私服仓库中以及自动把项目部署到web容器中。
注意:执行以上命令必须在命令行进入pom.xml所在目录!

常用命令:

mvn -version         查看maven的版本及配置信息
mvn compile          编译项目代码
mvn package          打包项目
mvn test             运行单元测试
mvn clean            清除编译产生的target文件夹内容,可以配合相应命令一起使用,如mvn clean package, mvn clean test
mvn install          打包后将其安装在本地仓库
mvn deploy           打包后将其安装到pom文件中配置的远程仓库
mvn site             生成站点目录  

4.4 pom文件

pom.xml是maven的核心文件,是maven的灵魂。

pom.xml结构说明:

4.41 modelVersion

Maven模型的版本,对于Maven2和Maven3来说,它只能是4.0.0

<modelVersion>4.0.0</modelVersion>

4.42 groupid

组织id,一般是公司域名的倒写:

例如:com.baidu或者com.baidu.project

<groupId>com.baidu</groupId>
<groupId>com.baidu.project</groupId>

4.43 artifactId

项目名称,也是模块名称,对应groupId中项目中的子项目

<artifactId>projectname</artifactId>

4.44 version

项目版本号。如果项目还在开发中,是不稳定版本,通常在版本后带-SNAPSHOT,version使用三位数字标识,例如1.0.1

4.45 gav

groupId、artifactId、version三个元素合并在一起统称为项目坐标,项目坐标具有唯一性,称之为唯一值,在互联网中唯一标识一个项目的,在中央仓库中就是根据项目坐标的唯一值,在资源库中搜索下载相应的jar包

<groupId>公司域名的倒序</groupId>
<artifactId>项目名称</artifactId>
<version>版本号</version>

假如,获取mysql5.0.8连接驱动,必须在pom.xml中声明mysql连接驱动在仓库中唯一性项目坐标搜索下载jar包。打开地址:https://mvnrepository.com/,键入mysql关键字找到对应版本。

<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.0.8</version>
</dependency>

image-20211009104129229

4.46 packaging

项目打包的类型,可以是jar、rar、ear、pom,web应用是war, packaging可以不写,默认是jar

4.47 依赖(dependencies和dependency)

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

<!--  依赖 相当于java代码中的 import -->
  <dependencies>
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.0.8</version>
</dependency>
      
    <!--单元测试程序的依赖 -->
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
  </dependency>
    
</dependencies>

4.48 properties

properties是用来定义一些配置属性的,例如project.build.sourceEncoding(项目构建源码编码方式),可以设置为UTF-8,防止中文乱码,也可定义相关构建版本号,便于日后统一升级

<!--配置属性 -->
<properties>
  <!--构建源码编码方式 -->
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <!--jdk版本 -->
  <java.version>1.8</java.version>
  <!--maven构建版本号 -->
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
</properties>

4.49 bulid

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

例如,使用maven项目骨架快速创建java项目时,会自动生成一堆的maven生命周期的插件,都放在build中:

<build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
        <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
        <plugin>
          <artifactId>maven-site-plugin</artifactId>
          <version>3.7.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-project-info-reports-plugin</artifactId>
          <version>3.0.0</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

4.5 Maven命令和插件

maven命令:maven独立使用,通过命令,完成maven的生命周期的执行。maven可以使用命令,完成项目的清理,编译,测试等等

maven的插件:maven命令执行时,真正完成功能的是插件,插件是一些jar文件,一些类

4.6 单元测试junit

单元测试:用的是junit,是一个专门测试的框架(工具)

junit测试内容:测试的是类中的方法,每一个方法都是独立测试的。方法是测试的基本单位(单元)

maven借助单元测试,批量测试类中的大量方法是否符合预期的

使用:

(1)在pom.xml中加入依赖

<!--单元测试程序的依赖 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

五.Maven项目搭建

5.1 仓库配置

我们要在自己的电脑上开发,那么首先就是要配置本地仓库

在maven的配置文件conf/settings.xml中可以找到它的说明

<!-- localRepository
  | The path to the local repository maven will use to store artifacts.
  |
  | Default: ${user.home}/.m2/repository
 <localRepository>/path/to/local/repo</localRepository>
 -->

修改为:

image-20211009100327288

<!-- 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>E:\maven-repository</localRepository>

5.2 Maven项目搭建

HelloMaven	                //项目文件夹
	\src
		\main	            //主程序目录(完成项目功能的代码和配置文件)
    		\java	        //源代码(包和相关的类定义)
    		\resources	    //配置文件
    	\test	            //放置测试程序代码的
    		\java	        //测试代码(junit)
    		\resources      //测试程序需要的配置文件
    \pom.xml                //maven的配置文件

5.2.1 手动搭建maven项目

(1)在E盘下创建目录MavenProject并进入该目录,作为我们的操作目录

(2)创建我们的maven项目,创建一个目录project-java作为我们的项目文件夹,并进入到该目录

(3)创建java代码(源代码)所在目录,即创建src/main/java

(4)创建配置文件所在目录,即创建src/main/resources

(5)创建测试源代码所在目录,即创建src/test/java

(6)创建测试存放配置文件存放目录,即src/test/resources

(7)在src/main/java中创建一个包(注意在windos文件夹下就是创建目录)com/codeanime,在该目录下创建HelloMaven.java文件,作为演示所需java程序,内容如下:

package com.codeanime;

public class HelloMaven{
    public static void main(String args[]){
        HelloMaven hm = new HelloMaven();
        int result = hm.addNumber(10,20);
         System.out.println("在main方法中执行addNumber方法"+result);
    }
	public int addNumber(int n1,int n2){
        System.out.println("HelloMaven--addNumber");
        return n1+n2;
    }
}

(8)在src/test/java中创建一个测试包(目录)com/codeanime,在该包下创建测试程序TestHelloMaven.java

package com.codeanime;
import org.junit.Assert;
import org.junit.Test;
public class TestHelloMaven{
    //定义多个独立的测试方法,每个方法都是独立的
    @test
    public void testAddNumber(){
        System.out.println("执行测试方法testAddNumber");
        HelloMaven hm = new HelloMaven();
        int result = hm.addNumber(10,20);
        //把计算结果result交给junit判断
        //期望值,实际值
        Assert.assertEquals(30,result);
    }
}

(9)在project-java/src下创建pom.xml文件,编辑如下

<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>


     <!--父工程-->
    <groupId>com.codeanime</groupId>
    <artifactId>project-java</artifactId>
    <version>1.0.1</version>
    <packaging>jar</packaging>

    <!--    导入依赖-->
	<dependencies>

	<!--    junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
    

</project>

通过前面的操作,我们已经搭建好了maven的项目结构,下面要通过maven来构建我们的项目

maven的构建命令以mvn开头,后面添加功能参数,可以一次性执行多个命令,用空格分离

mvn compile:编译

mvn clean:清理

mvn test:测试

mvn package:打包

mvn install:安装到本地仓库

下面我们来进行操作:

(1)进入priject-java目录(目录中有src和pom.xml)运行cmd,执行命令mvn compile:

第一次运行maven会下载很多东西

image-20211009170152974

出现BUILD SUCESS说明成功:

image-20211009170231412

编译完成后在项目project-java下多了一个目录target,在这个目录下就存放的是maven编译好的一些东西

image-20211009171144174

我们可以进入到target目录查看

其中生成的classes目录就是编译好的字节码文件

(2)当然如果我们想清理掉这些东西,我们只需执行mvn clean命令即可,清理掉后target目录也就消失了

image-20211009171849570

image-20211009171907473

(3)如果我们要执行测试包中的测试程序,我们只需执行mvn test命令即可

image-20211009171957253

期望值和实际值一致,则正常编译执行

image-20211009172035674

如果把程序中期望值改为其他的:

例如:

image-20211009172136801

则会抛出异常.

(4)使用mvn package命令进行打包,如下

image-20211009172651504

在生成的target目录中可以看到打包的结果image-20211009172704400

当然,如果仔细看DOS窗口输出的我们会发现,mvn package命令的时候maven会把前面两个命令mvn compile,mvn test都执行一遍

(5)使用mvn install命令进行安装,将项目打好的包存入本地仓库

image-20211009172809262

仔细查看输出会发现mvn install命令执行的时候也会将前面的命令都执行一遍

此时我们可以去本地仓库中查找

maven是按照groupId/artifactId/version的结构在本地仓库进行存储

image-20211009172916138

5.2.2 IDEA工具搭建maven项目

前面学习的基本都是通过命令来构建和管理项目,但是这在实际开发过程中基本不常用,常用的是通过相关IDE工具来进行项目的构建和管理,因此我们使用IDEA工具进行maven项目的搭建

需要注意的是:Maven和IDEA在版本上存在一些兼容性问题,因为要合理的选择Maven和IDEA的版本,本课程中提供安装maven-3.6.1版本是可用的

image-20211010083634827

image-20211010083953518

-DarchetypeCatalog=internal

maven 创建项目时,会从网络中下载一个archetype-catelog.xml作为项目模版文件,加上-DarchetypeCatalog=internal告诉maven创建项目时不要下载这个文件,加快创建maven项目的速度.

然后在设置这个,作用是对新建的或者导入的项目也使用同样的maven设置

image-20211010084612788

设置跟刚才一样

image-20211010085108710

image-20211010085241690

创建maven模块

image-20211010085548600

image-20211010085741252

image-20211010090038446

加载完毕即可

image-20211010090310932

创建好的maven目录

image-20211010090451143

那么如何使用maven呢

首先,编写java程序:

package com.codeanime;

public class HelloMaven {
    public int addNumber(int n1,int n2){
        return n1+n2;
    }

    public static void main(String[] args) {
        HelloMaven helloMaven = new HelloMaven();
        int result = helloMaven.addNumber(10,20);
        System.out.println("result = "+result);
    }
}

执行测试一下:

image-20211010091400326

编写测试代码:

package com.codeanime;

import org.junit.Assert;
import org.junit.Test;

public class TestHelloMaven {
    @Test
    public void testAddNumber1(){
        System.out.println("testAddNumber1正在运行中-----------");
        HelloMaven helloMaven = new HelloMaven();
        int result = helloMaven.addNumber(10, 20);
        Assert.assertEquals(30,result);

    }

    @Test
    public void testAddNumber2(){
        System.out.println("testAddNumber2正在运行中=============");
        HelloMaven helloMaven = new HelloMaven();
        int result = helloMaven.addNumber(10, 20);
        Assert.assertEquals(30,result);

    }
}

image-20211010091958024

如果期望值和实际值不一样,则会抛出异常:

Assert.assertEquals(40,result);

image-20211010092216676

maven使用技巧:

点击最右侧maven窗口:

image-20211010092650290

可以使用和命令行一样的功能,至此,maven先学到这里了!


本文作者: CodeAnime
本文链接: https://codeanime.cc/Maven%E5%B0%8F%E8%AE%B0.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!