Maven详解(入门到精通)

重生之我在优快云学java 第五天(Maven)

一、Maven概念

1. 什么是Maven

Maven 是一个由Apache使用Java语言开发的跨平台的项目管理工具,主要用于Java项目的构建、依赖管理和项目管理。
项目构建
项目构建是项目源码到运行环境的一个处理过程,通常包括清理、代码编译、运行单元测试、生成API文档、打包、部署等任务。Maven抽象了一个完整的构建生命周期模型,并且为大部分的构建任务提供了实现的插件
依赖管理
Maven提供了一个坐标系统准确地定位每一个Java类库,而且可以自动地管理传递性
依赖关系。
项目管理
除项目构建和依赖管理外,Maven还提供了诸如项目发布、版本控制集成、项目文档
及报告生成、项目站点生成及发布等管理功能
其他构建方案
lDE:难以自动完成所有构建任务,而且每种IED的构建方式都不一致,项目分发不方便
ANT:需要手动配置构建任务及构建步骤,而且没有依赖管理
下载地址

2. 安装Maven

Maven环境需求
JDK:Maven 3.3+ 要求JDK 1.7 或者以上
操作系统:支持shell脚本或者bat脚本

Maven在Windows上的安装步骤

(1).确认环境变量JAVA_HOME是配置的,而且指向了正确的JDK安装路径

C:\Users\Administrator>echo %JAVA_HOME%
D:\Java\jdk1.8.0_172

(2). 解压Maven压缩包到安装路径
(3). 将Maven解压后的bin目录追加到环境变量path中
(4). 命令窗口运行 “mvn -v”,验证Maven安装

C:\Users\Administrator>mvn -v
Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T15:58:1
3+08:00)
Maven home: D:\maven\3.5.2\bin\..
Java version: 1.7.0_80, vendor: Oracle Corporation
Java home: D:\Java\jdk1.8.0_172\jre
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"

3. Maven目录结构

Maven的安装目录结构
boot目录:只包含一个jar文件,是Maven使用的类加载器框架
conf目录:配置文件目录,主要是settings.xml文件,该文件全局配置Maven的行为,可以将该文件复制到用户目录下的.m2目录下,在用户范围定制Maven的行为
lib目录:包含了所有Maven运行时需要的Java类库
bin目录:包含Maven运行脚本mvn和mvnDebug,两个脚本都支持Windows平台和Unix平台,
这些脚本用来配置Java命令,准备classpath和相关的Java系统属性,然后执行Java命令。后期运
行的所有Maven命令都是在调用这两个脚本。 mvn和mvnDebug基本一致, mvnDebug在运行时开启debug,便于调试Maven本身。
Maven的配置
MAVEN_OPTS:环境变量,配置Maven运行时JVM的内存,-Xms512m -Xmx512m
settings.xml:位于安装目录和用户目录下,全局或者用户范围内配置Maven的行为
用户目录:C:\Users\Administrator.m2
.mvn文件夹:位于项目根目录, 文件maven.config和extensions.xml包含用于运行Maven的项目
特定配置。

二、Maven体验

1. 项目目录结构

Maven提倡使用标准的目录结构,使开发人员能在熟悉了一个Maven项目后,对其他的Maven项目也
能清晰了解。这样做也省去了很多配置方面的麻烦。以下是基本的jar工程目录结构。
在这里插入图片描述
注意
每个Maven项目的根目录下都有文件pom.xml
项目的源码和资源文件被放在了src/main目录下面。在一个Java项目中,Java类放在
src/main/java下面,而资源文件放在src/main/resources下面。
项目的测试用例放在src/test下。在这个目录下面,src/test/java存放用JUnit或者TestNG这样的测试框架写的Java测试类。目录src/test/resources下存放测试用的资源文件。

工程目录结构可以手动创建,也可以使用以下命令进行创建maven插件生成目录结构

mvnarchetype:generate-DgroupId=com.mycompany -DartifactId=my-app-DarchetypeCatalog=internal -DinteractiveMode=false
archetypeCatalog:指定原型分类文件(archetype-catalog.xml)从哪里找:
nternal——maven-archetype-plugin内置的
local——本地,位置为用户目录下的.m2/archetype-catalog.xml remote——指向Maven中央仓库的Catalog
interactiveMode:是否以交互模式进行,

2. 项目对象模型

项目对象模型(POM)是Maven的基本工作单元,这是一个XML文件,是关于一个项目的声明性描述,其中包含有关于Maven用于构建项目的项目信息和详细配置信息。
SuperPOM是Maven的默认POM。除非明确设置,否则所有POM都会扩展Super POM,这意味着Super POM中指定的配置将由所有项目的POM继承。Super POM的定义位于lib目录下的maven-model-builder-3.5.2.jar文件中(org\apache\maven\model\pom-4.0.0.xml)

pom.xml

<projectxmlns="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.demo</groupId>
<artifactId>maven</artifactId>
<version>0.0.1-SNAPSHOT</version>
</project>

配置解析

modelVersion,指定了当前POM模型的版本,对于Maven3来说,它只能是4.0.0
groupId,artifactId, version 是Maven的坐标,它们唯一标识了一个组件。在Maven的世界,任何的组件都	是以这些基本的坐标来区分的。
groupId,定了项目属于哪个组织,一般使用组织的反向域名,如果是多模块项目,可以加入项目简写。
artifactId,定义了当前项目在组中的唯一ID
version,定义了项目当前的版本, -SNAPSHOT表示是非发布版

3. 打包及运行

打包

mvn package

命令解析
package:打包项目,在target目录下生成jar文件

运行

java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App

命令解析
基本的java命令,运行指定的main方法

三、核心概念

1. 坐标系统

什么是坐标

Maven坐标定义了一组标识,它们可以用来唯一标识一个项目,一个依赖,或者MavenPOM里的一个插件。
pom.xml

<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

配置解析

坐标可用于当前项目的唯一标识,也可用于依赖组件、插件的描述,主要通过groupId、artifactId、version来配置
坐标元素

groupId

定了项目属于哪个组织,它以创建这个项目的组织的逆向域名开头。

artifactId

表示在groupId下的一个单独项目的唯一标识符,通常使用项目的英文简写。

version

项目的特定版本。发布的项目有一个固定的版本标识来指向该项目的某一个特定的版本。
版本管理是指项目整体版本的演变过程管理,如从0.1到1.0,再到2.0。在开发过程中,一般使用快照版,		对外发布时采用发布版。Maven的版本号定义约定:
**快照版**:<主版本>. <次版本>. <增量版本>-SNAPSHOT
如: 0.0.1-SNAPSHOT
**发布版**:<主版本>. <次版本>. <增量版本>-<里程版本>
如: 3.0-alpha-4,3.0-alpha-5
主版本和次版本之间,以及次版本和增量版本之间用点分割,里程碑版本之前用连字符分割,各部分的
含义如下
**主版本:** 主版本一般来说代表了项目的重大的架构变更
**次版本:** 表示较大范围的功能增加和变化,及bug修改
**增量版本:** 一般是一些小的bug fix,不会有重大的功能变化,使用的不是太多
**里程碑版本**:
**alpha版:**内部测试版。α是希腊字母的第一个,表示最早的版本。
**beta版:**公开测试版。β是希腊字母的第二个,相对alpha版要稳定一些。
**rc 版:**release candidate(候选版本),该版本功能不再增加,和最终发布版功能一样。
**release版:** 最终版本,是最终发布的一个版本

packaging

项目的类型,默认是jar,描述了项目打包后的输出。类型为jar的项目产生一个jar文件,类型为war的项目	产生一个war文件。
项目的打包格式也是Maven坐标的重要组成部分,但是它不是项目唯一标识符的一个部分。

classifier

如果要发布同样的代码,但是由于技术原因需要生成两个单独的构件,就要使用一个分类(classifier)。
例如,如果想要构建两个单独的组件JAR,一个使用Java 1.4编译器,另一个使用Java 6	编译器,
就可以使用分类器来生成两个单独的JAR组件,它们有同样的groupId:artifactId:version组合。
分类器常用于打包组件的源码,JavaDoc或者二进制集合。分类器由附属插件实现,不能直接定义

2. 依赖管理

实际的项目中,项目的编译、测试、运行会依赖于大量的其它组件,传统的处理方式是不断的下载,然后拷贝,而通过Maven的依赖管理,我们不需要手动去下载对应的组件,只需要告诉Maven,我们需要什么组件。
依赖管理是Maven最强大的特征之一,支持传递性依赖、依赖范围、依赖调解、可选依赖等功能
pom.xml

<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany</groupId>
<artifactId>my-app</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

传递性依赖
项目A依赖于B,B又依赖于C。项目A只需要声明依赖于B,不需要声明依赖于C, Maven自动管理这种依赖的传递。optional和exclusion子元素可以管理传递性依赖。对于项目的直接依赖,应该明确的声明,如A依赖于B、C,B依赖C,这时应该在A中明确声明依赖于B和C,避免因升级 B导致A对于C的依赖出现问题

排除依赖

传递性依赖会给项目隐式地引入很多依赖,但是有些时候这种特性也会带来问题,比如该传递性依赖在中央仓库中不存在,这时候就应该排除掉该传递性依赖。

<artifactId>B</artifactId>
<dependency>
<artifactId>C</artifactId>
<exclusions>
<exclusion>
<groupId>com.demo</groupId>
<artifactId>model1</artifactId>
</exclusion>
</exclusions>
<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值