Maven有什么用?
Maven的核心思想
我们要按照Maven设定的规则来使用maven,这样才能达到好效果。

标准的Maven项目结构包含了源代码、测试类、POM文件。
不管使用什么开发工具,只要它们使用了Maven,那么它们的基础项目结构都是统一的。在此基础之上,Maven为项目提供了各式各样的archetype模板,这些模板帮我们准备好了相应包含框架的基础项目结构。
一般来说,Java Web项目就使用webapp模板

需要注意的是,Maven的任务是帮助我们构建项目,也就是说我们开发Web项目时的结构尽管可能各不相同,但我们Web项目打包后的结构基本相同

开发习惯:我们开发用到的一些软件最好统一放到一个文件夹。
MAVEN_HOME是Maven 1.x使用,M2——HOME是Maven 2.x使用。
当然,有直接在path中配置bin的完整目录的做法。
至于环境变量的目录理论上可以取任何名字,但以上命名已经形成了约定,一些软件会默认按照约定俗称的环境变量名去操作,所以建议使用以上环境变量名。
提示:似乎官网并没有要求配置Maven环境变量。

~被称为home家目录(一般指Admintrastor)。另外,中央仓库访问较慢,所以我们要手动配置以下镜像仓库,以阿里云为例。
在config目录的settings.xml文件配置以下镜像。
作用:加速jar包下载速度
<mirror>
<!--指定id-->
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<!--它是哪个仓库的镜像-->
<mirrorOf>central</mirrorOf>
</mirror>
另外,本地仓库位置是自定义的,为了做到“把开发用的软件配置在同一目录”,我们要在settings.xml指定存放jar包的本地仓库,如下
<localRepository>D:\Environment\apache-maven-3.8.4\maven-repo</localRepository>
使用时,注意在idea中配置maven,也就是告诉idea你的maven在哪。
实际开发中,idea中的maven比命令行下的maven使用更简便。即使如此,有时我们甚至连idea中的maven命令也不使用, 而是 直接Build Project/Ctrl + F9
这里我们仍然有必要学习一下cmd下,maven的命令
mvn -versionmvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4 -DinteractiveMode=false
archetype:generate指的是使用模板原型创建maven
-DroupId=后面是组织id,一般为公司域名倒写 . 项目名
-DartifactId=后面为项目id
-DarchetypeArtifactId=生成项目的模板的id
-DarchetypeVersion=模板版本
DinteractiveMode=设置是否启用交互模式,启用后每执行一次就会询问yes/no。这里我们不启用。
mvn compile
编译后会生成target文件夹
mvn clean
甚至,可以清理后编译
mvn clean compile
清理后测试
mvn clean test
测试
mvn test
想要测试必须要编译好,所以,test实际包含了编译功能。
从target目录一定程度上可以体现打包后的状况。

target目录是编译后生成的。


项目打包后的jar包内没有web-inf文件夹,而war包则有。原因暂不清楚。
打包后war包是一个标准的web应用目录,将其放在Tomcat的webapps目录下,tomcat运行时会自动解压部署。
1.创建一个mavenweb项目

2. 

这里idea能自动识别maven的路径是因为设置过了环境变量
同时,从maven home path的下拉菜单可以看到idea也自带了maven

4.创建成功
5.查看maven的设置


6.到这里,Maven在IDEA中的配置和使用就ok了。

以下是使用maven的webapp模板创建的

当在创建普通的maven项目的文件夹后,如有需要可以自定义对文件夹进行标记。这样其实和通过模板创建的项目的文件夹是一个效果。

同样,也可以在以下页面标记文件夹

pom.xml 是Maven的核心配置文件
有时为了防止出错头文件版本一般和tomcat里面项目示例的版本一样。
<?xml version="1.0" encoding="UTF-8"?>
<!--Maven版本和头文件-->
<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>
<!--这里就是我们刚才配置的GAV-->
<groupId>com.kuangstudy</groupId>
<artifactId>javaweb-01-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<!--package:项目的打包方式
jar:java应用
war:javaweb应用-->
<packaging>war</packaging>
<!-- 这个name url其实删了没影响-->
<name>javaweb-01-maven 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>
<!--具体依赖的jar包配置文件-->
<!--maven的高级之处在于,他会帮你导入这个jar包所依赖的其他jar-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<!--项目构建用的东西-->
<build>
<finalName>javaweb-01-maven</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_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-war-plugin</artifactId>
<version>3.2.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>
</plugins>
</pluginManagement>
</build>
</project>
maven由于他的约定大于配置,我们之后可以能遇到我们写的配置文件,无法被导出或者生效的问题,
注:由上,我们创建maven时,一般并不通过模板创建。
解决方案:
<!--在build中配置resources,来防止我们资源导出失败的问题-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>

·IDEA中每次都要重复配置Maven
在IDEA中的全局默认配置中去配置,以下为idea2020.3版本


效果

会查找servlet所需的依赖jar包


scope是作用域的意思,但实际上scope可以删除。