简介
Maven 项目架构管理工具(构建工具)
我们目前用来就是方便导入 jar 包的!
为什么要学习它?
- 在 JavaWeb 中 ,需要使用大量的 jar 包,我们需要手动去导入。
- 如何能够让一个东西自动帮我导入和配置这个 jar 包。 由此,Maven 应运而生
Maven 的核心思想:约定大于配置!
什么是约定大于配置呢?
Maven 提供了一套科学的默认配置,它要求你遵循这些配置约定,然后它就会帮你处理日常的事务 compile, test, package等等。使用 Maven 的时候,你应该尽可能遵循它的配置约定,一方面可以简化配置,另一方面可建立起一种标准,减少交流学习成本。一旦你习 惯了这种约定,你得到的回报是巨大的。反之,恣意的做自定义,想要 Maven 听你的话,那么你觉得 Maven 不爽,Maven 也会认为你不爽。
简单来说,maven 默认会给你整个科学的配置,你觉得这个文件放在应该放的文件夹下不好看,放在了别的文件夹下,maven 是不会 鸟你的,不会给你导出的,这之后就要( build 标签,手动描述如何来编译及打包项目)
所以呢,
-
有约束,不要去违反
-
Maven 会规定好你改如何去编写我们的 java 代码(目录结构),必须按照这个规范来!
1 下载安装 Maven
- 下载完成后,解压即可:官网
- 在我们的系统环境变量中
配置环境变量:
1. M2_HOME maven 目录下的 bin 目录
2. MAVEN_HOME maven 的目录
3. 在系统的 path 中配置 %MAVEN_HOME%\bin
- 测试 Maven 是否安装成功。 cmd --> mvn -version (mvn bin目录小的可执行文件 )
2 阿里云镜像
- 镜像:mirrors
- 作用:加速我们的下载
- 国内建议使用阿里云的镜像
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
3 本地仓库
在本地的仓库,-----那肯定有远程仓库 ,就是*仓库。
建立一个本地仓库:localRepository
在 setting.xml 中设置一下
<localRepository>D:\ITSoft\maven\repository</localRepository>
Maven 的核心概念
① 约定的目录结构
maven 项目使用的大多数人遵循的目录结构。 叫做约定的目录结构。
一个 maven 项目是一个文件夹。 比如项目叫做 Hello
Hello 项目文件夹
\src
\main 叫做主程序目录(完成项目功能的代码和配置文件)
\java 源代码(包和相关的类定义)
\resources 配置文件
\test 放置测试程序代码的(开发人员自己写的测试代码)
\java 测试代码的(junit)
\resources 测试程序需要的配置文件
\pom.xml maven 的配置文件, 核心文件
maven 的使用方式:
1)maven 可以独立使用: 创建项目,编译代码,测试程序,打包,部署等等
2)maven 和 idea一起使用:通过idea借助maven,实现编码,测试,打包等等
② POM
POM: Project Object Model (项目对象模型), maven 把项目当做模型处理。 操作这个模型就是操作项目。
maven 通过 pom.xml 文件实现 项目的构建和依赖的管理。 是 maven 的核心配置文件。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 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">
<!-- pom模型的版本, 就是4.0.0 -->
<modelVersion>4.0.0</modelVersion>
<!-- 这里就是我们刚才配置的 GAV 坐标-->
<groupId>org.example</groupId>
<artifactId>javaweb02</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- package :项目打包的方式
jar:java 应用
war:javaweb应用-->
<packaging>war</packaging>
<!--就是一些名称,可以删,没啥用-->
<name>javaweb02 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.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!-- 项目依赖-->
<dependencies>
<!-- 具体的 jar 文件 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- maven的高级之处就在于,他会帮你导入 jar 包所依赖的其它 jar 包-->
</dependencies>
<!-- 项目构建用的东西-->
<build>
</build>
</project>
③ 坐标
坐标组成 :groupid, artifiactId, version。
作 用:确定资源的,是资源的唯一标识。 在 maven 中,每个资源都是坐标。 坐标值是唯一的。简称叫 gav
项目使用 gav:每个 maven 项目,都有一个自己的 gav, 当需要使用其他的 jar ,也要使用 gav 作为标识。
<groupId>com.kang</groupId>
<artifactId>maven-01</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
groupId: 组织名称,代码。 公司,团体或者单位的标识。 这个值常使用的公司域名的倒写。
例如:学校的网站 www.bjwl.com, groupId: com.bjwl
如果项目规模比较大, 也可以是 域名倒写+大项目名称。
例如: www.baidu.com , 无人车: com.baidu.appollo
artifactId:项目名称, 如果groupId中有项目, 此时当前的值就是子项目名。 项目名称是唯一的。
version:版本, 项目的版本号, 使用的数字。 三位组成。 例如 主版本号.次版本号.小版本号, 例如: 5.2.5。
注意:版本号中有-SNAPSHOT, 表示快照,不是稳定的版本。
packaging 项目打包的类型, 有jar ,war, ear, pom等等 默认是jar
④ 依赖管理
依赖:项目中要使用的其他资源(jar)。
格式:
<dependencies>
<!-- 日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.16</version>
</dependency>
</dependencies>
maven 使用 gav 作为标识,从互联网下载依赖的 jar。 下载到你的本机上。 由 maven 管理项目使用的这些 jar.
⑤ 仓库管理
仓库就是是存东西的,maven 的仓库存放的是:
- maven 工具自己的 jar 包。
- 第三方的其他 jar, 就是我们项目中,mysql,junit,mybatis 等
- 自己写的程序,可以打包为jar 。 存放到仓库。
仓库的分类:
-
本地仓库: 位于你自己的计算机, 它是磁盘中的某个目录。
本地仓库:默认路径,是你登录操作系统的账号的目录中/.m2/repository
C:\Users\NING MEI\.m2\repository
-
远程仓库: 需要通过联网访问的
-
私服:在局域网中使用的。 私服就是自己的仓库服务器, 在公司内部使用的。
maven 使用仓库: maven 自动使用仓库, 当项目启动后, 执行了maven 的命令, maven 首先访问的是本地仓库, 从仓库中获取所需的 jar, 如果本地仓库没有 ,需要去远程仓库找。
⑦ 插件和命令
插件:要完成构建项目的各个阶段,要使用 maven 的命令, 执行命令的功能是通过插件完成的。插件就是 jar,一些类。
命令: 执行 maven 功能是 由命令发出的。 比如 mvn compile
命令 | 作用 |
---|---|
mvn clean | 清理命令, 作用删除以前生成的数据, 删除 target 目录。 |
mvn compile | 编译命令,执行的代码编译, 把 src/main/java 目录中的 java 代码编译为 class 文件。同时把class文件拷贝到 target/classes目录。 这个目录classes是存放类文件的根目录(也叫做类路径,classpath) |
mvn test-compile | 编译命令, 编译 src/test/java 目录中的源文件, 把生成的 class 拷贝到 target/test-classes 目录。同时把 src/test/resources 目录中的文件拷贝到 test-clasess目录 |
mvn test | 测试命令, 作用执行 test-classes 目录的程序, 测试 src/main/java 目录中的主程序代码是否符合要求。 |
mvn package | 打包,作用是把项目中的资源 class 文件和配置文件都放到一个压缩文件中, 默认压缩文件是 jar 类型的。 web 应用是 war 类型, 扩展是 jar,war 的。 |
mvn install | 把生成的打包的文件 ,安装到 maven 仓库。 |
⑧ 继承
一个 maven 项目可以继承另一个 maven 的依赖, 称为子项目 父项目
多个子项目都需要某些依赖, 就可以把子项目共同的依赖抽取到父项目中, 子项目通过继承得到这些依赖, 这样也更好的来管理。
3 在 idea 中使用 Maven
- 启动 idea
- 创建一个 maven
next
next
Finish
观察 maven 出现了什么东西
- idea 中的 maven 设置
注意事项:idea 中的 maven 创建成功之后,看一眼 maven 的配置,
ok了!这就是一个 web 项目了
创建一个普通的 maven 项目
不点 使用 maven 模板
记得看一下 maven 配置
这个只有在 Web 应用下才会有!
在 idea 中标记文件夹功能
或者
两种方法都可以,在需要创建特殊目录的时候可以使用。
- maven 侧边栏的使用
- idea 中操作
生成目录树
常用设置
properties 里面的配置
<properties>
<maven.compiler.source>1.8</maven.compiler.source> 源码编译 jdk 版本
<maven.compiler.target>1.8</maven.compiler.target> 运行代码的 jdk 版本
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 项目
构建使用的编码,避免中文乱码
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 生成报告的编码
</properties>
全局变量
使用全局变量表示 多个依赖使用的版本号。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!--自定义变量-->
<spring.version>5.2.5.RELEASE</spring.version>
<junit.version>4.11</junit.version>
</properties>
<!--使用全局变量, 语法 ${变量名}-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
资源插件
处理的配置文件的信息, maven默认处理配置文件
① maven 会把 src/main/resources 目录中的文件, 拷贝到target/classes目录下
② maven 只处理 src/main/java 目录中的 .java文件,把这些 java 文件编译为 class,拷贝到 target/classes 目录,不处理其他文件。
<build>
<!--资源插件
告诉 maven 把 src/main/java 目录中的 指定扩展名的文件 拷贝到 target/classes目录中。
-->
<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>
常见问题
1. maven 资源导出问题
什么是资源导出问题?
在 Maven 项目中,资源配置文件默认是放在 resources 目录下的。但有时我们在编写项目时,配置文件可能会被我们放置的别的目录,Maven 由于它的约定大于配置,所以默认的 maven 项目在构建编译时不会把我们其他目录下的配置文件导出到 target 目录中,从而导致配置文件无法导出或者生效的问题。
maven 由于它的约定大于配置,我们之后可能遇到我们写的东西 ,无法被导出或者生效的问题。。
这个问题在 mybatis 第一个程序就遇见了,当我们把 UserMapper.xml 从 resource 目录下,移到 dao 目录下,maven 是约定大于配置的,所以它会报一个错,找不到 UserMapper.xml 。这个就是资源导出问题,
解决方法就是手动配置资源过滤。
解决方案:在项目的 pom.xml 文件中手动配置资源过滤,让它把 src/main/java 目录下的 .properties 和 .xml文件也能够被导出。
如下:
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
2. idea 每次都要重复配置
idea 中有个全局配置和项目配置,每次都要重复配置, 1 、你肯定是在项目中配置了。再次创建的时候当然不管用了,这个需要在全局配置一下。
maven 默认 web 项目中 web.xml 版本问题
解决: 替换为 webapp4.0 版本 和 Tomcat 一致。(可以再 Tomcat 中找:tomcat\apache-tomcat-9.0.56\webapps\ROOT\WEB-INF)
如下:web.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
<display-name>Welcome to Tomcat</display-name>
<description>
Welcome to Tomcat
</description>
</web-app>
3. Build 时会发生...
解决:
1.直接在设置里面改,File -> Project Structure...
project,Moudle 全部改为 8 , settings - > java compiler
改为 8
2.打开pop.xml
文件.修改编译器版本为 1.8 .然后刷新 Maven。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
4. project 标签报红线
使用 IDEA,pom.xml 中 project 报错说找不到本地 jar 包。大半是因为网络状态不好 jar 包未下载完全并自动解析成功
解决:
- 等一下
- 删掉未下好的,手动添加
5. maven 无法自动下载依赖
解决方案:
- 看配置了*仓库没
- 看网络是否通畅
- 换个版本试一试