maven基础教程

一、安装moven

1、下载maven包

首先到maven官网下载安装包,解压到本地目录,然后配置环境变量。
maven下载地址:https://maven.apache.org/download.cgi
在这里插入图片描述

2、配置环境变量

然后打开环境变量,添加 MAVEN_HOME 系统变量,并且在PATH中添加 %MAVEN_HOME%\bin
在这里插入图片描述

在这里插入图片描述

3、验证

接下里可以打开cmd,执行mvn -v,如果能打印出maven的版本信息,那么说明已经配置成功!
在这里插入图片描述

安装maven前,我们需要保证本机上已经安装了jdk,可以运行java -version,如果看到java的包信息,则说明java已经正确配置。
并且,我们还需要保证环境变量中已经正确配置了JAVA_HOME变量,可以运行 echo %JAVA_HOME%,如果能正确打印出java包的地址则说明配置正常。

在这里插入图片描述

二、指定本地仓库

maven安装完成后,下载的所有第三方以来包,都会保存在一个本地仓库中,仓库地址默认是${user.home}/.m2/repository,其中${user.home}是当前系统用户的目录,一般这个目录会在C盘,考虑到后期可能第三方以来可能会很多,建议把仓库修改到其他空间更大的盘符。
打开maven安装目录\conf\settings.xml,搜索localRepository,我们看到默认有被注释的本地仓库地址配置代码
在这里插入图片描述
这里设置仓库地址是:D:\maven\repository
在这里插入图片描述

注意所有用到的路径,都需要使用 非中文 的路径。

三、设置阿里云镜像仓库地址

当我们本地没有需要的jar包时,就需要到远程仓库去下载,默认的仓库是在国外下载很慢,这里我们可以设置成国内的阿里云镜像仓库。

打开maven安装目录\conf\settings.xml,搜索<mirrors>,注释原来的<mirror>标签,然后在内部写入下面的仓库配置:

<mirror>
	<id>nexus-aliyun</id>
	<mirrorOf>central</mirrorOf>
	<name>Nexus aliyun</name>
	<url>http://maven.aliyun.com/nexus/content/groups/public</url> 
</mirror>

在这里插入图片描述

四、配置JDK版本

找到 <profiles></profiles> 标签,在最下面配置上maven编译环境、jdk环境等配置

<profile>
	 <id>jdk-dev</id>
	 <activation>
		<activeByDefault>true</activeByDefault>
		<jdk>20.0</jdk>
	 </activation>
	 <properties>
		<maven.compiler.source>20.0</maven.compiler.source>
		<maven.compiler.target>20.0</maven.compiler.target>
		<maven.compiler.compilerVersion>20.0</maven.compiler.compilerVersion>
	 </properties>
</profile>

五、坐标

1、基本概念

maven中的每一个jar包,都可以用坐标来定位到。坐标包含三个元素,groupid、artifactid、version。
例如:

  • groupid:com.arguigu.maven
  • artifactid:pro01-atguigu-maven
  • version:1.0-SNAPSHOT

2、坐标和仓库中的jar包的存储路径之间的对应关系

坐标:

<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>

上面坐标对应的 jar 包在 Maven 本地仓库中的位置:

Maven本地仓库根目录\javax\servlet\servlet-api\2.5\servlet-api-2.5.jar

一定要学会根据坐标到本地仓库中找到对应的 jar 包。

六、创建java工程

1、创建步骤

执行命令:mvn archetype:generate,接下来是这样的过程:

  1. 首先会下载各种包,我们可以看到下载的时候是从设置的mirror阿里云镜像仓库下载。
  2. 下载完成后,会让你选择archetype的安装模式,系统默认是选择的模式7,快速创建模式。
    在这里插入图片描述
  3. 然后输入groupid:com.atguigu.maven
  4. 输入artifactId:pro01-maven-javaversionpackage默认,直接回车就行。
    在这里插入图片描述
  5. 安装成功,界面打印如下:
    在这里插入图片描述
    控制台打印出项目路径:groupid、package、artifactid、packageName、version。
    项目目录会自动生成项目的初始代码:
    在这里插入图片描述
    安装过程中下载的包,会被放到本地仓库中:
    在这里插入图片描述

2、pom.xml解读

默认生成的项目pom.xml文件中,junit版本是3.8.1有点低,我们改成4.12版本(4.x版本支持@test)。

<!--project 标签:根标签,表示对当前工程进行配置、管理-->
<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 标签:从maven2开始就固定4.0.0-->
  <!--表示pom.xml所采用的标签结构。-->
  <modelVersion>4.0.0</modelVersion>

  <!--坐标信息:-->
  <groupId>com.atguigu.maven</groupId>
  <artifactId>pro01-maven-java</artifactId>
  <version>1.0-SNAPSHOT</version>
  
  <!-- 当前Maven工程的打包方式,可选值有下面三种: -->
  <!-- jar:表示这个工程是一个Java工程  -->
  <!-- war:表示这个工程是一个Web工程 -->
  <!-- pom:表示这个工程是“管理其他工程”的工程 -->
  <packaging>jar</packaging>

  <name>pro01-maven-java</name>
  <url>http://maven.apache.org</url>

  <properties>
  	<!-- 工程构建过程中读取源码时使用的字符集 -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
	
  <!-- 当前工程所依赖的jar包 -->
  <dependencies>
  	<!-- 在dependency标签内使用具体的坐标依赖我们需要的一个jar包 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
      
      <!-- scope标签配置依赖的范围 -->
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

自动生成的App.javaAppTest.java可以删除。

pom.xml是maven工程下的核心文件,学习pom.xml的配置对于maven的学习非常重要。

3、核心概念:POM

  1. 含义
    POM:Project Object Model,项目对象模型。和 POM 类似的是:DOM(Document Object Model),文档对象模型。它们都是模型化思想的具体体现。
  2. 模型化思想
    POM 表示将工程抽象为一个模型,再用程序中的对象来描述这个模型。这样我们就可以用程序来管理项目了。我们在开发过程中,最基本的做法就是将现实生活中的事物抽象为模型,然后封装模型相关的数据作为一个对象,这样就可以在程序中计算与现实事物相关的数据。
  3. 对应的配置文件
    POM 理念集中体现在 Maven 工程根目录下 pom.xml 这个配置文件中。所以这个 pom.xml 配置文件就是 Maven 工程的核心配置文件。其实学习 Maven 就是学这个文件怎么配置,各个配置有什么用。

4、目录结构

在这里插入图片描述
还有一个target目录是用于存放构建操作输出的结果。

  1. 约定目录结构的意义
    Maven 为了让构建过程能够尽可能自动化完成,所以必须约定目录结构的作用。例如:Maven 执行编译操作,必须先去 Java 源程序目录读取 Java 源代码,然后执行编译,最后把编译结果存放在 target 目录。

  2. 约定大于配置
    Maven 对于目录结构这个问题,没有采用配置的方式,而是基于约定。这样会让我们在开发过程中非常方便。如果每次创建 Maven 工程后,还需要针对各个目录的位置进行详细的配置,那肯定非常麻烦。

目前开发领域的技术发展趋势就是:约定大于配置,配置大于编码。

5、常用命令

//删除target目录
mvn clean
//主程序编译
mvn compile

//测试程序编译
mvn test-compile
//主体程序编译结果存放的目录:target/classes
//测试程序编译结果存放的目录:target/test-classes
//测试操作
mvn test
//测试的报告存放的目录:target/surefire-reports
//打包操作
mvn package
//打包的结果——jar 包,存放的目录:target
//打包操作
mvn build

6、测试

  1. 创建测试类
    创建Calculator类,路径:\pro01-maven-java\src\main\java\com\atguigu\maven
package com.alex.maven;
	
public class Calculator {
	
	public int sum(int i, int j){
		return i + j;
	}
	
}

创建CalculatorTest类,路径:\pro01-maven-java\src\test\java\com\atguigu\maven

package com.alex.maven;
	
import org.junit.Test;
import com.alex.maven.Calculator;
	
// 静态导入的效果是将Assert类中的静态资源导入当前类
// 这样一来,在当前类中就可以直接使用Assert类中的静态资源,不需要写类名
import static org.junit.Assert.*;
	
public class CalculatorTest{
	
	@Test
	public void testSum(){
		
		// 1.创建Calculator对象
		Calculator calculator = new Calculator();
		
		// 2.调用Calculator对象的方法,获取到程序运行实际的结果
		int actualResult = calculator.sum(5, 3);
		
		// 3.声明一个变量,表示程序运行期待的结果
		int expectedResult = 8;
		
		// 4.使用断言来判断实际结果和期待结果是否一致
		// 如果一致:测试通过,不会抛出异常
		// 如果不一致:抛出异常,测试失败
		assertEquals(expectedResult, actualResult);
		System.out.println("test method have been called:CalculatorTest");
		
	}
	
}

  1. 测试成功
    新建完成上述两个类之后,我们在根目录下运行mvn test,控制台会打印测试结果。上述代码使用assertEquals断言,判断sum(5,3)计算结构是否和8一直,显然是正确的。
    在这里插入图片描述
  2. 测试失败
    如果我们把calculator.sum(5, 3)改成calculator.sum(5, 30),这时候显然是不正确,我们再看控制台打印的报错信息:
    在这里插入图片描述
    我们可以看到,代码中明确提示期望要8,但是给了35,错误原因一目了然。
  3. 测试报告
    测试报告路径:target>suerfire-reports,在这个目录下会保存测试类的测试结果。内容和test命令打印的一致。
    在这里插入图片描述
    在这里插入图片描述

7、打包

运行mvn package命令,生成jar包。
在这里插入图片描述
进入target目录,我们可以看到刚刚打包生成的jar包。
在这里插入图片描述

8、安装

安装的效果是将本地构建过程中生成的 jar 包存入 Maven 本地仓库。这个 jar 包在 Maven 仓库中的路径是根据它的坐标生成的。

运行mvn clean install命令,控制台打印:
在这里插入图片描述
红线标记的打印内容,说明了安装最终是生成了pom文件jar包到本地仓库中。这时候我们根据坐标信息,到本地仓库中去寻找刚刚安装的jar包,就可以找到内容。
在这里插入图片描述
我们看到,本地仓库中生成了两个坐标信息规则生成的*.pom文件和*.jar文件。*.pom文件和maven项目中的pom.xml的内容是一模一样。

七、创建web工程

1、步骤

mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-webapp \
-DarchetypeVersion=1.4 \
-DgroupId=com.atguigu.maven \
-DartifactId=pro02-maven-web \

2、目录结构

执行命令后,生成的项目目录如下:
在这里插入图片描述

3、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/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.atguigu.maven</groupId>
  <artifactId>pro02-maven-web</artifactId>
  <version>1.0-SNAPSHOT</version>
  <!--确认打包的方式是war包形式-->
  <packaging>war</packaging>

  <name>pro02-maven-web Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
	...
  </build>
</project>

4、创建servlet

  1. 首先在main目录下创建如下结构的文件目录:
    在这里插入图片描述
  2. 并创建一个HelloServlet.java文件,代码如下:
package com.alex.maven;
	
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;
	
public class HelloServlet extends HttpServlet{
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.getWriter().write("hello maven web");
		
	}
	
}

  1. 在 web.xml 中注册 Servlet
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>helloServlet</servlet-name>
    <servlet-class>com.alex.maven.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>helloServlet</servlet-name>
    <url-pattern>/helloServlet</url-pattern>
  </servlet-mapping>

</web-app>
  1. src\main\webapp\index.jsp 页面编写超链接
<!-- JSP全称是 Java Server Page,和 Thymeleaf 一样,是服务器端页面渲染技术。 -->
<html>
	<body>
		<h2>Hello World!</h2>
		<a href="helloServlet">Access Servlet</a>
	</body>
</html>
  1. 编译
    此时执行 mvn compile 命令,控制台会报错:
DANGER
程序包 javax.servlet.http 不存在
程序包 javax.servlet 不存在
找不到符号
符号:HttpServlet
...

我们的 Web 工程用到了 HttpServlet 这个类,而 HttpServlet 这个类属于 servlet-api.jar 这个 jar 包。此时我们说,Web 工程需要依赖 servlet-api.jar 包。我们需要到 maven官方仓库 找下servlet-api这个jar包,找到合适的版本,然后在pom.xml中添加对这个包的依赖。
在这里插入图片描述
在这里插入图片描述
我们看到最新的版本是4.0.1,我们在pom.xml中添加依赖版本4.0.1,配置如下:

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

这时候,我们再进行编译:mvn clean compile

常见报错处理

1、编译报错

在执行mvn compile命令时,控制台报错如下:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.10.1:compile (default-compile) on project pro01-maven-java: Fatal error compiling: 閿欒: 鏃犳晥鐨勭洰鏍囧彂琛岀増锛?0.0 -> [Help 1]m

这是由于当前maven的版本和maven-compiler-plugin的版本不匹配导致的,可以到 maven在线仓库 查看已有的版本,选择自己maven适合的版本,然后修改pom.xml文件中build>plugin配置。
例如:

  	<build>
		<!-- 打jar包插件-->
		<plugins>
			<!--修改maven-compiler-plugin版本-->
			<plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.11.0</version>
                <configuration>
                    <source>20</source><!--jdk大版本号-->
                    <target>20</target><!--jdk大版本号-->
                </configuration>
            </plugin>
 
		</plugins>
	</build>

编译成功时,控制台打印如下:
在这里插入图片描述

参考阅读:
https://blog.youkuaiyun.com/sgsgkxkx/article/details/123415521
B站教学视频

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT飞牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值