Maven 入门教程

news/2024/11/25 21:59:37/

Maven是专门为Java项目打造的项目管理和构建工具,类似 NodeJS 的 NPM,PHP 的 composer。

官网:https://maven.apache.org/

它的主要功能有:

  • 提供了一套标准化的项目结构;
  • 提供了一套标准化的构建流程(编译,测试,打包,发布……);
  • 提供了一套依赖管理机制。

安装配置

MasOS

1、下载 apache-maven-x.x.x-bin.tar.gz 压缩包

  • 下载地址:https://maven.apache.org/download.cgi

2、解压到自定义目录,如:/usr/local

3、配置环境变量

# 或者 ~/.bash_profile,根据自己使用终端决定
$ vim ~/.zshrc# 添加环境变量(根据自己的目录进行修改)
export M2_HOME=/usr/local/apache-maven-3.9.1
export PATH=${PATH}:${M2_HOME}/bin# 生效
$ source ~/.zshrc

4、查看是否安装成功

$ mvn -vApache Maven 3.9.1 (2e178502fcdbffc201671fb2537d0cb4b4cc58f8)
Maven home: /usr/local/apache-maven-3.9.1
Java version: 19.0.1, vendor: Oracle Corporation, runtime: /Library/Java/JavaVirtualMachines/jdk-19.jdk/Contents/Home
Default locale: zh_CN_#Hans, platform encoding: UTF-8
OS name: "mac os x", version: "13.3", arch: "aarch64", family: "mac"

目录结构

一个使用Maven管理的普通的Java项目,它的目录结构默认如下:

./maven-project
├── pom.xml				// 项目描述文件
├── src
│   ├── main
│   │   ├── java		// 存放Java源码
│   │   └── resources	// 存放资源文件
│   └── test			// 单元测试
│       ├── java		// 单测源码
│       └── resources	// 单测资源
└── target

pom.xml

<project ...><modelVersion>4.0.0</modelVersion><groupId>com.yiqiesuifeng.blog</groupId><artifactId>hello</artifactId><version>1.0</version><packaging>jar</packaging><properties>...</properties><dependencies><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency></dependencies>
</project>
  • groupId:类似于Java的包名,通常是公司或组织名称
  • artifactId:类似于Java的类名,通常是项目名称
  • version:项目版本号

一个Maven工程就是由groupIdartifactIdversion作为唯一标识。我们在引用其他第三方库的时候,也是通过这3个变量确定。例如,依赖commons-logging

<dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version>
</dependency>

使用<dependency>声明一个依赖后,Maven就会自动下载这个依赖包并把它放到classpath中。

依赖管理

Maven定义了几种依赖关系:

  • compile:编译时需要用到该jar包(默认)
  • test:编译Test时需要用到该jar包
  • runtime:编译时不需要,但运行时需要用到
  • provided:编译时需要用到,但运行时由JDK或某个服务器提供

使用示例:

<dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.3.2</version><scope>test</scope>
</dependency>

镜像管理

切换镜像

用户主目录下进入.m2目录,创建一个settings.xml配置文件,内容如下:

<settings><mirrors><mirror><id>aliyun</id><name>aliyun</name><mirrorOf>central</mirrorOf><!-- 阿里云的Maven镜像 --><url>https://maven.aliyun.com/repository/central</url></mirror></mirrors>
</settings>

构建流程

Maven不但有标准化的项目结构,而且还有一套标准化的构建流程,可以自动化实现编译,打包,发布,等等。

  • lifecycle相当于Java的package,它包含一个或多个phase;
  • phase相当于Java的class,它包含一个或多个goal;
  • goal相当于class的method,它其实才是真正干活的。

Lifecycle和Phase

Maven的生命周期(lifecycle)由一系列阶段(phase)构成

使用mvn这个命令时,后面的参数是phase,Maven自动根据生命周期运行到指定的phase。

常用命令:

  • mvn clean:清理所有生成的class和jar
  • mvn clean compile:先清理,再执行到compile
  • mvn clean test:先清理,再执行到test,因为执行test前必须执行compile,所以这里不必指定compile
  • mvn clean package:先清理,再执行到package
生命周期default

它包含以下phase:

  • validate
  • initialize
  • generate-sources
  • process-sources
  • generate-resources
  • process-resources
  • compile
  • process-classes
  • generate-test-sources
  • process-test-sources
  • generate-test-resources
  • process-test-resources
  • test-compile
  • process-test-classes
  • test
  • prepare-package
  • package
  • pre-integration-test
  • integration-test
  • post-integration-test
  • verify
  • install
  • deploy

运行mvn package,Maven就会执行default生命周期,它会从开始一直运行到package这个phase为止:

  • validate
  • package

运行mvn compile,Maven也会执行default生命周期,但这次它只会运行到compile,即以下几个phase:

  • validate
  • compile
生命周期clean

它会执行3个phase:

  • pre-clean
  • clean (注意这个clean不是lifecycle而是phase)
  • post-clean

Goal

执行一个phase又会触发一个或多个goal

  • compile:compiler:compile
  • test:
    • compiler:testCompile
    • surefire:test

goal的命名总是abc:xyz这种形式

模块管理

一个Maven大项目:

single-project
├── pom.xml
└── src

拆分成3个模块:

mutiple-project
├── pom.xml
├── parent
│   └── pom.xml		// 父级公共配置
├── module-a
│   ├── pom.xml
│   └── src
├── module-b
│   ├── pom.xml
│   └── src
└── module-c├── pom.xml└── src

每个模块下面都有独立的 pom 配置,可以抽取pom公共配置作为父级配置,模块下面的pom配置基础父级配置

根目录下的 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/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.practice.xxx</groupId><artifactId>build</artifactId><version>1.0</version><packaging>pom</packaging><name>build</name><modules><module>parent</module><module>module-a</module><module>module-b</module><module>module-c</module></modules>
</project>

父级 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/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.practice.xxx</groupId><artifactId>parent</artifactId><version>1.0</version><packaging>pom</packaging><name>parent</name><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><java.version>11</java.version></properties><dependencies><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.28</version></dependency>...</dependencies>
</project>

注:parent的<packaging>pom而不是jar,因为parent本身不含任何Java代码

module-a 的 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/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.practice.xxx</groupId><artifactId>parent</artifactId><version>1.0</version><relativePath>../parent/pom.xml</relativePath></parent><artifactId>module-a</artifactId><packaging>jar</packaging><name>module-a</name>
</project>

http://www.ppmy.cn/news/75042.html

相关文章

AcWing 826. 单链表(C++)

目录 1.题目描述 2.AC 1.题目描述 826. 单链表 实现一个单链表&#xff0c;链表初始为空&#xff0c;支持三种操作&#xff1a; 向链表头插入一个数&#xff1b;删除第 kk 个插入的数后面的数&#xff1b;在第 kk 个插入的数后插入一个数。 现在要对该链表进行 MM 次操作…

2、Ray的基本概念和核心组件

2、Ray的基本概念和核心组件 导航 1.简介和背景 2.Ray的基本概念和核心组件 3.分布式任务调度和依赖管理 4.对象存储和数据共享 5.Actor模型和并发编程 6.Ray的高级功能和扩展性 7.使用Ray构建分布式应用程序的案例研究 8.Ray社区和资源 9.核心框架介绍 10.扩展1

04 面向对象(查漏补缺)

this的作用是什么&#xff1f;都有哪些用途&#xff1f; 表示初始化对象当前本身,内部存在地址,只有创建对象的时候才有this 1.调用成员变量,解决成员变量和局部变量的二义性 public Person(String name, int age) {this.name name; //[1] 这是给的创建的对象的字段,不是本…

电脑安装软件时,如何避免捆绑安装?

在网络上非正规网站下载安装软件时&#xff0c;经常会遇到捆绑安装的情况。你明明下载了一个软件&#xff0c;电脑上却多出好几个。那么我们在安装软件时&#xff0c;如何才能避免捆绑安装呢&#xff1f; 什么是捆绑安装&#xff1f; 捆绑安装是指用户安装一个软件时&#xff…

AC规则-2

基于RAM的远程接口 安全元件的访问规则可以通过远程应用程序管理 (RAM) 更新命令进行管理。 因此&#xff0c;ARA-M 和 ARA-C 各自提供一个远程接口&#xff0c;允许在 ARA 中存储或删除访问规则。 访问控制数据的任何远程管理都应仅通过 [GP 卡规范] 定义的安全通道协议来完成…

[VPX611]基于 6U VPX 总线架构的SATA3.0 高性能数据存储板

板卡概述 VPX611 是一款基于6UVPX 总线架构的高性能数据存储板&#xff0c;该板卡采用2 片XilinxKintex-7 系列FPGA 作为主控单元&#xff0c;FPGA 内嵌RAID 控制器&#xff0c;最大支持8 个mSATA 盘&#xff0c;最大存储容量可以达到8TByte&#xff0c;持续数据写入带宽可以达…

人工智能专栏第七讲——自然语言处理

自然语言处理(Natural Language Processing,NLP)是一种研究计算机如何处理和理解人类语言的学科。随着人工智能的发展,自然语言处理已经成为一个越来越重要的领域,涉及到自然语言理解、自然语言生成、语音识别、机器翻译等方面。 自然语言处理的主要挑战是语言的复杂性和…

Kuberntes云原生实战11 部署一个Deployment

大家好,从今天开始我们将正式部署实际应用。 上篇文章提到Kubenetes中有四大核心组件:Pod、Deployment、Service、ConfigMap,其中Pod是不会单独部署的,那接下来我会通过三篇文章带大家先熟悉如何部署这些基础组件,然后再通过真实项目进行部署。 今天我们先从部署Deploym…