Maven基本的知识点以及最常⽤的打包命令
⼀、 Maven简介
1.1 认识Maven
Maven 是⽬前最流⾏的⾃动化构建⼯具:
使⽤Maven管理的项⽬:
Maven 可以整合多个项⽬之间的引⽤关系,我们可以根据业务和分层需要任意拆分⼀个项⽬;
Maven 提供规范的管理各个常⽤ jar 包及其各个版本,并且可以⾃动下载和引⼊项⽬中;
Maven 可以根据指定版本⾃动解决 jar 包版本兼容问题;
Maven 可以把 jar 包所依赖的其它 jar 包⾃动下载并引⼊项⽬。
构建(build),是⾯向过程的(从开始到结尾的多个步骤),涉及到多个环节的协同⼯作。 构建过程的⼏个主要环节 :
①清理:删除以前的编译结果,为重新编译做好准备。
②编译:将Java源程序编译为字节码⽂件。
③测试:针对项⽬中的关键点进⾏测试,确保项⽬在迭代开发过程中关键点的正确性。
④报告:在每⼀次测试后以标准的格式记录和展⽰测试结果。
⑤打包:将⼀个包含诸多⽂件的⼯程封装为⼀个压缩⽂件⽤于安装或部署。Java ⼯程对应 jar 包,Web ⼯程对应war包。
⑥安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中。
⑦部署:将打包的结果部署到远程仓库或将war包部署到服务器上运⾏ 。
1.2 安装Maven环境
1. 需要从maven的官⽹下载Maven的安装包
2. 解压安装包,解压到⼀个⽬录,⾮中⽂⽬录
bin⽬录 :是执⾏程序的,主要是d
conf⽬录 :Maven⼯具本⾝的配置⽂件 l
3. 配置Maven的环境变量
要确保安装了Java环境,因为Maven本⾝就是Java写的,所以要求必须安装JDK,并配置其环境变量
在系统的环境变量中,指定⼀个M2_HOME的名称, 指定它的值是Maven⼯具安装⽬录,bin之前的⽬录
,M2_HOME=D:\work\maven_work\apache-maven-3.3.9, 再把M2_HOME加⼊到path之中,在所有路径之前加⼊%M2_HOME%\bin;
4. 验证是否安装成功:mvn -v
⼆、Maven的核⼼概念
2.1 Maven ⼯程约定⽬录结构
maven项⽬的⽬录和⽂件的位置都是规定的
说明:Hello:根⽬录,也就是⼯程名
src:源代码
main:主程序
java:主程序的java源码
resources:主程序的配置⽂件
test:测试程序
java:测试程序的java源码
resources:测试程序的配置⽂件
maven的l记录的关于构建项⽬的各个⽅⾯的设置,maven从l⽂件开始,按照助约定的⼯程⽬录编译,测试,打包,部署,发布项⽬。
2.2 POM⽂件
即Project Object Model项⽬对象模型。Maven把⼀个项⽬的结构和内容抽象成⼀个模型,在xml⽂件中进⾏声明,以⽅便进⾏构建和描述,l是Maven的灵魂。所以,maven环境搭建好之后,所有的学习和操作都是关于l的。
<!-- Maven 模型的版本,对于 Maven2 和 Maven3 来说,它只能是 4.0.0 -->
<modelVersion>4.0.0</modelVersion>
<!--
组织 id,⼀般是公司域名的倒写。格式可以为:
1. 域名倒写。例如 com.baidu
2. 域名倒写+项⽬名。例如 com.baidu.Hello
-->
<groupId>com.tang</groupId>
<!--项⽬名称,也是模块名称,对应 groupId 中项⽬中的⼦项⽬。-->
<artifactId>ch04-di-anno</artifactId>
<!--
项⽬的版本号。如果项⽬还在开发中,是不稳定版本,
通常在版本后带-SNAPSHOT version 使⽤三位数字标识,例如 1.1.0
-->
<version>1.1.0-SNAPSHOT</version>
<!--项⽬打包的类型,可以使 jar、war、rar、ear、pom,默认是 jar-->
<packaging>jar</packaging>
<!--
properties 是⽤来定义⼀些配置属性的,
例如 project.build.sourceEncoding(项⽬构建源码编码⽅式),可以设置为 UTF-8,防⽌中⽂乱码,
也可定义相关构建版本号,便于⽇后统⼀升级。
-->
<properties>
<!--Maven构建项⽬使⽤编码,避免中⽂乱码-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--编译代码使⽤的jdk版本-->
<mavenpiler.source>1.8</mavenpiler.source>
<mavenpiler.source>1.8</mavenpiler.source>
<!--运⾏程序使⽤的jdk版本-->
<mavenpiler.target>1.8</mavenpiler.target>
</properties>
<!--
Maven 的⼀个重要作⽤就是管理 jar 包,为了⼀个项⽬可以构建或运⾏,项⽬中不可避免的,会依赖很多其他的 jar 包,在 Maven 中,这些 jar 就被称为依赖,使⽤标签 dependency 来配置。
⽽这种依赖的配置正是通过坐标来定位的,由此我们也不难看出,maven 把所有的 jar 包也都视为项⽬存在了
-->
<dependencies>
<!-- 单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--Spring的依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
/dependencies>
<!--  build 表⽰与构建相关的配置,例如设置编译插件的 jdk 版本-->
<build>
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
</plugins>
</build>
<!--
继承:parent
在 Maven 中,如果多个模块都需要声明相同的配置,
例如:groupId、 version、有相同的依赖、或者相同的组件配置等,
也有类似 Java 的继承机制,⽤ parent 声明要继承的⽗⼯程的 pom 配置。
-->
<!--
聚合:modules
在 Maven 的多模块开发中,为了统⼀构建整个项⽬的所有模块,可以提供⼀个额外的模块,
该模块打包⽅式为 pom,并且在其中使⽤ modules 聚合的其它模块,
这样通过本模块就可以⼀键⾃动识别模块间的依赖关系来构建所有模块,叫 Maven 的聚合。
-->
2.3 仓库
在Maven中,任何⼀个依赖、插件或者项⽬构建的输出,都可以称之为构件。Maven 核⼼程序仅仅定义了⾃动化构建项⽬的⽣命周期,但具体的构建⼯作是由特定的构件完成的。⽽且为了提⾼构建 的效率和构件复⽤,maven把所有的构件统⼀存储在某⼀个位置,这个位置就叫做仓库。 仓库是存放东西的,Maven 仓库存的是:
Maven 的插件,插件也就是⼀些 jar,这些 jar 可以完成⼀定的功能。
我们⾃⼰开发项⽬的模块
第三⽅框架或⼯具的 jar 包
根据仓库存储的位置,把仓库分为本地仓库和远程仓库。
本地仓库:存在于当前电脑上,默认存放在~.m2\repository中,为本机上所有的Maven⼯程服务。你也可以 通过Maven的配置⽂件
Maven_home/l中修改本地仓库所在的⽬录。 ~ 是⽤户的主⽬录,windows系统中是 c:/user/登录系统的⽤户名 。
最后⼀⾏就是修改本地仓库的代码,我的是放在E盘下,注意不要有中⽂⽬录
远程仓库:不在本机上, 通过⽹络才能使⽤。多电脑共享使⽤的。
①:中央仓库:通过Internet访问,为全世界所有 Maven⼯程服务。 最权威的。
②:中央仓库的镜像:架设在不同位置,欧洲,美洲,亚洲等每个洲都有若⼲的服务器,为中央仓库分担流量。减轻中央仓库 的访问,下载的压⼒。所在洲的⽤户⾸先访问的是本洲的镜像服务器。
③:私服:在局域⽹环境中部署的服务器,为当前局域⽹范围内的所有 Maven⼯程服务。公司中常常使⽤这种⽅式。
在 Maven 构建项⽬的过程中如果需要某些插件,⾸先会到 Maven 的本地仓库中查,如果到则可以直接 使⽤;如果不到,它会⾃动连接外⽹,到远程中央仓库中查;如果远程仓库中能到,则先把所需要的插件 下载到本地仓库,然后再使⽤,并且下次再⽤到相同的插件也可以直接使⽤本地仓库的;如果没有外⽹或者远程 仓库中也不到,则构建失败。
2.4 ⽣命周期
对项⽬的构建是建⽴在⽣命周期模型上的,它明确定义项⽬⽣命周期各个阶段,并且对于每⼀个阶段提供相 对应的命令,对开发者⽽⾔仅仅需要掌握⼀⼩堆的命令就可以完成项⽬各个阶段的构建⼯作。
构建项⽬时按照⽣命周期顺序构建,每⼀个阶段都有特定的插件来完成。不论现在要执⾏⽣命周期中的哪个 阶段,都是从这个⽣命周期的最初阶段开始的。
对于我们程序员⽽⾔,⽆论我们要进⾏哪个阶段的构建,直接执⾏相应的命令即可,⽆需担⼼它前边阶段是否构建,Maven 都会⾃动构建。这也就是 Maven 这种⾃动化构建⼯具给我们带来的好处。
2.5 插件
maven的插件: maven命令执⾏时,真正完成功能的是插件,插件就是⼀些jar⽂件, ⼀些类。
2.6 坐标
Maven 把任何⼀个插件都作为仓库中的⼀个项⽬进⾏管理,⽤⼀组(三个)向量组成的坐标来表⽰。坐标在仓库 中可以唯⼀定位⼀个 Maven 项⽬。
groupId:组织名,通常是公司或组织域名倒序+项⽬名
artifactId:模块名,通常是⼯程名
version:版本号
maven打包本地jar包
需要特别指出的是:
项⽬在仓库中的位置是由坐标来决定的:
groupId、artifactId 和 version 决定项⽬在仓库中 的路径
artifactId 和 version 决定 jar 包的名称。
2.7 依赖
⼀个 Maven 项⽬正常运⾏需要其它项⽬的⽀持,Maven 会根据坐标⾃动到本地仓库中进⾏查。 对于程序员⾃⼰的 Maven 项⽬需要进⾏安装,才能保存到仓库中。
不⽤ maven 的时候所有的 jar 都不是你的,需要去各个地⽅下载拷贝,⽤了 maven 所有的 jar 包都是你的,想要谁,叫谁的名字就⾏。maven 帮你下载,也就是说如果本地仓库没有,Maven会⾃动帮我们下载。
三、依赖管理
依赖范围, 使⽤scope表⽰的。 scope的值有 compile, test, provided ,默认是compile
scope:表⽰依赖使⽤的范围,也就是在maven构建项⽬的那些阶段中起作⽤,也就是这些jar包在哪些阶段要⽤到。
maven构建项⽬ 编译, 测试 ,打包, 安装 ,部署 过程(阶段)
compile表⽰所有阶段都要⽤,test表⽰只在测试阶段要⽤,provided主程序和测试都要⽤,但是打包和部署就不需要了。
<!-- 单元测试依赖-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
⽐如这个单元测试的依赖,它的依赖范围是test,表明它只在测试阶段起作⽤,在别的阶段这个依赖就没有⽤了
provided 意思是提供者,表明⾃⼰已经提供了 jar 包,所以它不会参与到打包部署阶段
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
⽐如这个servlet依赖,当我们⽤到 jar 包⾥的类时,tomcat已经为我们提供了这些jar包,我们不需要准备。
我们也可以从打包的命令来看,当我们执⾏ mvn package命令后,如果这个依赖是provided,那么从打包的结果看它是不会带有这个jar 的,⽽如果是其他的scope,就需要maven为它提供jar了,所以会⼀起打包。
四、 Maven常⽤设置
maven常⽤操作:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。