一、Maven
Maven 是一个项目管理工具,它包含了一个项目对象模型 (POM:Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标 (goal)的逻辑。
1.Maven的优势
没有使用Maven的web项目,是需要将各种jar包添加到工程中,如果相同架构项目有很多个,就需要将jar包复制到十个不同的项目中,导致项目占用空间大。
如果使用maven,则不需要将jar包添加到工程,而是将jar包存在maven仓库,然后引入项目中,当有多个项目,则不需要复制多次jar包,节省磁盘空间。

2.核心功能
2.1依赖管理
依赖管理 :传统的web项目将jar包放在项目中,但是maven的项目将jar包放在maven仓库中,项目中只存放jar包的坐标( 存放在pom.xml 文件中),当项目编译运行的时候,就会根据pom.xml 文件的jar包坐标从maven仓库中找到对应的jar包。
问题:
- 通过读取 pom.xml 文件中的坐标,再到仓库中找到 jar 包,会不会很慢?
- 通过 pom.xml 文件配置要引入的 jar 包的坐标,再读取坐标并到仓库中加载 jar 包 。 为了解决这个过程中速度慢的问题,maven 中也有索引的概念,通 过建立索引,可以大大提高加载 jar 包的速度,使得我们认为 jar 包基本跟放在本地的工程文件中再 读取出来的速度是一样的。

2.2 项目的一键构建
本地安装tomcat构建项目:编译、测试、运行、打包、安装、部署。项目放在toncat的webapp目录下,然后在bin目录下启动tomcat才可以部署项目。
maven的一键构建 :不使用本地安装的tomcat,使用maven自带的tomcat一键构建,而是在 项目目录下,打开cmd窗口,输入命令:mvn tomcat:run 便可以完成项目部署,操作更简便。

3.maven的下载安装
官网下载:https://maven.apache.org/download.cgi

根据自己的JDK选择合适的maven。JDK8的版本推荐使用Maven3.6.3
下载地址:https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.zip
通过网盘分享的文件:apache-maven-3.6.3-bin.zip
链接: https://pan.baidu.com/s/19Mi2CW1wwN9MwFtZpRqvJw?pwd=4p5s 提取码: 4p5s
Maven 版本 最低 JDK 要求 推荐 JDK 版本 支持的最高 JDK 版本 特点说明
Maven 3.9.x JDK 8 JDK 11/17 JDK 21+ 最新稳定版,支持新特性
Maven 3.8.x JDK 7 JDK 8/11 JDK 20 企业常用稳定版
Maven 3.6.x JDK 7 JDK 8 JDK 11-13 非常稳定的版本
Maven 3.5.x JDK 6 JDK 7/8 JDK 9 较老但稳定
出现的问题:对于JDK8、maven3.8.8的组合,会出现IDEA与maven版本不兼容的情况,推荐修改maven为mavn3.6.3,会出现以下异常信息:
java.lang.RuntimeException: java.lang.RuntimeException: org.codehaus.plexus.component.repository.exception.ComponentLookupException: com.google.inject.ProvisionException: Unable to provision, see the following errors: 1) Error injecting constructor, java.lang.NoSuchMethodError: org.apache.maven.model.validation.DefaultModelValidator: method ()V not found
3.1maven目录
下载之后解压可得到如下目录
- bin:存放了 maven 的命令,比如我们前面用到的 mvn tomcat:run
- ** boot**:存放了一些 maven 本身的引导程序,如类加载器等
- ** conf**:存放了 maven 的一些配置文件,如 setting.xml 文件
- ** lib**:存放了 maven 本身运行所需的一些 jar 包

3.2maven环境配置
- 环境变量增加:MAVEN_HOME,同时在Path变量中添加MAVEN_HOME:%MAVEN_HOME%\bin
- Maven的正常使用需要有JAVA_HOME的配置,mvn.cmd的脚本文件中会获取JAVA_HOME
- maven检验是否成功:cmd打开窗口命令,输入:mvn -v,查看maven的版本和java的版本和os信息



3.3maven的settings.xml配置
2.3setting.xml文件的配置
在maven的conf目录下,可以进行setting.xml文件的修改进行配置。一般配置Maven的仓库地址(本地仓库)、远程仓库的地址。本地仓库用来存储jar包,一般不要放在C盘;远程仓库是当jar包在本地仓库没有的时候,去拉取远程仓库中的jar包。
该文件主要进行以下修改:
1、修改本地仓库地址(以实际为准)
xml
<!--1、修改本地仓库地址-->
<localRepository>E:\maven\mavenhost</localRepository>

2、修改远程仓库:在mirrors中添加以下内容(此处修改为阿里云公共仓库)
xml
<!--2、修改远程仓库:在mirrors中添加以下内容-->
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>

3、配置jdk,在profiles中配置
xml
<!--3、配置jdk,在profiles中配置-->
<profile>
<id>jdk-8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>8</jdk>
</activation>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<maven.compiler.compilerVersion>8</maven.compiler.compilerVersion>
</properties>
</profile>

4.maven仓库
- 本地仓库
- 用来存储从远程仓库或中央仓库下载的插件和 jar 包,项目使用一些插件或 jar 包, 优先从本地仓库查找
- 本地仓库默认的配置路径是:${user.home}/.m2/repository,可以通过:E:\maven\mavenhost 来修改本地仓库地址
- 当项目中使用的jar包在本地仓库没有,则会从私服或则中央仓库中寻找
- 远程仓库(私服)
- 公司内部不连接外网的时候(连接外网的时候也可以),会建立一个私服,存储使用的jar包
- 远程仓库的jar包可以来源于:中央仓库,或则本地仓库上传
- 中央仓库
- 包含非常全面的jar包
- 可以在settings.xml中的来配置

5.maven标准目录结构
一个项目分为四个部分:
- 核心代码部分:会打jar包
- 配置文件部分:不打在jar包,保证修改配置文件的时候不需重新部署项目
- 测试代码部分:单元测试文件
- 测试配置文件部分
maven项目的目录:
- java的目录放核心代码

6.maven命令
- clean:会删除target目录,清除项目编译信息
- compile:会编译核心代码 :
- src/main/java 目录--->>>classes,核心配置文件--->>>generated-sources
- test:编译核心代码、测试代码 ,** 执行 src/test/java 下的单元测试类 **
- java目录--->>>classes,核心配置文件--->>>generated-sources
- 测试java目录--->>>test-classes,测试配置文件--->>>generated-test-sources
- 执行 src/test/java 下的单元测试类
- package:编译核心代码、测试代码,web项目打包项目成war包 (pom文件配置),java项目打包成jar包
- java目录--->>>classes,核心配置文件--->>>generated-sources
- 测试java目录--->>>test-classes,测试配置文件--->>>generated-test-sources
- 打包war包 ,java项目打包成jar包,maven-helloworld-0.0.1-SNAPSHOT.war
- install:编译核心代码、测试代码,打包项目成war包 (pom文件配置)、安装项目到本地仓库
- java目录--->>>classes,核心配置文件--->>>generated-sources
- 测试java目录--->>>test-classes,测试配置文件--->>>generated-test-sources
- 打包war包,maven-helloworld-0.0.1-SNAPSHOT.war
- 将项目安装在本地仓库里
- deploy:项目发布,会执行前面的命令,需要一些配置
7.maven生命周期
- 清理生命周期: 在进行真正的构建之前进行一些清理工作。
- 默认生命周期: 构建的核心部分,编译,测试,打包,部署等等。
- 站点生命周期: 生成项目报告,站点,发布站点。

8.maven概念模型

(1)项目对象模型(Project Object Model)
项目对象模型就是项目的pom.xml文件,通过pom.xml文件定义:项目自身信息、依赖信息、运行环境信息(tomcat、jdk信息)
**(2) 依赖管理系统(Dependency Management System) **
通过 maven 的依赖管理对项目所依赖的 jar 包进行统一管理
xml
<dependency>
<!-- junit 的项目名称 -->
<groupId>junit</groupId>
<!-- junit 的模块名称 -->
<artifactId>junit</artifactId>
<!-- junit 版本 -->
<version>4.9</version>
<!-- 依赖范围:单元测试时使用 junit -->
<scope>test</scope>
</dependency>
9.Idea集成maven开发
(1)idea的maven配置
** File --->> Settings --->> 配置maven**

(2)Runner配置
设置Maven -->>Runner的VM Options 为:-DarchetypeCatalog=internal,(可以从本地资源获取骨架)这样做是为了当没有联网的情况 使用骨架 创建maven项目,可以获取到原先的骨架历史,因为骨架每次都会下载,不联网无法获取骨架。

(3)创建maven 的Web项目


- 指定资源包
- main/java:核心代码,可以通过右键- Mark Directory as设置包性质
- main/resources:配置文件
- main/webapp:web项目,可以创建jsp文件。需要在Project Structure设置Modules,选择Modules新建web,同时设置webapp目录和web.xml文件
- test/java:测试核心代码
- test/resources:测试配置文件
(4)出现的错误:
1.webapp目录下无法创建jsp文件
'
解决措施:



2.javax.servlet.ServletException: Class com.oneHeart.Servlets.HelloServlet is not a Servlet
type Exception report
message ++Class com.oneHeart.Servlets.HelloServlet is not a Servlet++
description ++The server encountered an internal error that prevented it from fulfilling this request.++
exception
javax.servlet.ServletException: Class com.oneHeart.Servlets.HelloServlet is not a Servlet
编译的时候不出错,运行项目的时候出现的错误,创建的Servlet被提示 不是Servlet。
原因:maven集成了tomcat,我们可以查看本地tomcat 的依赖包,发现包含:servlet-api、jsp-api
而我们在maven 的pom.xml文件中添加了相同名称 servlet-api、jsp-api 的jar包(创建Servlet的时候需要),
而在项目运行的时候,则会和maven集成的tomcat包相冲突。
而解决的办法就是: 我们需要将pom文件中,我们添加的 servlet-api、jsp-api 包只在编译之时生效,而不在运行的时候生效,避免发生jar包冲突。我们可以使用provided指定jar包作用范围为编译,只在编译时候生效。
xml
3.严重: Failed to initialize end point associated with ProtocolHandler ["http-bio-8080"]
java.net.BindException: Address already in use: JVM_Bind :8080
端口被占用异常,原因:之前启动了maven项目,未关闭。而后重新启动,就会出现端口被占用异常。
4.org.apache.jasper.JasperException: Unable to compile class for JSP:
An error occurred at line: 1 in the generated java file
The type java.io.ObjectInputStream cannot be resolved. It is indirectly referenced from required .class files

使用maven启动了Servlet之后,在浏览器访问对应的Servlet,Servlet可以正常访问,但是跳转页面会出现错误。
原因:maven集成的tomcat默认是tomcat6.0.29(如图所示),而java的jdk使用的是1.8,所以猜测这应该是tomcat与jdk版本不兼容引起的
解决措施:使用高版本的tomcat,在pom.xml文件中进行配置,配置好之后可以从Maven的Plugins执行tomcat7:run的命令。
xml
<build>
<plugings>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
</configuration>
</plugin>
</plugings>
</build>

5.配置模板Live Templates

10.pom文件
xml
<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
https://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- pom文件的版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 企业域名倒序 -->
<groupId>com.sofwin</groupId>
<!-- 项目名称 -->
<artifactId>test03</artifactId>
<!-- 版本 snapshot快照版,在项目每次启动时会自动检查更新 release:1.1 -->
<version>0.0.1-SNAPSHOT</version>
<!-- 名称 -->
<name>maven test</name>
<!-- 描述 -->
<description>maventest</description>
<!-- 打包格式 jar:java project的打包,.jar文件 war:web project打包,打包为.war文件,可以直接在应用服务器中执行
pom:父级项目的打包格式 -->
<packaging>war</packaging>
<!-- 定义常用的依赖的版本
可以使用:${spring-version}、${mybatis-version} 来获取对应的值
-->
<properties>
<spring-version>4.3.6.RELEASE</spring-version>
<mybatis-version>3.5.5</mybatis-version>
</properties>
<!-- 依赖管理 一般出现在父级项目中,他用来规范继承关系的项目中使用的依赖的版本信息, 如果父项目中dependencyManagement,子项目中是不需要指定版本信息的 -->
<!-- <dependencyManagement> dependencies如果定义在dependencyManagement中 规范父级别依赖
</dependencyManagement> -->
<dependencies>
<!-- dependency用于描述依赖的项目坐标 groupid:项目所属的组织机构 artifactid:项目id,将依赖中的每个jar称为一个项目
version:版本 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.7.RELEASE</version>
<!-- 用于指定依赖的生命周期的 compile:编译、测试、运行有效,默认使用compile provided:编译、测试有效,运行无效(servlet依赖)
test:编译,测试有效,运行无效(junit,spring-test) runtime:测试、运行有效 system:与本机的系统变量相关,一致性差(不建议使用),编译测试有效。
import:从其他 pom 文件导入时有效 -->
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
</dependencies>
<!-- 配置构建环境 -->
<build>
<!--
項目最終部署的名稱
-->
<finalName>baseProject</finalName>
<!-- 配置插件: 比如tomcat插件 -->
<plugins>
<!-- 配置JDK -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8.0_201</source>
<target>1.8.0_201</target>
</configuration>
</plugin>
<!-- tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<port>9991</port>
</configuration>
</plugin>
</plugins>
</build>
</project>

- 默认引入 的 jar 包 ------- compile 【默认范围 可以不写】(编译、测试、运行 都有效 )
- servlet-api 、jsp-api ------- provided (编译、测试 有效, 运行时无效 防止和 tomcat 下 jar 冲突)
- jdbc 驱动 jar 包 ---- runtime (测试、运行 有效 )
- junit ----- test (测试有效)
依赖范围由强到弱的顺序是:compile>provided>runtime>test



