- 安装maven
- 创建maven项目
- maven的生命周期
maven简介
程序员在工作中除了编码就是构建项目,每天都有很多的时间花费在编译,打包,单元测试,部署项目等构建项目上面,使用maven就是为了方便构建项目,只使用一条命令就能够让项目能够像流水线一样运行,节省了大部分的时间
什么是maven
Maven 是 Apache 软件基金会组织维护的一款自动化构建工具, 专注服务于 Java 平台的项目构建和依赖管理
Maven的用途之一是服务于构建,它是一个异常强大的构建工具,能够帮我们自动化构建过程,从清理、编译、测试到生成报告,再到打包和部署。我们不需要也不应该一遍又一遍地输入命令,一次又一次地点击鼠标,我们要做的是使用Maven配置好项目,然后输入简单的命令(如mvn clean install),Maven会帮我们处理那些烦琐的任务。
Maven是跨平台的,这意味着无论是在Windows上,还是在Linux或者Mac上,都可以使用同样的命令。
Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
POM (Project Object Model):项目对象模型
maven pom.xml
每一个项目看成一个对象 属性
pom jar 本地仓库-》私服--》中央
项目 jar
Maven的作用:
- 项目构建:提供标准的、跨平台的自动化项目构建方式
java 代码-》可以运行的应用程序
- 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突问题
-- 1. 3个项目 A lib
B lib
c lib
d:mavenrespo
-- 2. A-》b-》c a b c
A beans
- 统一开发结构:提供标准的、统一的项目结构
src
main
java -- java代码
resources -- 配置文件 .xml .properties
webapp -- web
test -- 单元测试
java -- 测试的java代码
resources -- 测试的时候使用的配置文件
什么是构建
构建并不是创建,创建一个工程并不等于构建一个项目。 要了解构建的含义我们应该由浅入深的从以下三个层面来看
①纯 Java 代码
大家都知道,我们 Java 是一门编译型语言, .java 扩展名的源文件需要编译成.class 扩展名的字节码文件才能够执行。 所以编写任何 Java 代码想要执行的话就必须经过编译得到对应的.class 文件。
②Web 工程
当我们需要通过浏览器访问 Java 程序时就必须将包含 Java 程序的 Web 工程编译的结果“拿”到服务器上的指定目录下,并启动服务器才行。 这个“拿”的过程我们叫部署。
我们可以将未编译的 Web 工程比喻为一只生的鸡,编译好的 Web 工程是一只煮熟的鸡, 编译部署的过程就是将鸡炖熟。
③实际项目
在实际项目中整合第三方框架, Web 工程中除了 Java 程序和 JSP 页面、 图片等静态资源之外,还包括第三方框架的 jar 包以及各种各样的配置文件。 所有这些资源都必须按照正确的目录结构部署到服务器上, 项目才可以运行。
所以综上所述: 构建就是以我们编写的 Java 代码、框架配置文件、 国际化等其他资源文件、 JSP 页面和图片等静态资源作为“原材料”, 去“生产”出一个可以运行的项目的过程。
那么项目构建的全过程中都包含哪些环节呢?
构建过程的几个主要环节
①清理:删除以前的编译结果,为重新编译做好准备。
②编译:将 Java 源程序编译为字节码文件。 .java->.class
③测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
④报告:在每一次测试后以标准的格式记录和展示测试结果。
⑤打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。 Java 工程对应 jar 包, Web工程对应 war 包。
⑥安装:在 Maven 环境下特指将打包的结果——jar 包或 war 包安装到本地仓库中。
⑦部署:将打包的结果部署到远程仓库或将 war 包部署到服务器上运行。
maven的核心概念
Maven 能够实现自动化构建是和它的内部原理分不开的, 这里我们从 Maven 的九个核心概念入手,看看 Maven 是如何实现自动化构建的
①POM
②约定的目录结构
③坐标
④依赖管理
⑤仓库管理
⑥生命周期
⑦插件和目标
⑧继承
⑨聚合
仓库
本地仓库:在当前电脑上,为电脑上所有 Maven 工程服务
远程仓库:需要联网
- 局域网:我们自己搭建的 Maven 私服。
- Internet
中央仓库:
镜像仓库:内容和中央仓库保持一致,但是能够分担中央仓库的负载,同时让用户能够就近访问提高下载速度,例如:aliyun
插件和目标
插件
Maven 的核心程序仅仅负责宏观调度,不做具体工作。具体工作都是由 Maven 插件完成的。例如:编译就是由 maven-compiler-plugin-3.1.jar 插件来执行的。
目标
一个插件可以对应多个目标,而每一个目标都和生命周期中的某一个环节对应。 (目标其实是插件的功能)
Default 生命周期中有 compile 和 test-compile 两个和编译相关的环节,这两个环节对应 compile 和 test-compile 两个目标,而这两个目标都是由 maven-compiler-plugin-3.1.jar 插件来执行的。
约定的目录结构
约定的目录结构对于 Maven 实现自动化构建而言是必不可少的一环, 就拿自动编译来说, Maven 必须能找到 Java 源文件, 下一步才能编译, 而编译之后也必须有一个准确的位置保持编译得到的字节码文件。我们在开发中如果需要让第三方工具或框架知道我们自己创建的资源在哪,那么基本上就是两种方式:
①通过配置的形式明确告诉它
②基于第三方工具或框架的约定
Maven 对工程目录结构的要求就属于后面的一种。
现在 JavaEE 开发领域普遍认同一个观点:约定>配置>编码。
而 Maven 正是因为指定了特定文件保存的目录才能够对我们的 Java 工程进行自动化构建。
POM
Project Object Model:项目对象模型。将 Java 工程的相关信息封装为对象作为便于操作和管理的模型。
坐标
Maven 的坐标
使用如下三个向量在 Maven 的仓库中唯一的确定一个 Maven 工程。
[1]groupid:公司或组织的域名倒序+当前项目名称
[2]artifactId:当前项目的模块名称
[3]version:当前模块的版本
packaging:定义该项目的打包方式
scope
依赖的jar包默认情况可以在任何地方使用,可以通过scope标签设定其作用范围
赖的范围有几个可选值, 我们用得到的是:compile、 test、 provided、runtime 四个。
compile | test | provided | runtime | |
主程序 | √ | × | √ | × |
测试程序 | √ | √ | √ | × |
参与部署 | √ | × | × | √ |
- 主程序范围有效(main文件夹范围内)
- 测试程序范围有效(test文件夹范围内)
- 是否参与打包(package文件夹范围内)
排除依赖
依赖的排除
如果我们在当前工程中引入了一个依赖是 A,而 A 又依赖了 B,那么 Maven 会自动将 A 依赖的 B 引入当前工程,但是个别情况下 B 有可能是一个不稳定版,或对当前工程有不良影响。 这时我们可以在引入 A 的时候将 B 排除。
<dependency>
<!-- https://mvnrepository.com/artifact/commons-beanutils/commons-beanutils -->
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
<scope>compile</scope>
<!-- 排除原来依赖的jar-->
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.0.01</version>
</exclusion>
</exclusions>
</dependency>
使用maven的好处是什么?
Maven 优势一:相同的项目结构
使用Maven管理的Java 项目都有着相同的项目结构
1. 有一个pom.xml 用于维护当前项目都用了那些jar包
2. 所有的java代码都放在 src/main/java
3. 所有的测试代码都放在src/test/java
Maven 优势二:统一维护jar包
maven的生命周期
- 每个生命周期的各个环节都是由各种插件完成!!!
- Maven有三个相互独立的生命周期(Maven的这三个生命周期不能看成一个整体)!!!
- Maven对项目构建的生命周期划分为3套
- clean:清理工作
- default:核心工作,例如编译、测试、打包、部署等
- site:产生报告,发布站点等
Clean生命周期(Clean Lifecycle)
Clean Lifecycle 在进行真正的构建之前进行一些清理工作。Clean生命周期一共包含了三个阶段:
- pre-clean 执行一些需要在clean之前完成的工作
- clean 移除所有上一次构建生成的文件
- post-clean 执行一些需要在clean之后立刻完成的工作
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 部署:将最终的项目包复制到远程仓库中与其他开发者和项目共享。
Site生命周期(Site Lifecycle)
Site Lifecycle 生成项目报告,站点,发布站点,站点的文档(站点信息,依赖..)。Site生命周期,生成站点信息四个阶段:
- pre-site 执行一些需要在生成站点文档之前完成的工作
- site 生成项目的站点文档
- post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy 将生成的站点文档部署到特定的服务器
插件和目标
<build>
<plugins>
<!-- 打源码的插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>xxx</version>
<executions>
<execution>
<goals>
<!-- 打一个jar -->
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
安装maven
先要下载 Maven
Maven – Download Apache Maven 或直接点开 Index of /dist/maven/maven-3/3.3.9/binaries下载)。
解压maven文件夹到指定目录:
如图:
bin Maven的运行脚本
boot Maven自己的类装载器
conf 该目录下包含了全局行为定制文件setting.xml
lib Maven运行时所需的类库
更改maven配置
指定Maven的本地仓库
配置的文件的地址在maven的安装目录下的conf文件夹里面的settings.xml文件里面
Maven本地仓库默认值:用户家目录/.m2/repository。
由于本地仓库的默认位置是在用户的家目录下,而家目录往往是在 C 盘,也就是系统盘。将来 Maven 仓库中 jar 包越来越多,仓库体积越来越大,可能会拖慢 C 盘运行速度,影响系统性能。所以建议将 Maven 的本地仓库放在其他盘符下。配置方式如下:
<localRepository>D:\maven-repository</localRepository>
注意:一定要把 localRepository 标签从注释中拿出来。
本地仓库本身需要使用一个非中文、没有空格的目录
配置阿里云提供的镜像仓库
Maven 下载 jar 包默认访问境外的中央仓库,而国外网站速度很慢。改成阿里云提供的镜像仓库,访问国内网站,可以让 Maven 下载 jar 包的时候速度更快。配置的方式是:
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf> <!-- 表示是中央仓库的镜像 -->
<name>aliyun maven</name> <!-- 仓库名 -->
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror> <!-- 仓库地址 -->
配置镜像(国内优秀的镜像网站):
<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的环境变量之前应该确认是否已经配置过JAVA_HOME
的环境变量
查看是否配置过java的环境变量的方法为:
Win+r—》cmd——》java
出现如图即为配置过java的环境变量且配置成功
配置M2_HOME/MAVEN_HOME
配置完M2_HOME需要配置path
%M2_HOME%=d:\soft\jkjkjkjk
%M2_HOME%\bin
如图:
配置完以后查看版本号 需要的命令:mvn -v或者mvn -version
出现如图即为安装成功
之后执行命令 mvn help:system会下载maven所需要的插件,第一次下载所需要的时间可能会长
出现build success即为下载成功
maven的坐标
使用maven坐标的时候常用的三个标签
<groupId>xx </groupId> (对应的是我们项目里面的包名)
<artifactId>xx</artifactId>(对应的是我们项目里面的类名)
<version>xx</version>(项目的版本号)
一个公司中有多个项目,每个项目中有多个工程
一个项目在实现的时候,会拆分出多个模块,每个模块是一个工程
maven网站
查找坐标的时候需要在一个指定的网站上进行查询
在搜索框里面输入你所需要的文件即可
然后选择你所需要的版本号
点击进去即可查看自己所需要的jar包的坐标
配置idea的maven
2021版
为了避免每次创建项目都需要配置maven就需要在other settings里面再进行一遍这样的配置
2020版本
使用idea创建maven项目
填写自己的项目的坐标
接下来就是无脑下一步(仅限idea2018版,其他的版本我没有试过是不是无脑下一步)
创建之后的页面显示如下:
java文件夹里面主要是存放java代码的
resources里面存放的是配置文件
test文件夹里面存放的是测试代码
那么问题来了?web项目的话jsp存放到哪里呢?
聪明的你肯定没有优秀的我知道的多,且看下图
给项目添加web支持
设置自动导入
创建 Project 后,IDEA 会自动弹出下面提示,我们选择『Enable Auto-Import』,意思是启用自动导入。
这个自动导入一定要开启,因为 Project、Module 新创建或 pom.xml 每次修改时都应该让 IDEA 重新加载 Maven 信息。这对 Maven 目录结构认定、Java 源程序编译、依赖 jar 包的导入都有非常关键的影响。
另外也可以通过 IDEA 的 Settings 设置来开启:
创建springmvc项目
pom。xml文件如下:
<?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.aaa</groupId>
<artifactId>ssm</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.1</version>
</dependency>
<!--spring-web-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.1</version>
</dependency>
<!--spring-webMvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.1</version>
</dependency>
<!--事务-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.1</version>
</dependency>
<!--阿里云-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.3.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.9</version>
<scope>runtime</scope>
</dependency>
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
<!---->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<!--文件上传-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
</project>
执行 Maven 的构建命令
- mvn clean:清理编译的项目
效果:删除 target 目录
- 主程序编译:mvn compile 编译src中的内容
主体程序编译结果存放的目录:target/classes
测试程序编译结果存放的目录:target/test-classes
- mvn test:测试项目(运行测试类)
mvn test
测试的报告存放的目录:target/surefire-reports
进行测试操作,Maven会自动执行主程序和测试程序的编译操作
- mvn package:负责将我们的项目打包
mvn package
打包的结果——jar 包,存放的目录:target
进行打包操作,Maven会自动执行主程序和测试程序的编译操作,以及测试程序的允许
- mvn install:将这个项目安装到仓库中
安装的效果是将本地构建过程中生成的 jar 包存入 Maven 本地仓库。这个 jar 包在 Maven 仓库中的路径是根据它的坐标生成的。
总结:
1。文件上传 springmvc.xml 配置bean id=“” class=“” 阿里云 阿里云jar
2.redirect forward
3。安装maven
4.使用maven创建web项目
5.运行maven项目