maven工具使用介绍

简介

Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理

Maven 可以整合多个项目之间的引用关系,我们可以根据业务和分层需要任意拆分一个项目;
Maven 提供规范的管理各个常用 jar 包及其各个版本,并且可以自动下载和引入项目中;
Maven 可以根据指定版本自动解决 jar 包版本兼容问题;
Maven 可以把 jar 包所依赖的其它 jar 包自动下载并引入项目。

类似自动化构建工具还有:Ant, Maven, Gradle。

构建过程的几个主要环节

构建(build),是面向过程的(从开始到结尾的多个步骤),涉及到多个环节的协同工作。
①清理:删除以前的编译结果,为重新编译做好准备。
②编译:将Java源程序编译为字节码文件。
③测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
④报告:在每一次测试后以标准的格式记录和展示测试结果。
⑤打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应 jar 包,Web工程对应war包。
⑥安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中。
⑦部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行

安装 Maven 环境

  1. 确保安装了 java 环境:maven 本身就是 java 写的,所以要求必须安装 JDK。
    查看 java 环境变量:echo %JAVA_HOME%
  2. 下载并解压 maven 安装程序:
    http://maven.apache.org/download.cgi
  3. 配置 Maven 的环境变量:
    MAVEN_HOME=d:/apache-maven-3.3.9 或者 M2_HOME=d:/apache-maven-3.3.9
    path=%MAVEN_HOME%/bin; 或者%M2_HOME%/bin;
  4. 验证是否安装成功:
    mvn -v

Maven 核心概念

Maven能够实现自动化构建是和它的内部原理分不开的,这里我们从 Maven的九个核心概念入手,
看看Maven是如何实现自动化构建的
①POM
②约定的目录结构
③坐标
④依赖管理
⑤仓库管理
⑥生命周期
⑦插件和目标
⑧继承
⑨聚合

Maven 工程约定目录结构

maven 中约定的目录结构:

Hello
	|---src
	|---|---main
	|---|---|---java
	|---|---|---resources
	|---|---test
	|---|---|---java
	|---|---|---resources
	|---pom.xml

说明:Hello:根目录,也就是工程名
src:源代码
main:主程序
java:主程序的 java 源码
resources:主程序的配置文件
test:测试程序
java:测试程序的 java 源码
resources:测试程序的配置文件
pom.xml:Maven 工程的核心配置文件

一般情况下,我们习惯上采取的措施是:约定>配置>编码
maven 的 pom.xml 记录的关于构建项目的各个方面的设置,maven 从 pom.xml 文件开始,按照助约定的工程目录编译,测试,打包,部署,发布项目。
maven 提倡约定>配置>编码。
注意:使用maven指令时,目录结构缺一不可,像是test目录下的java、resources既是没有文件也要存在

pom.xml

pom.xml 文件中放的通常是项目GAV坐标、项目依赖、编译插件等信息

modelVersion 表示Maven 模型的版本,对于 Maven2 和 Maven3 来说,它只能是 4.0.
groupId 项目组id,常用公司域名倒写
artifactId 工程名id
version 工程版本号
packaging 项目打包的类型,可以使 jar、war、rar、ear、pom,默认是 jar

properties 配置属性,系统属性,例如 project.build.sourceEncoding(项目构建源码编码方式),可以设置为 UTF-8,防止中文乱码,也可定义相关构建版本号

dependencyManagement 依赖管理标签,是dependencies的父标签
dependencies 依赖存放的父标签
dependency 依赖的添加标签

build 构建相关配置,比如 build 下有 finalName,表示的就是最终构建之后的名称。常用的子标签有<plugins>配置插件信息,<resources>配置加载mapper.xml和配置文件等信息

parent 继承的父级工程、父级依赖使用这个标签,声明要继承的父工程的 pom 配置

modules maven聚合,用于聚合其他模块

distributionManagement指定 Maven 分发构件的位置。

仓库

仓库是存放东西的,Maven 仓库的是:

  1. Maven 的插件,插件也是一些 jar,这些 jar 可以完成一定的功能。
    2.我们自己开发项目的模块
    3.第三方框架或工具的 jar 包

仓库分为本地仓库和远程仓库。
本地仓库,存在于当前电脑上,默认存放在~.m2\repository中,为本机上所有的Maven工程服务。你也可以通过Maven的配置文件Maven_home/conf/settings.xml中修改本地仓库所在的目录。
在~/.m2/repository/settings.xml中的配置是用户级别的,在Maven_home/conf/settings.xml中的配置是全局级别的,在pom.xml中的配置是POM级别的。他们之间是有优先级的:POM>用户级别>全局级别。
~ 是用户的主目录,windows系统中是 c:/user/登录系统的用户名
远程仓库,分为为全世界范围内的开发人员提供服务的中央仓库。中央仓库是maven默认的远程仓库,其地址是:http://repo.maven.apache.org/maven2/
中央仓库,包含了绝大多数流行的开源Java构件,以及源码、作者信息、许可证信息等。一般来说,简单的Java项目依赖的构件都可以在这里下载得到。
私服是架设在局域网内的仓库服务。当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。我们还可以把一些无法从外部仓库下载到的构件上传到私服上。
当前主流的maven私服: Apache的Archiva、JFrog的Artifactory、Sonatype的Nexus。

分类说明:
1)本地仓库:本机当前电脑上的资源存储位置,为本机上所有 Maven工程提供服务
2)远程仓库:不在本机上, 通过网络才能使用。多电脑共享使用的。
①:中央仓库:通过Internet访问,为全世界所有 Maven工程服务。 最权威的。
②:中央仓库的镜像:架设在不同位置,欧洲,美洲,亚洲等每个洲都有若干的服务器,为中央仓库分担流量。减轻中央仓库的访问,下载的压力。所在洲的用户首先访问的是本洲的镜像服务器。
③:私服:在局域网环境中部署的服务器,为当前局域网范围内的所有 Maven工程服务。公司中常常使用这种方式。

阿里云仓库配置

打开maven配置文件,在maven安装目录的conf/settings.xml ,在<mirrors></mirrors> 标签中添加mirror子节点

<mirror>
	<id>aliyunmaven</id>
	<mirrorOf>*</mirrorOf>
	<name>阿里云公共仓库</name>
	<url>https://maven.aliyun.com/repository/public</url>
</mirror>

设置本地仓库

打开maven配置文件,在maven安装目录的conf/settings.xml ,在<localRepository> 标签中添加本地仓库路径

<localRepository>D:\maven-repository\repository</localRepository>

maven生命周期

构建项目时按照生命周期顺序构建,每一个阶段都有特定的插件来完成。不论现在要执行生命周期中的哪个阶段,都是从这个生命周期的最初阶段开始,执行到当前命令阶段

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 所在目录!

坐标GAV

坐标在仓库中可以唯一定位一个 Maven 项目。Maven 用一组(三个)向量组成的坐标来表示。

groupId:组织名,通常是公司或组织域名倒序+项目名
artifactId:模块名,通常是工程名
version:版本号

需要特别指出的是,项目在仓库中的位置是由坐标来决定的:groupId、artifactId 和 version 决定项目在仓库中的路径,artifactId 和 version 决定 jar 包的名称。

依赖

依赖就是开发时需要的jar文件,有maven通过提供的依赖GAV坐标负责到仓库中寻找,并自动加载到当前项目
pom.xml 加入依赖的方式:

<!-- log4j 日志依赖 -->
<dependency>
	<groupId>log4j</groupId>
	<artifactId>log4j</artifactId>
	<version>1.2.17</version>
</dependency>
<!-- junit 单元测试依赖 -->
<dependency>
	<groupId>junit</groupId>
	<artifactId>junit</artifactId>
	<version>4.11</version>
</dependency>

依赖范围

依赖的范围:compile、test、provided,默认采用 compile

compiletestprovided
对主程序是否有效
对测试程序是否有效
是否参与打包
是否参与部署

排除依赖

假设存在三个项目,分别是项目 A,项目 B 以及项目 C,假设 C 依赖于 B,B 依赖于 A,根据依赖的传递性我们知道项目 C 也依赖于 A。假如我们由于某种原因,在 C 中不想要 B 传递过来的依赖A,叫作依赖的排除
使用到的标签是<exclusions
例如:

<exclusions>
	<exclusion>
		<groupId>log4j</groupId>
		<artifactId>log4j</artifactId>
	</exclusion>
</exclusions>

Maven 的全局变量

在 Maven 的 pom.xml 文件中,用于定义全局变量,在 POM 中通过${property_name}的形式引用变量的值。
定义全局变量:

<properties>
	<spring.version>4.3.10.RELEASE</spring.version>
</properties>

引用全局变量:

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>${spring.version}</version>
</dependency>

Maven 系统采用的变量:

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<!--版本号不能比机器上安装的 jdk 版本更高,但可以更低-->
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>

Maven 常用

常用属性设置

<properties>
	<maven.compiler.source>1.8</maven.compiler.source> 源码编译 jdk 版本
	<maven.compiler.target>1.8</maven.compiler.target> 运行代码的 jdk 版本
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 项目构建使用的编码,避免中文乱码
	<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 生成报告的编码
</properties>

指定资源位置(重点)

src/main/java 和 src/test/java 这两个目录中的所有*.java 文件会分别在 comile 和 test-comiple 阶段被编译,编译结果分别放到了 target/classes 和 targe/test-classes 目录中,但是这两个目录中的其他文件都会被忽略掉,如果需要把 src 目录下的文件包放到 target/classes 目录,作为输出的 jar 一部分。需要指定资源文件位置。以下内容放到标签中。

<build>
	<resources>
		<resource>
			<directory>src/main/java</directory><!--所在的目录-->
			<includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
				<include>**/*.properties</include>
				<include>**/*.xml</include>
			</includes>
			<!--filtering 选项 false 不启用过滤器, *.property 已经起到过滤的作用了 -->
			<filtering>false</filtering>
		</resource>
	</resources>
</build>

maven管理多模块应用

maven管理多模块需要把握两个关键:依赖和继承
当多个模块使用同一个依赖时,可以将这个依赖单独放在一个模块中,这个模块只存放依赖,其他模块通过引用这个模块来实现自己所需依赖的导入。这个模块我们叫它父级依赖
在父级依赖,也可以添加公用的插件:如maven编译插件

管理方式一:各模块是同级关系

创建父工程

  1. 创建空的java项目,删除src
  2. pom.xml文件的<packaging>标签需要设置为pom

创建子工程

创建模块时指定父模块位置
在这里插入图片描述
Add as module to:选择将创建的模块添加哪个模块
Parent:选择模块的父工程
GroupId:选择父工程后,默认继承父工程的 GroupId 值
ArtifactId:模块的项目名称
Version:选择父工程后,默认继承父工程的 Version 值

创建完成后视图
在这里插入图片描述
pom.xml, parent 标签:指向父工程 ;relativePath 标签:相对路径
在这里插入图片描述
查看编译级别
File -> Settings -> Build, Execution, Deployment -> Compiler -> Java Compiler
在这里插入图片描述
设置编译级别

<!-- 编译插件 -->
<plugin>
	<artifactId>maven-compiler-plugin</artifactId>
	<!-- 插件的版本 -->
	<version>3.5.1</version>
	<!-- 编译级别 -->
	<configuration>
		<source>1.8</source>
		<target>1.8</target>
		<!-- 编码格式 -->
		<encoding>UTF-8</encoding>
	</configuration>
</plugin>

管理方式二:父模块是子模块上级文件

父级依赖创建方式不变,子工程需要选择Add as module to 父级工程
在这里插入图片描述
Add as module to:选择将创建的模块添加哪个模块
Parent:选择模块的父工程

设置模块存放位置时需要放在父级工程下
在这里插入图片描述
项目结构
在这里插入图片描述
依赖的添加方式不变

父级依赖管理

使用<dependencyManagement>标签对依赖进行管理
不管理时,子工程会继承父级依赖的所有依赖,不管是对自己有用的还是没用的。进行管理后,不会继承全部的父级依赖,根据自己指定的依赖从父级依赖中获取
使用<properties> 标签对依赖的版本号进行管理

<properties>
	<!-- 这里也可以使用“.”来代替标签中的“-” -->
	<mysql-connector-java-version>5.1.43</mysql-connector-java-version>
</properties>
<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql-connector-java-version}</version>
	</dependencies>
</dependencyManagement>

子模块添加依赖不需要添加版本号
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值