Maven快速应用入门
前言
Maven技术(和Gradle)都是项目管理工具,,在学Maven之前,先理解Maven是什么?
- jar包是什么
jar包就是别人给我们提供的Java类(jar包中也可以包含,Java源文件或者工具类中的API文档),MySQL的驱动包数据库厂商为我们提供实现JDBC面向接口编程的实现类,我们只是需要知道JDBC接口提供的方法,不需要管如何实现.还有,关于文件上传的时候,我们在是
commons-fileupload.jar
需要有commons-io.jar
的配合使用。
在之前的开发过程中,我们都是将
jar
包下载下来,放置到本地的磁盘当中进行处理,但是如果硬盘坏了,那么就需要自己再重新在下载jar包,并且有可能导致下载的jar包跟原来项目的不一致,会产生一系列的错误。而且,jar包需要下载,jar包需要维护版本,这两个方面都需要消耗我们的时间成本,影响效率。
- Maven是什么
进入maven的官方网站
http://maven.apache.org/
Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project’s build, reporting and documentation from a central piece of information.
Apache Maven 是一个软件项目管理和编译工具。基于项目对象模型 (POM) 的概念,Maven 可以从一条中央信息中管理项目的构建、报告和文档。
Maven是一个采用
纯Java
编写的开源项目(和Tomcat一样,也是由纯Java编写
),项目管理工具(使用Maven的前提需要有Java的环境,JAVA_HOME的配置),Maven是采用一种被称为POM(Project Object Model)项目对象模型(面向**项目(Java项目或者Web项目)**编程),管理就需要提供核心配置文件–>描述项目:pom.xml
一. Maven的安装
Maven的下载地址:解压的目录不要包含特殊字符和中文
(1) Maven解压目录的说明:
bin
:包含有maven的运行脚本指令(mvn.cmd
)boot
:类加载器框架(Maven是由Java开发)lib
:含有Maven运行时需要Java的jar包,需要配置Java的环境变量(JAVA_HOME
)conf
:重要,包含MAVEN工具的核心配置文件settings.xml
(2)配置Maven的环境变量
可以定义两种变量名称M2_HOME
(推荐,兼容老版本)和MAVEN_HOME
(Maven3)
测试是否成功:
C:\Users\Administrator>mvn -version
Apache Maven 3.8.1 (05c21c65bdfed0f71a2f2ada8b84da59348c4c5d)
Maven home: H:\apache-maven-3.8.1\bin\..
Java version: 13.0.2, vendor: Oracle Corporation, runtime: D:\java-tools\jdk-13.0.2
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
二. Intellij Idea 配置 Maven
新建一个空的项目,配置该项目可以使用Maven项目构建的本地工具。
(1)构建Java项目
注意:默认下载jar的本地仓库地址
C:\Users\你的计算机用户名\.m2\repository
- 通过修改
settings.xml
更改本地的仓库的位置
- 构建Maven项目时,GAV保证其jar唯一
- 中央仓库下载地址
构建Maven项目的时候,从中央仓库下载需要
jar
包,因为国外的网址,下载速度比较慢
在maven-model-builder-3.6.3.jar\org\apache\maven\model\pom-4.0.0.xml
中查看
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<layout>default</layout>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
设置阿里云镜像地址(已经将中央仓库的资源更新下来,我们访问的是国内的网址),通过修改
settings.xml
更改下载的地址
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
(2)项目目录
为什么Maven能帮我们构建项目,前提
约定优于配置
Maven是项目管理工具,在没有Maven之前我们所有的项目都是由程序员自由发挥,当我们入职到公司,项目是由公司规定,造成每一个人创建项目的目录结构是不统一,我们使用Maven之后对目录就进行的规划和约定。
- 目录说明:
src/main
:主程序目录,平时主要写项目代码的地方/java
:Java的源文件位置*.java
,也可以(*.xml
或者*.properties
)但是需要设置pom.xml
/resources
:放置的资源文件给主程序使用*.xml
或者*.properties
src/test
:项目测试代码/java
: Java的测试源文件/resources
:资源文件只能给测试目录使用
(3)仓库:保存的jar包
- 本地仓库:当我们需要使用jar包的时候,会优先去本地仓库操作,如果本地没有需要jar包,会从中央仓库下载到本地仓库,在给项目使用,下一次就不需要再下载了
- 中央仓库:提供所有jar包下载地址,我们使用中央仓库的镜像
- 私服服务器:公司不允许个人电脑进行联网,当我们的项目无法在本地仓库查找需要的jar的时候,公司建立一个一台可以访问中央仓库的电脑,通过该电脑访问中央仓库(中央仓库->私服服务器中->本地仓库)
(4)项目的核心配置文件pom.xml
- 三个必须设置的标签
GAV
<groupId>com.yue</groupId>
<artifactId>maven01</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>
标签
jar
:默认值,将项目打包成jar包war
:一般适用于WEB项目,将项目发布到webapps下,打包成*.war
pom
:Maven是面向项目的技术,项目之间可以存在继承
或者聚合
关系,通过设置pom
值来建立项目之间的关系
<dependencies>
标签
通过GAV的设置从网络中找到需要jar包,下载到本地仓库中,推荐的网址https://mvnrepository.com/
<dependencies>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
<properties>
标签
提取公共的信息,方便维护
<properties>
<fileupload-version>1.4</fileupload-version>
<maven.compiler.source>13</maven.compiler.source>//源码版本
<maven.compiler.target>13</maven.compiler.target>//编译版本
</properties>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${fileupload-version}</version>
</dependency>
<build>
标签:配置插件使用
<build>
<plugins>
</plugins>
</build>
三. Maven的构建项目生命周期
生命周期:需要掌握:JSP的生命周期 ,Servlet的生命周期 ,Maven的生命周期
软件开发基本都会经理如下过程:
(当我们项目被测试人员回馈bug报告)->1.清除->(修改bug,编写代码->)2.编译代码->编写测试用例->3.测试->4.报告->5.打包(jar,war)->6.安装->7.部署
Maven通过设置一些生命周期指令,帮我们自动完成上述过程
clean
:项目清理的处理,删除target目录下所有内容complie
:执行编译源代码,编译在此阶段完成,一般编译的是src/main/java和test/main/javaTest
:测试使用适当的单元测试框架(例如JUnit)运行测试。测试由complie编译出来的代码(自动完成前三步)package
:获取compil的文件(不包含test文件夹),打包创建JAR/WAR包,打包内容只是对src/main/java和src/main/resources进行处理install
:安装打包的项目到本地仓库,以供其他项目使用,通过GAV查找deploy
:部署拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程
四. Maven中的依赖
Maven管理的三套classpath:1.编译期间的classpath(简单理解为main里面的) 2.测试期间的classpath(简单理解为test里的) 3.运行期间的classpath(简单理解为target里的)
4.1依赖作用范围
标签中包含作用范围的子标签的取值范围介绍
compile
:默认就是compile,编译依赖范围,对所有classpath起作用test
:测试的依赖范围,只对测试classpath起作用runtime
:运行期间的依赖,对测试和运行classpath起作用procided
:提供依赖范围,对编译和测试起作用,对运行期间无效,经典使用引入Servlet的jar,因为我们Tomcat中已经包含Servlet API的jar,不需要将依赖的Servlet API的jar发布到项目中,造成版本重复或JAR冲突
4.2依赖传递
(1)直接依赖,间接依赖
c依赖b,b依赖a,a和b之间是直接依赖,a和c之间是间接依赖
<dependencies>
<dependency>
<groupId>com.bb</groupId>
<artifactId>maven02-B</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
通过GAV寻找并依赖
(2)依赖冲突
- 路径不同
路径最近者优先,maven02-C使用的myaql版本为5.1.49
- 路径相同
c依赖a,c依赖b,当路径相同时,谁先被引用使用谁(后者覆盖前者)
(3)排除依赖
当路径相同依赖冲突时,不想用先依赖的那个,这个时候就用到了依赖排除
<dependencies>
<dependency>
<groupId>com.bb</groupId>
<artifactId>maven02-B</artifactId>
<version>1.0-SNAPSHOT</version>
<!--排除依赖-->
<exclusions>
<exclusion>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.aa</groupId>
<artifactId>maven02-A</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
五. Maven的项目聚合与继承
5.1聚合
随着互联网的发展,一个大项目不再是一个单独的项目,而是由许多小项目构成,我们不应该对每个小项目单独处理,而应该使用简单统一处理方式
<packaging>pom</packaging>
<modules>
<module>../maven03-student</module>
<module>../maven03-teacher</module>
</modules>
在父项目中的pom.xml中用moudles标签把各个小项目聚合.对父项目操作就对所有小项目进行操作
5.2继承
一个 maven 项目可以继承另一个 maven 的依赖, 称为子项目 父项目
使用场景:
多个子项目都需要某些依赖, 就可以把子项目共同的依赖抽取到父项目中, 子项目通过继承得到这些依赖, 这样也更好的来管理(比如升级, 删除等)
使用步骤
(1) 父项目的打包方式修改为 pom
<groupId>com.ictpaas</groupId>
<artifactId>parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
(2)父项目使用 dependencyManagement
标签来管理, 表示子项目默认不继承, 可以配置继承, optional 表示子 pom 无论如何都不能继承
<dependencyManagement>
<dependencies>
<!-- 子 pom 可以继承 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<!-- 子 pom 不可以继承 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<optional>true</optional><!--子 pom 无论如何都不能继承-->
</dependency>
</dependencies>
</dependencyManagement>
(3)子项目配置父项目
<parent>
<!-- 父项目坐标 -->
<artifactId>parent</artifactId>
<groupId>com.ictpaas</groupId>
<version>1.0-SNAPSHOT</version>
<!-- 父项目 pom 文件路径-->
<relativePath>../parent/pom.xml</relativePath>
</parent>
(4) 子项目依赖配置
<dependencies>
<!-- 不需要版本, 会从父项目继承, 如果指定版本就是代表不是来自父 pom 而是子 pom 自己的. 父项目的 log4j 是不能继承的 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
</dependencies>
5) 子项目不仅仅继承依赖, url, name, modeVersion等也能继承, 换句话说子 pom 文件内容很少, 看起来很简洁, 下面贴出完整的父子 pom 文件
完整的父子 pom 文件:
父 pom:
<?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.ictpaas</groupId>
<artifactId>parent</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>parent 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>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<optional>true</optional>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>parent</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.0.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.7.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.0</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>
子 pom
<?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">
<parent>
<!-- 父项目坐标 -->
<artifactId>parent</artifactId>
<groupId>com.ictpaas</groupId>
<version>1.0-SNAPSHOT</version>
<!-- 父项目 pom 文件路径-->
<relativePath>../parent/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>child01</artifactId>
<dependencies>
<!-- 不需要版本, 会从父项目继承 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
</dependencies>
</project>
六. Maven的WEB项目
- pom文件
<?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.yue</groupId>
<artifactId>maven04-web</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>maven04-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>13</maven.compiler.source>
<maven.compiler.target>13</maven.compiler.target>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1-b06</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope><!--测试和编译期间起作用-->
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>maven04-web</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>
缺少啥jar包就去网站复制
- servlet文件
package com.yue.web;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "IndexServlet", value = "/index")
public class IndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(Math.random());
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
- jsp文件
<html>
<body>
<h2>Hello World!</h2>
${pageContext.request.contextPath}
<%=request%>
</body>
</html>