Maven
- 概念图
- 生命周期
- 目录
- 工程创建
- 测试
- 常用命令
- COMPILATION ERROR : 不再支持目标选项 5。请使用 7 或更高版本。
- 问题解决
- pom.xml文件
- properties配置示例
- scope配置详解
概念图
- 依赖管理
- 构建项目
- Maven 的底层核心实现项目的构建和管理必须通过插件完成,但插件本身并不包含在其核心程序当中。
生命周期
在 Maven 中,它拥有三套标准的生命周期,分别为CleanLifeCycle、DefaultLifeCycle 和 SiteLifeCycle 。每一套生命周期互相独立、互不影响。另外,每套生命周期包含一系列的构建阶段,这些阶段是有顺序的,会按照顺序执行(即执行后面的阶段会先自动执行前面的阶段)。
- CleanLifeCycle:清理的生命周期
- DefaultLifeCycle:默认的生命周期
- SiteLifeCycle:站点的生命周期
目录
在 Maven 中,所有文件的存放目录都有明确的约定。标准目录结构如下:
目录名 | 含义 |
---|---|
项目根/ | 项目目录根 |
pom.xml | 项目对象模型(Project Object Model),Maven项目中的文件 |
src/ | 源代码目录根 |
main/ | 项目主体目录根 |
java | 源代码目录 |
resources | 所需资源目录 |
filters | 资源过滤文件目录 |
assembly | Assembly descriptors |
config | 配置文件目录根 |
test/ | 项目测试目录根 |
java | 测试代码目录 |
resources | 测试所需资源目录 |
filters | 测试资源过滤文件目录 |
site | 与site相关的资源目录 |
target/ | 输出目录根 |
classes | 项目主体输出目录 |
test-classes | 项目测试输出目录 |
site | 项目site输出目录 |
工程创建
创建的工程分为两类:一是Java项目,二是Web项目。创建命令如下:
<1>. Java项目:
mvn archetype:generate -DgroupId=JavaProjectPackage -DartifactId=JavaProjectName -DarchetypeArtifactId=maven-archetype-quickstart
<2>. Web项目:
mvn archetype:generate -DgroupId=WebProjectPackage -DartifactId=WebProjectName -DarchetypeArtifactId=maven-archetype-webapp
其中,属性含义:
-DgroupId:包名
-DartifactId: 项目名
-DarchetypeArtifactId: 项目类型
注: 一定要按照标准目录结构来构建工程。
测试
我们先使用命令行窗口在桌面上对 Maven 项目进行创建。步骤如下:
打开命令行窗口,进入桌面,输入命令:
//1.Java项目
mvn archetype:generate -DgroupId=cn.edu.MavenStudy -DartifactId=MavenJavaProjectTest -DarchetypeArtifactId=maven-archetype-quickstart
//2.Web项目
mvn archetype:generate -DgroupId=cn.edu.MavenStudy -DartifactId=MavenWebProjectTest -DarchetypeArtifactId=maven-archetype-webapp
若是第一次创建,需要耐心等待 Maven 下载相应资源到本地仓库上(repository 文件)。如图:
所需的资源,如图:
再创建Web项目,如图:
常用命令
命令 | 作用 |
---|---|
mvn compile | 编译,将源代码编译成字节码文件(.class) |
mvn clean | 清除,删除编译的目标文件target |
mvn test | 测试,运行test包下的单元测试类(其方法名约定为XxxxTest) |
mvn package | 将项目打包,文件存储在项目根目录的target目录中(Java项目打包成 jar文件,Web项目打包成 war文件) |
mvn install | 将一个工程打包成 jar文件,存储在本地仓库里 |
mvn deploy | 若有私服,打包后上传到私服 |
mvn source:jar | 源码打包 |
mvn dependency:sources | 下载 jar包的源代码 |
mvn site | 查看报告和操作流程 |
COMPILATION ERROR : 不再支持目标选项 5。请使用 7 或更高版本。
在使用命令过程中,遇到了错误,如图:
原因:JDK版本不匹配。
问题解决
首先,打开命令行窗口,输入命令:java -version ,查看版本信息。如图:
找到 Maven/apache-maven-3.8.6/conf 目录下的 settings.xml 文件进行修改配置:
//根据本机JDK版本,添加以下配置:
<profile>
<id>jdk-16.0.2</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>16</jdk>
</activation>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>16</maven.compiler.source>
<maven.compiler.target>16</maven.compiler.target>
<maven.compiler.compilerVersion>16</maven.compiler.compilerVersion>
</properties>
</profile>
如图:
再次使用命令,成功执行。如图:
pom.xml文件
pom.xml为当前Maven项目配置文件,定义项目的基本信息,用于描述项目的maven坐标,依赖关系等。
一般情况下,Maven是通过groupId、artifactId、version这三个元素值(俗称坐标)来检索该构件, 然后引入工程。若要引用项目(已开发完毕并发布到远程仓库),则在pom.xml文件中新建一个dependency节点,将本项目的groupId、artifactId、version写入, Maven便会把jar包下载到本地 。接下来,简单介绍pom.xml文件。
<?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">
<!-- 基本配置 -->
<!-- 声明pom文件遵循POM模型的某个版本(必不可少,且对于Maven2与Maven3只能是4.0.0)-->
<modelVersion>4.0.0</modelVersion>
<!-- 定义当前项目隶属的实际项目组 -->
<groupId>cn.edu.MavenProject</groupId>
<!-- 定义当前项目的名称,主要区分一个groupId的多个项目 -->
<artifactId>MavenJavaProject</artifactId>
<!-- 定义当前项目所处的版本号(SNAPSHOT:测试版本;RELEASE:发布版本)-->
<version>1.0.0-SNAPSHOT</version>
<!-- 定义打包的类型(默认为jar,jar:Java项目;war:Web项目;pom:父级项目 )-->
<packaging>jar</packaging>
<!-- 定义pom常量,便于在pom中的直接引用 -->
<properties>
<demo.version>4.11</demo.version>
</properties>
<!-- 定义构件输出的附属构件,有时需要加上classifier才能唯一的确定该构件,否则会报错查找不到 -->
<classifier>...</classifier>
<!-- 定义当前项目的依赖关系 -->
<dependencies>
<!-- 每个dependency对应着一个jar包 -->
<dependency>
<!-- 坐标信息 -->
<groupId>org.apache.commons</groupId> <!-- 组织名称 -->
<artifactId>commons-lang3</artifactId> <!-- jar包名称 -->
<version>3.8.1</version> <!-- 版本号 -->
<!-- 定义Jar包的使用范围 -->
<scope>test</scope>
<!-- 设置指依赖是否可选,默认为false -->
<optional>false</optional>
<!-- 屏蔽依赖关系 -->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<!-- 构建配置 -->
<build>
<!-- 构件的文件名,默认值为${artifactId}-${version} -->
<finalName>ProjectName</finalName>
<!-- 统一管理插件 -->
<pluginManagement>
<!-- 使用插件的列表 -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
<!-- 指定构建生命周期的阶段执行插件的配置 -->
<executions>
<execution>
<!-- 执行目标的标识符,用于标识构建过程中的目标或匹配继承过程中需要合并的执行目标 -->
<id>execution-id</id>
<!-- 指定目标的构建生命周期阶段,默认为目标被绑定到源数据里配置的阶段 -->
<phase>package</phase>
<!-- 配置的执行目标 -->
<goals>
<goal>demo-goal</goal>
</goals>
<!-- 配置是否被子POM继承 -->
<inherited>false</inherited>
</execution>
</executions>
<!-- 是否从该插件下载Maven扩展 -->
<extensions></extensions>
</plugin>
</plugins>
</pluginManagement>
</build>
<!-- 分发配置 -->
<!-- 执行mvn deploy,将项目生成的构件分发到远程Maven仓库,分发到远程Maven仓库之后,所有能访问该仓库的用户都能使用你的构件。 -->
<distributionManagement>
<!-- 项目生成的构件到远程仓库所需的信息 -->
<repository>
<!-- 是否设置唯一版本号(由时间戳和构建流水号组成) -->
<uniqueVersion>true</uniqueVersion>
<!-- 目标仓库的id -->
<id>repository-id</id>
<!-- 目标仓库的名字 -->
<name>repository-name</name>
<!-- 目标仓库的网址 -->
<url>file://${basedir}/target/deploy</url>
</repository>
<!-- 测试版仓库 -->
<snapshotRepository>
<uniqueVersion/>
<id/>
<name/>
<url/>
</snapshotRepository>
</distributionManagement>
<!-- 仓库配置 -->
<!-- 远程仓库列表 -->
<repositories>
<!-- 连接远程仓库的信息 -->
<repository>
<!-- 处理远程仓库 正式发布版本 的下载 -->
<release>
<!-- 是否下载某种类型构件 -->
<enabled/>
<!-- 指定更新的频率 -->
<updatePolicy/>
<!-- Maven验证构件失败的处理 -->
<checksumPolicy/>
</release>
<!-- 处理远程仓库 快照版本 的下载(快照是一种特殊的版本,指定了某个当前的开发进度的副本) -->
<snapshots>
<enabled/>
<updatePolicy/>
<checksumPolicy/>
</snapshots>
<!-- 远程仓库唯一标识符,可以匹配settings.xml文件的远程仓库 -->
<id>repository-id</id>
<!-- 远程仓库名称 -->
<name>repository-name</name>
<!-- 远程仓库网址(形式为protocol://hostname/path) -->
<url>repository-url</url>
<!-- 指定仓库布局类型(default:默认,legacy:遗留) -->
<layout></layout>
</repository>
</repositories>
</project>
properties配置示例
<!-- 定义pom常量,便于在pom中的直接引用 -->
<!-- 示例 -->
<properties>
<demo.version>4.11</demo.version>
</properties>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${demo.version}</version>
<scope>test</scope>
</dependency>
scope配置详解
maven认为,程序对外部的依赖会随着程序的所处阶段和应用场景而变化,所以maven中的依赖关系有作用域(scope)的限制。
scope值如下:
- compile(编译范围):默认值,表示被依赖项目需要参与项目的编译、测试、运行、打包、发布。
- runtime(运行时范围):表示被依赖项目不参与项目的编译。
- test(测试范围):表示被依赖项目仅参与项目测试相关的工作(包括测试代码的编译和执行,但不会被打包和部署)。
- provided(已提供范围):表示被依赖项目参与项目的编译、测试和运行,而其他依赖由JDK或容器提供。
- system(系统范围):与 provided 相似,但不依赖Maven仓库,而是必须使用systemPath属性指定本地文件系统获取。