零基础手把手教你如何使用Maven搭建管理项目
Maven的了解
项目的构建
构建是面向过程的,就是一些步骤,完成项目的编译、测试、运行、打包、部署等。
maven支持的构建包括:
-
清理:把之前的项目编译的东西删除调,为新的编译代码做准备。
-
编译:把程序的源代码编译成执行代码,批量的。maven可以把成千上万个文件编译成class
-
测试:可以批量执行多个测试,同时测试很多功能。
-
报告:生成测试结果文件。
-
打包:测试通过后所有的class文件和配置文件放到一个压缩文件中,就是项目的结果文件,通常java程序压缩文 件是jar
web应用是.war文件。
-
安装:把5中的文件jar,war安装到本机仓库。
-
部署:把程序安装好可以执行。
核心概念
- POM:一个文件,名称是pom.xml,maven把一个项目当作模型使用。
- 约定的目录结构:maven项目的目录和文件的位置都是固定的。
- 坐标:是一个唯一的字符串,用来表示资源。
- 依赖管理:管理项目中可用的jar文件
- 仓库管理(了解):资源存放的位置。
- 生命周期(了解):构建项目的过程,就是声明周期。
- 插件和目标(了解):执行maven时候使用的工具就是插件。
- 继承
- 聚合
安装
如果直接使用IDEA可以忽略!
- 官网下载:https://maven.apache.org/download.cgi
-
解压并添加环境变量
M2_HOME = 解压后的项目
再把M2_HOME加入到Path中
- 验证
Maven的使用
约定的目录结构
约定是大家都遵循的规则,每一个maven项目在磁盘上都是文件夹。
Hello/
-----/src
---------/main #放置主程序java代码和配置文件
--------------/java #程序包和包中的Java文件
--------------/resources #java程序中需要的配置文件
---------/test #放测试程序代码和文件(可以没有)
--------------/java #程序程序包和包中的Java文件
--------------/resources #测试java程序中需要的配置文件
------/pom.xml #maven的核心文件,maven项目必须有
仓库
设置本机仓库:
- 修改maven的配置文件,maven的安装目录/conf/settings.xml(先备份settings.xml)
- 修改<localRepository>指定你的目录,不要使用中文目录
仓库的分类:
-
本地仓库:就是你的个人计算机上的一个文件夹存放各种jar包
-
远程仓库:在互联网上要使用网络下载才能进行使用
①中央仓库:最权威,所有开发人员共享使用的地址。
②中央仓库镜像:中央仓库的备份,会首先访问。
③私服:在局域网中使用的,不是对外使用的。
POM文件
基本信息
- modelVersion:Maven的版本,对于Maven2和3来说,只能是4.0.0
- groupId:组织id,一般是公司名的倒写,格式可以是
1. 域名倒写:例如com.baidu
2. 域名倒写+项目名。例如:com.baidu.applo - artifactId:项目名称,也就是模块名称,对应groupId中的子项目
- version:项目的版本号,如果项目还在开发中,是不稳定版本,通常在版本后面带–SNAPSHOT,version使用三位数字标识,比如1.0.0
通过groupId、artifactId、version构成了一个坐标值。
- packaging:项目的打包类型,可以是jar,war,rar,ear,pom默认是jar
- dependencies和dependency(依赖):项目中要使用的资源说明,相当于import
- properties:配置属性
- build:表示与构建相关的配置,例如编译插件的jdk版本
- parent:继承
- modules:聚合
单元测试
用的是junit,是一个专门测试的框架(工具)
junit的测试内容:测试是类中的方法,每一个方法都是独立测试的,方法是测试的基本单元。
步骤:
- 加入依赖
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
-
在maven项目下的src/test/java目录下,创建测试程序
推荐的创建类和方法的提示:
- 测试类的名称:Test + 要测试的类名
- 测试方法的名称:Test + 要测试的方法名称
例如测试Hellomaven,创建测试类TestHelloMaven
@Test
public void testAdd(){
//测试结果是否正确
}
其中testAdd为测试方法,它的定义规则:
- 方法是public的,必须的
- 方法没有返回值,必须的
- 方法名称是自定义的,推荐是Test+被测试方法
- 方法的上面加@Test
命令的使用
- mvn clean :清理(会删除原来编译和测试的目录,也就是target目录,但是已经完成install到仓库里的包不会删除)
- mvn compile:编译主程序(会在当前目录下面生成一个target,里面存放着编译主程序后的字节码文件)
- mvn test-compile:编译测试文件(会在当前目录下面生成一个target,里面存放编译测试程序之后生成的字节码文件)
- mvn test:测试,会生成一个目录,surefire-reports,保存测试结果
- mvn package:打包主程序(会编译、编译测试、测试并按照配置文件把主程序打包成jar包或者war包)
- mvn install:安装主程序(会把本工程打包,并且按照本工程的坐标保存到本地仓库当中)
- mvn deploy:部署主程序。
注意:执行以上命令必须要在命令行进入pom.xml所在的目录。
插件的配置
可以去Maven的仓库下载!
IDEA中应用Maven(必会)
前面的当作了解的话,那么下面的一定要掌握,因为在项目开发中会经常使用到的!
IDEA中集成Maven
-
在idea中设置maven,让idea和maven结合使用
idea中内置了maven,但是不建议使用,因为内置的修改maven设置很不方便。
使用自己安装的,覆盖原来的配置。
配置当前工程:
注意:图片中要改成:-DarchetypeCatalog=internal才有有效!!!!
注意:创建项目要是失败报错:Process terminated,就去掉archetypeCatalog=internal这句话,重新新建项目就好啦!
或者图片中要改成:-DarchetypeCatalog=internal才有有效!!!!
配置新建的所有工程:
IDEA的版本不一样,入口也不太一样,可以自己摸索摸索!
使用模板创建SE项目
- 选择创建maven项目,勾选creat from archetype,选择quickstart
- 输入项目名
- 检查和填写项目信息
- 创建项目要是失败报错:Process terminated就去掉maven中runner的archeTypeCatalog=internal这句话,重新新建项目就好啦!
使用单元测试
- pom文件最终样子
<?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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.liang</groupId>
<artifactId>maven_01</artifactId>
<version>1.0-SNAPSHOT</version>
<name>maven_01</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<!--构建项目使用utf-8-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--编译代码使用的jdk版本-->
<maven.compiler.source>1.8</maven.compiler.source>
<!--代码运行环境使用的jdk版本-->
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!--依赖-->
<dependencies>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
- 编写测试类
package org.liang;
/**
* @author liang
* @date 编写日期: 2022/3/15 20:35
*/
public class HelloMaven {
public int add(int n1,int n2){
return n1+n2;
}
public static void main(String[] args) {
HelloMaven helloMaven = new HelloMaven();
int res = helloMaven.add(12,20);
System.out.println("10+20="+res);
}
}
- 测试如果报错:“Error:(3, 24) java: 程序包org.junit不存在”
可以参考以下文章进行解决:
https://blog.csdn.net/magcfield/article/details/107793814
- 测试成功
使用IDEA中的Maven窗口
写测试类
package org.liang;
import org.junit.Assert;
import org.junit.Test;
/**
* @author liang
* @date 编写日期: 2022/3/15 20:48
*/
public class TestHelloMAven {
@Test
public void testAdd(){
HelloMaven hello = new HelloMaven();
int res = hello.add(10,20);
//判断结果是否正确
Assert.assertEquals(30,res);
}
}
- 窗口
使用IDEA创建WEB项目
- 选择webapp工程
- 其他的一样
- 导入依赖就可以些项目啦
- 项目完成后可以使用右侧的maven窗口package命令打包
其他了解
依赖使用范围
使用scope表示,表示在构建项目的哪些阶段起作用。
scope的值有:compile、test、provide,默认是compile!!!
常用操作
- 属性设置
<properties>
<!--构建项目使用utf-8-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--编译代码使用的jdk版本-->
<maven.compiler.source>1.8</maven.compiler.source>
<!--代码运行环境使用的jdk版本-->
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
- 全局变量
自定义属性:1. 在<properties>中,通过自定义标签声明变量。
2. 在pom.xml文件中的其他位置,使用${标签名}使用变量的值
自定义全局变量一般是定义依赖的版本号,当你的项目中要使用多个相同的版本号,先使用全局变量,再使用${变量名}
<junit.version>5.2.0</junit.version>
<!--依赖-->
<dependencies>
<!--单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
- 资源插件
-
默认没有使用resources的时候,maven执行代码的时候会自动把>src/main/resources中的文件拷贝到target/classes的目录下面。
-
对于src/main/java目录下的非java文件不处理,不拷贝到target/classes的目录下面
-
如果需要处理src/main/java目录下的文件,需要在<build>中加入<resources>中
<build>
<resources>
<resource>
<directory>src/main/java</directory><!--所在的目录-->
<includes><!--包括目录下的.properties, .xml文件都会扫描到-->
<include>**/*.properties</include>
<include>* */*.xml</include>
</includes>
<!-- filtering选项false不启用过滤器,* .property已经起到过滤的作用了-->
<filtering>false</filtering>
</resource>
</resources>
</build>