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
的
下载下来解压即可.
各目录的作用:
bin:可执行程序目录,
boot:maven自身的启动加载器
conf:maven配置文件的存放目录
lib:maven运行所需库的存放目录
3.2,配置环境变量
配置JAVA_HOME
—你的java安装目录
配置maven环境变量:在系统变量—Path—配置你的maven的bin目录
测试配置后的结果:—cmd–mvn -v
出现一堆信息表示配置成功.
四.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>
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>
-->
修改为:
<!-- 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会下载很多东西
出现BUILD SUCESS
说明成功:
编译完成后在项目project-java
下多了一个目录target
,在这个目录下就存放的是maven编译好的一些东西
我们可以进入到target目录查看
其中生成的classes目录就是编译好的字节码文件
(2)当然如果我们想清理掉这些东西,我们只需执行mvn clean命令即可,清理掉后target目录也就消失了
(3)如果我们要执行测试包中的测试程序,我们只需执行mvn test命令即可
期望值和实际值一致,则正常编译执行
如果把程序中期望值改为其他的:
例如:
则会抛出异常.
(4)使用mvn package
命令进行打包,如下
在生成的target
目录中可以看到打包的结果
当然,如果仔细看DOS窗口输出的我们会发现,mvn package
命令的时候maven会把前面两个命令mvn compile,mvn test
都执行一遍
(5)使用mvn install
命令进行安装,将项目打好的包存入本地仓库
仔细查看输出会发现mvn install命令执行的时候也会将前面的命令都执行一遍
此时我们可以去本地仓库中查找
maven是按照groupId/artifactId/version
的结构在本地仓库进行存储
5.2.2 IDEA工具搭建maven项目
前面学习的基本都是通过命令来构建和管理项目,但是这在实际开发过程中基本不常用,常用的是通过相关IDE工具来进行项目的构建和管理,因此我们使用IDEA工具进行maven项目的搭建
需要注意的是:Maven和IDEA在版本上存在一些兼容性问题,因为要合理的选择Maven和IDEA的版本,本课程中提供安装maven-3.6.1版本是可用的
-DarchetypeCatalog=internal
maven 创建项目时,会从网络中下载一个archetype-catelog.xml作为项目模版文件,加上-DarchetypeCatalog=internal
告诉maven创建项目时不要下载这个文件,加快创建maven项目的速度.
然后在设置这个,作用是对新建的或者导入的项目也使用同样的maven设置
设置跟刚才一样
创建maven模块
加载完毕即可
创建好的maven目录
那么如何使用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);
}
}
执行测试一下:
编写测试代码:
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);
}
}
如果期望值和实际值不一样,则会抛出异常:
Assert.assertEquals(40,result);
maven使用技巧:
点击最右侧maven窗口:
可以使用和命令行一样的功能,至此,maven先学到这里了!
本文作者: CodeAnime
本文链接: https://codeanime.cc/Maven%E5%B0%8F%E8%AE%B0.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!