目录
一、maven
1 maven简介
Maven 翻译为"专家"、"内行",是 Apache 下的一个纯 Java 开发的开源项目。基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断(pom文件)能管理一个项目的构建、报告和文档等步骤。Maven 是一个项目管理工具,可以对 Java 项目进行构建(构建jar包或者war包的过程)、依赖管理(jar包的依赖关系,多模块的项目之间的依赖)。
项目的构建:在软件开发过程中最终要提交给客户成果物,j2ee一般提交的是jar或者war包。将软件代码编译打包成war包或者jar的过程叫作构建。
依赖管理:在软件开发过程中,大型项目由多个子项目协作完成,A项目依赖C项目,B项目也依赖C项目。Maven 也可被用于构建和管理各种项目,例如 C#,Ruby,Scala 和其他语言编写的项目。Maven 曾是 Jakarta 项目的子项目,现为由 Apache 软件基金会主持的独立 Apache 项目。
Maven是跨平台的,这意味着无论是在Windows上,还是在Linux或者Mac上,都可以使用同样的命令。
2 maven环境配置
2.1 安装配置环境变量
步骤一:Maven 下载地址:Maven – Download Apache Maven
步骤二:检查java环境
命令提示符(黑窗口)中输入java -version检查jdk版本
步骤三:解压缩maven的安装包
步骤四:配置maven的环境变量
MAVEN_HOME:配置到bin目录的前一项;
path :%MAVEN_HOME%\bin(新建)
步骤五:测试maven命令 mvn -v
步骤六:修改配置文件
①修改本地仓库地址:本地仓库的地址默认是在c盘,仓库中存储的东西会越来越多,所以最好是在非驱动盘创建仓库。
修改本地仓库的路径是:D:\develop-tools\idea_plugins\apache-maven-3.6.3-bin\apache-maven-3.6.3\conf\setting.xml
第55行:中间填写的就是本地仓库的路径
<localRepository>D:\develop-tools\idea_plugins_jar</localRepository>
②修改中央仓库的地址:
中央仓库指的是全球公用的,有部分公司涉及信息安全,普通程序员电脑无法上网。需要链接中央仓库,可以在本地设置私服。私服可以链接中央仓库。
创建本地仓库优点:
1.减少网络资源使用率,相当于缓存
2.有利于信息安全
修改中央仓库的路径是:D:\develop-tools\idea_plugins\apache-maven-3.6.3-bin\apache-maven-3.6.3\conf\setting.xml
第159行:就是配置了一个镜像网站,提高下载速度
随便选择一个镜像网站放置到mirrors标签里面
配置镜像(国内优秀的镜像网站):
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
<mirror>
<id>ibiblio</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://mirrors.ibiblio.org/pub/mirrors/maven2/</url>
</mirror>
<mirror>
<id>jboss-public-repository-group</id>
<mirrorOf>central</mirrorOf>
<name>JBoss Public Repository Group</name> <url>http://repository.jboss.org/nexus/content/groups/public</url>
</mirror>
<mirror>
<id>central</id>
<name>Maven Repository Switchboard</name>
<url>http://repo1.maven.org/maven2/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<mirror>
<id>repo2</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name for this Mirror.</name>
<url>http://repo2.maven.org/maven2/</url>
</mirror>
步骤七:下载maven所需要的插件, 第一次下载所需要的时间可能会长
命令提示符: mvn help:system
如果设置完本地仓库和镜像网站,那么会从镜像网站下载到本地仓库。
出现build success即为下载成功
3 创建maven项目(2021.3.2版本)
1)在idea的file工具栏中选中file中的new projects setup 下的setting for new projects
2)在build,execution,deployment-->build tools-->maven中
配置maven home path 和 user setting file 以及 local repository
3)创建maven工程
新建一个project,选中maven,勾选上create from archetype,选中选项中的maven-archetype-webapp。
4)填写项目名称,以及groupId
5)默认已选中的maven设置,点击完成即可
6)新建项目在main中添加directory,选中java和resource。
或者创建directory命名为java、resource,并右键通过Mark directory as将文件标记为java类型以及resource类型:
java文件夹里面主要是存放java代码的
resources里面存放的是配置文件
test文件夹里面存放的是测试代码
注:如果新建的项目中,没有webapp部分,点击file工具栏中的project structure选项,添加module选项,手动修改路径
7)修改web.xml版本号
<?xml version="1.0" encoding="UTF-8"?> <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"> </web-app>
8)添加tomcat配置
4 maven详解
4.1 什么是构建
构建并不是创建,创建一个工程并不等于构建一个项目。 要了解构建的含义我们应该由浅入深的从以下三个层面来看:
①纯 Java 代码
大家都知道,我们 Java 是一门编译型语言, .java 扩展名的源文件需要编译成.class 扩展名的字节码文件才能够执行。 所以编写任何 Java 代码想要执行的话就必须经过编译得到对应的.class 文件。
②Web 工程
当我们需要通过浏览器访问 Java 程序时就必须将包含 Java 程序的 Web 工程编译的结果“拿”到服务器上的指定目录下,并启动服务器才行。 这个“拿”的过程我们叫部署。
③实际项目
在实际项目中整合第三方框架, Web 工程中除了 Java 程序和 JSP 页面、 图片等静态资源之外,还包括第三方框架的 jar 包以及各种各样的配置文件。 所有这些资源都必须按照正确的目录结构部署到服务器上, 项目才可以运行。
所以综上所述: 构建就是以我们编写的 Java 代码、框架配置文件、 国际化等其他资源文件、 JSP 页面和图片等静态资源作为“原材料”, 去“生产”出一个可以运行的项目的过程。
4.2 构建的几个主要环节
①清理(clean):删除以前的编译结果,为重新编译做好准备。
②编译(compile):将 Java 源程序编译为字节码文件。
③测试(test):针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
④报告(verify):在每一次测试后以标准的格式记录和展示测试结果。
⑤打包(package):将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。 Java 工程对应 jar 包, Web工程对应 war 包。
⑥安装(install):在 Maven 环境下特指将打包的结果——jar 包或 war 包安装到本地仓库中。
⑦部署(deploy):将打包的结果部署到远程仓库或将 war 包部署到服务器上运行。
5 maven的核心概念
Maven 能够实现自动化构建是和它的内部原理分不开的, 这里我们从 Maven 的九个核心来了解 Maven 是如何实现自动化构建的
①POM
②约定的目录结构
③坐标
④依赖管理
⑤仓库管理
⑥生命周期
⑦插件和目标
⑧继承
⑨聚合
5.1 POM
POM( Project Object Model,项目对象模型 ) 是 Maven 工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。执行任务或目标时,Maven 会在当前目录中查找 POM。它读取 POM,获取所需的配置信息,然后执行目标。
POM 中可以指定以下配置:
· 项目依赖
· 插件
· 执行目标
· 项目构建 profile
· 项目版本
· 项目开发者列表
· 相关邮件列表信息
其中pom中一些节点的描述如下:
节点 | |
---|---|
project | 工程的根标签 |
modelVersion | 模型版本需要设置为4.0.0 |
groupId | 工程组的标识,它在一个组织或一个项目中是唯一的。 |
artifactId | 工程的标识,通常是工程的名称 |
version | 工程的版本号。在artifact的仓库中,它用来区分不同的版本。 |
实战案例:修改之前的传统web项目为maven项目
<?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.cloudwise</groupId>
<artifactId>myMaven</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 标识项目打包的形式是jar还是war,springboot默认就是jar-->
<packaging>war</packaging>
<name>myMaven 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>
<junit.version>4.9</junit.version>
</properties>
<!-- 引入的依赖jar包-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<!-- 只参与测试-->
<scope>test</scope>
</dependency>
<!-- fastjsonjar包 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
<scope>compile</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<!-- 运行的时候不用-->
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
<scope>compile</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
<!-- mysql的驱动载编译时不需要,只有在运行和测试的时候需要-->
<scope>runtime</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/jstl --> <dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.10</version>
</dependency>
<dependency>
<groupId>com.cloudwise.oracle</groupId>
<artifactId>ojdbc8</artifactId>
<version>2.1.1</version>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<finalName>myMaven</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>
5.2 约定的目录结构
约定的目录结构对于 Maven 实现自动化构建而言是必不可少的一环, 就拿自动编译来说, Maven 必须能找到 Java 源文件, 下一步才能编译, 而编译之后也必须有一个准确的位置保持编译得到的字节码文件。我们在开发中如果需要让第三方工具或框架知道我们自己创建的资源在哪,那么基本上就是两种方式:
①通过配置的形式明确告诉它
②基于第三方工具或框架的约定
Maven 对工程目录结构的要求就属于后面的一种。
现在 JavaEE 开发领域普遍认同一个观点:约定>配置>编码。
而 Maven 正是因为指定了特定文件保存的目录才能够对我们的 Java 工程进行自动化构建。
5.3 坐标(两个网站)
使用如下三个向量在 Maven 的仓库中唯一的确定一个 Maven 工程。
[1]groupid:公司或组织的域名倒序+当前项目名称
[2]artifactId:当前项目的模块名称
[3]version:当前模块的版本
获取坐标可以到中央仓库网站中进行快速获取
Maven Central Repository Search
获取后放置在pom.xml的依赖中
5.4 依赖管理及依赖排除
依赖的排除
如果我们在当前工程中引入了一个依赖是 A,而 A 又依赖了 B,那么 Maven 会自动将 A 依赖的 B 引入当前工程,但是如果 B 是一个不稳定版或对当前工程有不良影响,这时我们可以在引入 A 的时候将 B 排除。
具体操作如下:
<dependency>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
5.5 仓库管理
参考环境变量配置过程中的仓库管理。
5.6 生命周期
每个生命周期的各个环节都是由各种插件完成!!!
Maven有三个相互独立的生命周期(Maven的这三个生命周期不能看成一个整体)!!!
Maven 有以下三个标准的生命周期:
5.6.1 Clean生命周期(Clean Lifecycle)
Clean Lifecycle 在进行真正的构建之前进行一些清理工作。Clean生命周期一共包含了三个阶段:
-
pre-clean 执行一些需要在clean之前完成的工作
-
clean 移除所有上一次构建生成的文件
-
post-clean 执行一些需要在clean之后立刻完成的工作
5.6.2 Default生命周期(Default Lifecycle)
Default Lifecycle是构建的核心部分,编译,测试,打包,部署等等,Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。包括下面的 23 个阶段:
生命周期阶段 | 描述 |
---|---|
validate(校验) | 校验项目是否正确并且所有必要的信息可以完成项目的构建过程。 |
initialize(初始化) | 初始化构建状态,比如设置属性值。 |
generate-sources(生成源代码) | 生成包含在编译阶段中的任何源代码。 |
process-sources(处理源代码) | 处理源代码,比如说,过滤任意值。 |
generate-resources(生成资源文件) | 生成将会包含在项目包中的资源文件。 |
process-resources (处理资源文件) | 复制和处理资源到目标目录,为打包阶段最好准备。 |
compile(编译) | 编译项目的源代码。 |
process-classes(处理类文件) | 处理编译生成的文件,比如说对Java class文件做字节码改善优化。 |
generate-test-sources(生成测试源代码) | 生成包含在编译阶段中的任何测试源代码。 |
process-test-sources(处理测试源代码) | 处理测试源代码,比如说,过滤任意值。 |
generate-test-resources(生成测试资源文件) | 为测试创建资源文件。 |
process-test-resources(处理测试资源文件) | 复制和处理测试资源到目标目录。 |
test-compile(编译测试源码) | 编译测试源代码到测试目标目录. |
process-test-classes(处理测试类文件) | 处理测试源码编译生成的文件。 |
test(测试) | 使用合适的单元测试框架运行测试(Juint是其中之一)。 |
prepare-package(准备打包) | 在实际打包之前,执行任何的必要的操作为打包做准备。 |
package(打包) | 将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。 |
pre-integration-test(集成测试前) | 在执行集成测试前进行必要的动作。比如说,搭建需要的环境。 |
integration-test(集成测试) | 处理和部署项目到可以运行集成测试环境中。 |
post-integration-test(集成测试后) | 在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。 |
verify (验证) | 运行任意的检查来验证项目包有效且达到质量标准。 |
install(安装) | 安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。 |
deploy(部署) | 将最终的项目包复制到远程仓库中与其他开发者和项目共享。 |
5.6.3 Site生命周期(Site Lifecycle)
Site Lifecycle 生成项目报告,站点,发布站点,站点的文档(站点信息,依赖..)Site生命周期,生成站点信息四个阶段:
-
pre-site 执行一些需要在生成站点文档之前完成的工作
-
site 生成项目的站点文档
-
post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
-
site-deploy 将生成的站点文档部署到特定的服务器