文章目录:
1.Maven简介
说到Maven,它是一个项目管理工具,这不得去它的官网看看嘛?http://maven.apache.org/
1.1 Maven概述
Maven是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理。Maven 这个单词的本意是:专家,内行。读音是['meɪv(ə)n]或['mevn]。
Maven是目前最流行的自动化构建工具,对于生产环境下多框架、多模块整合开发有重要作用,Maven 是一款在大型项目开发过程中不可或缺的重要工具。
Maven可以整合多个项目之间的引用关系,我们可以根据业务和分层需要任意拆分一个项目;
Maven提供规范的管理各个常用 jar 包及其各个版本,并且可以自动下载和引入项目中;
Maven可以根据指定版本自动解决 jar 包版本兼容问题;
Maven可以把 jar 包所依赖的其它 jar 包自动下载并引入项目。
类似自动化构建工具还有:Ant, Maven, Gradle。
构建(build),是面向过程的(从开始到结尾的多个步骤),涉及到多个环节的协同工作。构建过程的几个主要环节
①清理:删除以前的编译结果,为重新编译做好准备。
②编译:将Java源程序编译为字节码文件。
③测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
④报告:在每一次测试后以标准的格式记录和展示测试结果。
⑤打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应 jar 包,Web工程对应war包。
⑥安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中。
⑦部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行 。
1.2 Maven核心概念的简述
Maven能够实现自动化构建是和它的内部原理分不开的,这里我们从 Maven的九个核心概念入手,看看Maven是如何实现自动化构建的:👇👇👇
①POM
②约定的目录结构
③坐标
④依赖管理
⑤仓库管理
⑥生命周期
⑦插件和目标
⑧继承
⑨聚合
1.3 Maven的安装
参考一下我的这篇文章:https://blog.csdn.net/weixin_43823808/article/details/113781584
2.Maven核心概念的详述
假设有一个Hello项目是使用Maven创建的,则它其中的目录结构为:👇👇👇
Hello
|--- src
|---|--- main
|---|---|--- java
|---|---|--- resources
|---|--- test
|---|---|--- java
|---|---|--- resources
|--- pom.xml· Hello:根目录,也就是项目名。
· src:源代码。
· main:主程序。
· main-java:主程序的Java源码。
· main-resources:主程序的配置文件。
· test:测试程序。
· test-java:测试程序的Java源码。
· test-resources:测试程序的配置文件。
· pom.xml:Maven项目的核心、核心、核心配置文件!!!
在src目录下,平级的有main和test,在test目录中的java和resources可以没有(如果不需要测试程序了话),只有main就可以了。
2.1.2 web项目
2.2 pom.xml(Maven核心配置文件)
即 Project Object Model 项目对象模型。Maven 把一个项目的结构和内容抽象成一个模型,在 xml 文件中进行声明,以方便进行构建和描述,pom.xml 是 Maven 的灵魂。所以,maven 环境搭建好之后,所有的学习和操作都是关于 pom.xml 的。
· modelVersion:Maven 模型的版本,对于 Maven2 和 Maven3 来说,它只能是 4.0.0。
· groupId:组织 id,一般是公司域名的倒写。格式可以为:域名倒写。例如 com.baidu;域名倒写+项目名。例如 com.baidu.appolo。
· artifactId:项目名称,也是模块名称,对应 groupId 中项目中的子项目。
· version:项目的版本号。如果项目还在开发中,是不稳定版本,通常在版本后带-SNAPSHOTversion使用三位数字标识,例如 1.1.0。(groupId、artifactId、version这三者结合生成了一个Maven 项目的基本坐标,在众多的maven 项目中可以唯一定位到某一个项目。坐标也决定着将来项目在仓库中的路径及名称。)
· packaging:项目打包的类型,可以使 jar、war、rar、ear、pom,默认是 jar。
· dependencies、dependency:Maven 的一个重要作用就是管理 jar 包,为了一个项目可以构建或运行,项目中不可避免的,会依赖很多其他的 jar 包,在 Maven 中,这些 jar 就被称为依赖,使用标签 dependency 来配置。而这种依赖的配置正是通过坐标来定位的,由此我们也不难看出,maven 把所有的 jar 包也都视为项目存在了。
· properties:properties 是用来定义一些配置属性的,例如project.build.sourceEncoding(项目构建源码编码方式),可以设置为UTF-8,防止中文乱码,也可定义相关构建版本号,便于日后统一升级。
· build:build 表示与构建相关的配置,例如设置编译插件的 jdk 版本。
· parent:在 Maven 中,如果多个模块都需要声明相同的配置,例如:groupId、version、有相同的依赖、或者相同的组件配置等,也有类似 Java 的继承机制,用 parent 声明要继承的父工程的 pom 配置。
· modules 在 Maven 的多模块开发中,为了统一构建整个项目的所有模块,可以提供一个额外的模块,该模块打包方式为 pom,并且在其中使用 modules 聚合的其它模块,这样通过本模块就可以一键自动识别模块间的依赖关系来构建所有模块,叫 Maven 的聚合。
以上的这些内容,大家可以对照下面这个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.songzihao</groupId> <artifactId>szh110-SSM-end</artifactId> <version>1.0</version> <packaging>war</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>14</maven.compiler.source> <maven.compiler.target>14</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.9</version> </dependency> </dependencies> <build> <resources> <resource> <directory>src/main/java</directory><!--所在的目录--> <includes><!--包括目录下的.properties,.xml 文件都会扫描到--> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build> </project>
<!-- 当前项目坐标 --> <!-- 组织名,通常是公司或组织域名倒序+项目名 --> <groupId>com.songzihao</groupId> <!-- 模块名,通常是工程名 --> <artifactId>ch01-first</artifactId> <!-- 版本号 --> <version>1.0</version>
项目在仓库中的位置是由坐标来决定的:groupId、artifactId 和 version 决定项目在仓库中的路径,artifactId 和 version 决定 jar 包的名称。
2.4 依赖(dependency)
<!-- mysql驱动依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.9</version> </dependency>
不用 maven 的时候所有的 jar 都不是你的,需要去各个地方下载拷贝,用了 maven 所有的 jar 包都是你的,想要谁,叫谁的名字就行,maven 帮你下载。
2.5 仓库
在Maven中,任何一个依赖、插件或者项目构建的输出,都可以称之为构件。Maven核心程序仅仅定义了自动化构建项目的生命周期,但具体的构建工作是由特定的构件完成的。而且为了提高构建的效率和构件复用,maven把所有的构件统一存储在某一个位置,这个位置就叫做仓库。
仓库是存放东西的,Maven 仓库的是:1. Maven 的插件,插件也是一些 jar,这些 jar 可以完成一定的功能。
2.我们自己开发项目的模块
3.第三方框架或工具的 jar 包仓库分类说明:
1)本地仓库:本机当前电脑上的资源存储位置,为本机上所有 Maven工程提供服务
2)远程仓库:不在本机上,通过网络才能使用。多电脑共享使用的。
①:中央仓库:通过Internet访问,为全世界所有 Maven工程服务。最权威的。
②:中央仓库的镜像:架设在不同位置,欧洲,美洲,亚洲等每个洲都有若干的服务器,为中央仓库分担流量。减轻中央仓库的访问,下载的压力。所在洲的用户首先访问的是本洲的镜像服务器。
③:私服:在局域网环境中部署的服务器,为当前局域网范围内的所有 Maven工程服务。公司中常常使用这种方式。在 Maven 构建项目的过程中如果需要某些插件,首先会到 Maven 的本地仓库中查找,如果找到则可以直接使用;如果找不到,它会自动连接外网,到远程中央仓库中查找;如果远程仓库中能找到,则先把所需要的插件下载到本地仓库,然后再使用,并且下次再用到相同的插件也可以直接使用本地仓库的;如果没有外网或者远程仓库中也找不到,则构建失败。
仓库资源的搜索地址:https://mvnrepository.com/(使用groupId 或者 artifactId作为搜索条件)
本地仓库默认存放的路径为:C:\Users\123\.m2\repository(里面存放的基本上都是 .jar 架包、各种配置文件)
我这里没有修改,直接就放在了C盘下面。当然也可以修改本地仓库的存放位置:
设置本机存放资源的目录位置(设置本机仓库):
1. 修改maven的配置文件, maven安装目录/conf/settings.xml。先备份 settings.xml2. 修改<localRepository> 指定你的目录(不要使用中文目录)
2.6 Maven的常用命令
Maven提供一个项目构建的模型,把编译、测试、打包、部署等都对应成一个个的生命周期阶段,并对每一个阶段提供相应的命令,程序员只需要掌握一小堆命令,就可以完成项目的构建过程。
· mvn clean:清理(会删除原来编译和测试的目录,即 target 目录,但是已经 install 到仓库里的包不会删除)
· mvn compile:编译主程序(会在当前目录下生成一个 target,里边存放编译主程序之后生成的字节码文件)
· mvn test-compile:编译测试程序(会在当前目录下生成一个 target,里边存放编译测试程序之后生成的字节码文件)
· mvn test:测试(会生成一个目录surefire-reports,保存测试结果)
· mvn package:打包主程序(会编译、编译测试、测试、并且按照 pom.xml 配置把主程序打包生成 jar 包或者 war 包)
· mvn install:安装主程序(会把本工程打包,并且按照本工程的坐标保存到本地仓库中)
· mvn deploy:部署主程序(会把本工程打包,按照本工程的坐标保存到本地库中,并且还会保存到私服仓库中。还会自动把项目部署到 web 容器中)。
注意:执行以上命令必须在命令行进入 pom.xml 所在目录!
2.7 Maven的生命周期
对项目的构建是建立在生命周期模型上的,它明确定义项目生命周期各个阶段,并且对于每一个阶段提供相对应的命令,对开发者而言仅仅需要掌握一小堆的命令就可以完成项目各个阶段的构建工作。
构建项目时按照生命周期顺序构建,每一个阶段都有特定的插件来完成。不论现在要执行生命周期中的哪个阶段,都是从这个生命周期的最初阶段开始的。
对于我们程序员而言,无论我们要进行哪个阶段的构建,直接执行相应的命令即可,无需担心它前边阶段是否构建,Maven 都会自动构建。这也就是 Maven 这种自动化构建工具给我们带来的好处。
3.IDEA中使用Maven
缺少了java或者resources,我们需要自行创建。创建之后的视图如下:👇👇👇
对main目录下的java和resources的文件类型进行修改。
如果是test目录下的java和resources,则对应的修改为 Test Sources Root和Test Resources Root即可。
当然也可以使用下面这种方式进行文件类型的修改:👇👇👇
3.2 导入Maven项目
4.Maven依赖管理
.... |
compile(默认) |
test |
provided |
对主程序是否有效 |
是 |
否 |
是 |
对测试程序是否有效 |
是 |
是 |
是 |
是否参与打包 |
是 |
否 |
否 |
是否参与部署 |
是 |
否 |
否 |
<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2.1-b03</version> <scope>provided</scope> </dependency>
5.Maven常用设置
对于一些依赖项,它们的版本号如果相同了话,比如SSM整合中需要用到spring中的一些依赖(spring-context、spring-tx、spring-jdbc、spring-webmvc),它们的版本号我这里用的都是5.2.5.RELEASE。那么如果那天突然要使用5.2.0.RELEASE的版本号,我只能一个一个的去修改每个依赖项的版本号,十分的麻烦!!!解决这个问题了话,可以采用下面这种方法:👇👇👇
在<properties>标签中声明一个<spring-version>的自定义标签,其中声明版本号5.2.5.RELEASE,然后在相关的依赖项中使用 ${自定义版本号的标签名} 就可以了。
在 Maven 的 pom.xml 文件中,<properties>用于定义全局变量,POM 中通过${property_name}的形式引用变量的值。
定义全局变量:
<properties> <!-- 项目构建使用的编码UTF-8,避免中文乱码问题 --> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <!-- 源码编译时的jdk版本 --> <maven.compiler.source>14</maven.compiler.source> <!-- 代码运行时的jdk版本 --> <maven.compiler.target>14</maven.compiler.target> <!-- spring的版本号 --> <spring-version>5.2.5.RELEASE</spring-version> </properties> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring-version}</version> </dependency> </dependencies>
src/main/java和 src/test/java 这两个目录中的所有*.java 文件会分别在 comile 和 test-comiple 阶段被编译,编译结果分别放到了 target/classes和 targe/test-classes 目录中,但是这两个目录中的其他文件都会被忽略掉,如果需要把 src 目录下的文件包放到 target/classes 目录,作为输出的 jar 一部分。需要指定资源文件位置。以下内容放到<buid>标签中。
<build> <resources> <resource> <directory>src/main/java</directory><!--所在的目录--> <includes><!--包括目录下的.properties,.xml 文件都会扫描到--> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>












