首先到maven官网下载安装包,解压到本地目录,然后配置环境变量。
maven下载地址:https://maven.apache.org/download.cgi
然后打开环境变量,添加 MAVEN_HOME
系统变量,并且在PATH中添加 %MAVEN_HOME%\bin
。
接下里可以打开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
,搜索
,注释原来的
标签,然后在内部写入下面的仓库配置:
<mirror>
<id>nexus-aliyunid>
<mirrorOf>centralmirrorOf>
<name>Nexus aliyunname>
<url>http://maven.aliyun.com/nexus/content/groups/publicurl>
mirror>
找到
标签,在最下面配置上maven编译环境、jdk环境等配置
<profile>
<id>jdk-devid>
<activation>
<activeByDefault>trueactiveByDefault>
<jdk>20.0jdk>
activation>
<properties>
<maven.compiler.source>20.0maven.compiler.source>
<maven.compiler.target>20.0maven.compiler.target>
<maven.compiler.compilerVersion>20.0maven.compiler.compilerVersion>
properties>
profile>
maven中的每一个jar包,都可以用坐标来定位到。坐标包含三个元素,groupid、artifactid、version。
例如:
com.arguigu.maven
pro01-atguigu-maven
1.0-SNAPSHOT
坐标:
<groupId>javax.servletgroupId>
<artifactId>servlet-apiartifactId>
<version>2.5version>
上面坐标对应的 jar 包在 Maven 本地仓库中的位置:
Maven本地仓库根目录\javax\servlet\servlet-api\2.5\servlet-api-2.5.jar
一定要学会根据坐标到本地仓库中找到对应的 jar 包。
执行命令:mvn archetype:generate
,接下来是这样的过程:
mirror
阿里云镜像仓库下载。archetype
的安装模式,系统默认是选择的模式7
,快速创建模式。groupid:com.atguigu.maven
artifactId:pro01-maven-java
,version
和package
默认,直接回车就行。默认生成的项目pom.xml
文件中,junit
版本是3.8.1
有点低,我们改成4.12
版本(4.x版本支持@test)。
<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.0modelVersion>
<groupId>com.atguigu.mavengroupId>
<artifactId>pro01-maven-javaartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>jarpackaging>
<name>pro01-maven-javaname>
<url>http://maven.apache.orgurl>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
properties>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
dependencies>
project>
自动生成的App.java
和AppTest.java
可以删除。
pom.xml是maven工程下的核心文件,学习pom.xml的配置对于maven的学习非常重要。
约定目录结构的意义
Maven 为了让构建过程能够尽可能自动化完成,所以必须约定目录结构的作用。例如:Maven 执行编译操作,必须先去 Java 源程序目录读取 Java 源代码,然后执行编译,最后把编译结果存放在 target 目录。
约定大于配置
Maven 对于目录结构这个问题,没有采用配置的方式,而是基于约定。这样会让我们在开发过程中非常方便。如果每次创建 Maven 工程后,还需要针对各个目录的位置进行详细的配置,那肯定非常麻烦。
目前开发领域的技术发展趋势就是:约定大于配置,配置大于编码。
//删除target目录
mvn clean
//主程序编译
mvn compile
//测试程序编译
mvn test-compile
//主体程序编译结果存放的目录:target/classes
//测试程序编译结果存放的目录:target/test-classes
//测试操作
mvn test
//测试的报告存放的目录:target/surefire-reports
//打包操作
mvn package
//打包的结果——jar 包,存放的目录:target
//打包操作
mvn build
Calculator
类,路径:\pro01-maven-java\src\main\java\com\atguigu\mavenpackage 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");
}
}
mvn test
,控制台会打印测试结果。上述代码使用assertEquals
断言,判断sum(5,3)
计算结构是否和8
一直,显然是正确的。calculator.sum(5, 3)
改成calculator.sum(5, 30)
,这时候显然是不正确,我们再看控制台打印的报错信息:target>suerfire-reports
,在这个目录下会保存测试类的测试结果。内容和test命令打印的一致。运行mvn package
命令,生成jar
包。
进入target
目录,我们可以看到刚刚打包生成的jar
包。
安装的效果是将本地构建过程中生成的 jar
包存入 Maven 本地仓库。这个 jar
包在 Maven 仓库中的路径是根据它的坐标生成的。
运行mvn clean install
命令,控制台打印:
红线标记的打印内容,说明了安装最终是生成了pom文件和jar包到本地仓库中。这时候我们根据坐标信息,到本地仓库中去寻找刚刚安装的jar
包,就可以找到内容。
我们看到,本地仓库中生成了两个坐标信息规则生成的*.pom
文件和*.jar
文件。*.pom
文件和maven项目中的pom.xml
的内容是一模一样。
mvn archetype:generate \
-DarchetypeGroupId=org.apache.maven.archetypes \
-DarchetypeArtifactId=maven-archetype-webapp \
-DarchetypeVersion=1.4 \
-DgroupId=com.atguigu.maven \
-DartifactId=pro02-maven-web \
<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.0modelVersion>
<groupId>com.atguigu.mavengroupId>
<artifactId>pro02-maven-webartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>warpackaging>
<name>pro02-maven-web Maven Webappname>
<url>http://www.example.comurl>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>1.7maven.compiler.source>
<maven.compiler.target>1.7maven.compiler.target>
properties>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.11version>
<scope>testscope>
dependency>
dependencies>
<build>
...
build>
project>
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");
}
}
<!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>
src\main\webapp\index.jsp
页面编写超链接
<html>
<body>
<h2>Hello World!h2>
<a href="helloServlet">Access Servleta>
body>
html>
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,配置如下:
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>4.0.1version>
<scope>providedscope>
dependency>
这时候,我们再进行编译:mvn clean compile
。
在执行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>
<plugins>
<plugin>
<artifactId>maven-compiler-pluginartifactId>
<version>3.11.0version>
<configuration>
<source>20source>
<target>20target>
configuration>
plugin>
plugins>
build>
参考阅读:
https://blog.csdn.net/sgsgkxkx/article/details/123415521
B站教学视频