Maven 是一款为 Java 项目管理构建、依赖管理的工具(软件),使用 Maven 可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量
官网下载:https://maven.apache.org/docs/history.html
下载后解压即可
配置Maven环境变量
功能配置,修改 apache-maven-3.9.6\conf\settings.xml
本地仓库位置:
配置国内阿里镜像
<mirror>
<id>alimavenid>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
<mirrorOf>centralmirrorOf>
mirror>
配置jdk17版本项目构建
<profile>
<id>jdk-17id>
<activation>
<activeByDefault>trueactiveByDefault>
<jdk>17jdk>
activation>
<properties>
<maven.compiler.source>17maven.compiler.source>
<maven.compiler.target>17maven.compiler.target>
<maven.compiler.compilerVersion>17maven.compiler.compilerVersion>
properties>
profile>
IDEA中配置 maven :settings
-> Build, Execution, Deployment
-> Build Tools
-> Maven
Maven home path
User setting file
Local repository
:一般上面两个配置好,这个会自动变;如果没变才配置Maven 中的 GAVP 是指 GroupId、ArtifactId、Version、Packaging 等四个属性的缩写,其中前三个是必要的,而 Packaging 属性为可选项。这四个属性主要为每个项目在maven仓库中做一个标识,类似人的姓-名。有了具体标识,方便后期项目之间相互引用依赖等
jar
(默认值):代表普通的Java工程,打包以后是.jar结尾的文件war
:代表Java的web工程,打包以后.war结尾的文件pom
:代表不会打包,用来做继承的父工程pom.xml :
<modelVersion>4.0.0modelVersion>
<groupId>com.companyname.project-groupgroupId>
<artifactId>projectartifactId>
<version>1.0.0version>
<packaging>jar/pom/warpackaging>
pom.xml
添加 war
,刷新 maven 依赖Project Structure
中,选中 对应 module 的 Web,复制 Web Resource Directory
下面爆红的路径Deployment Descriptors
中点击 +
号,添加 web.xml
,将路径中 \WBE-INF
之前的路径替换为复制的路径Servlet Version | EE Version |
---|---|
6.1 | Jakarta EE ? |
6.0 | Jakarta EE 10 |
5.0 | Jakarta EE 9/9.1 |
4.0 | JAVA EE 8 |
3.1 | JAVA EE 7 |
3.1 | JAVA EE 7 |
3.0 | JAVAEE 6 |
Servlet Version | **Tomcat ** Version | JDK Version |
---|---|---|
6.1 | 11.0.x | 17 and later |
6.0 | 10.1.x | 11 and later |
5.0 | 10.0.x (superseded) | 8 and later |
4.0 | 9.0.x | 8 and later |
3.1 | 8.5.x | 7 and later |
3.1 | 8.0.x (superseded) | 7 and later |
3.0 | 7.0.x (archived) | 6 and later (7 and later for WebSocket) |
Maven工程项目结构说明:
|-- pom.xml # Maven 项目管理文件
|-- src
|-- main # 项目主要代码
| |-- java # Java 源代码目录
| | |-- com/example/myapp # 开发者代码主目录
| | |-- controller # 存放 Controller 层代码的目录
| | |-- service # 存放 Service 层代码的目录
| | |-- dao # 存放 DAO 层代码的目录
| | |-- model # 存放数据模型的目录
| |-- resources # 资源目录,存放配置文件、静态资源等
| | |-- log4j.properties # 日志配置文件
| | |-- spring-mybatis.xml # Spring Mybatis 配置文件
| | |-- static # 存放静态资源的目录
| | |-- css # 存放 CSS 文件的目录
| | |-- js # 存放 JavaScript 文件的目录
| | |-- images # 存放图片资源的目录
| |-- webapp # 存放 WEB 相关配置和资源
| |-- WEB-INF # 存放 WEB 应用配置文件
| | |-- web.xml # Web 应用的部署描述文件
| | |-- classes # 存放编译后的 class 文件
| |-- index.html # Web 应用入口页面
|-- test # 项目测试代码
|-- java # 单元测试目录
|-- resources # 测试资源目录
命令方式项目构建,对应命令也对应着构建的生命周期,一个命令可能会执行多个默认操作,如 package 会先执行 clean, complile, test-compile,test 再打包
命令 | 描述 |
---|---|
mvn clean | 清理编译或打包后的项目结构 |
mvn compile | 编译项目,生成target文件 |
mvn test | 执行测试源码 |
mvn package | 打包项目,生成jar或war文件 |
mvn install | 打包后上传到maven本地仓库 |
mvn deploy | 只打包,上传到maven私服仓库 |
mvn site | 生成站点 |
war包打包插件和jdk版本不匹配:pom.xml 添加以下代码即可
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-war-pluginartifactId>
<version>3.2.2version>
plugin>
plugins>
build>
插件、命令和周期之间的关系
周期→包含若干命令→包含若干插件。使用周期命令构建,简化构建过程。最终进行构建的是插件。
pom.xml:在该文件中对依赖进行管理配置,maven仓库信息官网 https://mvnrepository.com/
<dependencies>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
<scope>runtimescope>
dependency>
dependencies>
依赖版本统一管理和维护,推荐使用
<properties>
<junit.version>4.12junit.version>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
properties>
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>${junit.version}version>
dependency>
dependencies>
依赖范围 ,通过设置坐标的依赖范围(scope),可以设置 对应jar包的作用范围:编译环境、测试环境、运行环境
依赖范围 | 描述 |
---|---|
compile | 编译依赖范围,scope 元素的缺省值。对于三种 classpath 均有效 |
test | 测试依赖范围。使用此依赖范围的 Maven 依赖,只对测试 classpath 有效 |
provided | 已提供依赖范围。使用此依赖范围的 Maven 依赖,只对编译 classpath 和测试 classpath 有效。例如,servlet-api 依赖对于编译、测试阶段而言是需要的,但是运行阶段,由于外部容器已经提供,故不需要 Maven 重复引入该依赖。 |
runtime | 运行时依赖范围。使用此依赖范围的 Maven 依赖,只对测试 classpath、运行 classpath 有效。例如,JDBC 驱动实现依赖,其在编译时只需 JDK 提供的 JDBC 接口即可,只有测试、运行阶段才需要实现了 JDBC 接口的驱动 |
system | 系统依赖范围,其效果与 provided 的依赖范围一致。其用于添加非 Maven 仓库的本地依赖,通过依赖元素 dependency 中的 systemPath 元素指定本地依赖的路径。鉴于使用其会导致项目的可移植性降低,一般不推荐使用。 |
import | 导入依赖范围,该依赖范围只能与 dependencyManagement 元素配合使用,其功能是将目标 pom.xml 文件中 dependencyManagement 的配置导入合并到当前 pom.xml 的 dependencyManagement 中 |
项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程,在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。
默认情况下,构建不需要额外配置,都有对应的缺省配置。当然了,我们也可以在pom.xml定制一些配置,来修改默认构建的行为和产物。
构建配置是在 pom.xml / build
标签中指定
指定打包命名
<build>
<finalName>定义打包名称finalName>
build>
指定打包文件:应用场景:mybatis中有时会将用于编写SQL语句的映射文件和mapper接口都写在src/main/java下的某个包中,此时映射文件就不会被打包
<build>
<resources>
<resource>
<directory>src/main/javadirectory>
<includes>
<include>**/*.xmlinclude>
includes>
resource>
resources>
build>
配置依赖插件
常用的插件:修改jdk版本、tomcat插件、mybatis分页插件、mybatis逆向工程插件等等
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<configuration>
<source>1.8source>
<target>1.8target>
<encoding>UTF-8encoding>
configuration>
plugin>
<plugin>
<groupId>org.apache.tomcat.mavengroupId>
<artifactId>tomcat7-maven-pluginartifactId>
<version>2.2version>
<configuration>
<port>8090port>
<path>/path>
<uriEncoding>UTF-8uriEncoding>
<server>tomcat7server>
configuration>
plugin>
plugins>
build>
假如有Maven项目A,项目B依赖A,项目C依赖B。那么我们可以说 C依赖A。也就是说,依赖的关系为:C—>B—>A, 那么我们执行项目C时,会自动把B、A都下载导入到C项目的jar包文件夹中,这就是依赖的传递性。
传递的原则
依赖冲突解决方式:
<dependency>
<groupId>com.atguigu.mavengroupId>
<artifactId>pro01-maven-javaartifactId>
<version>1.0-SNAPSHOTversion>
<scope>compilescope>
<exclusions>
<exclusion>
<groupId>commons-logginggroupId>
<artifactId>commons-loggingartifactId>
exclusion>
exclusions>
dependency>
Maven 继承是指在 Maven 的项目中,让一个项目从另一个项目中继承配置信息的机制。继承可以让我们在多个项目中共享同一配置信息,简化项目的管理和维护工作
继承语法:
父工程:打包方式必须是
子工程:
<parent>
<groupId>com.pro.mavengroupId>
<artifactId>pro-maven-parentartifactId>
<version>1.0-SNAPSHOTversion>
parent>
<artifactId>pro01-maven-moduleartifactId>
依赖统一管理:
dependencyManagement
标签:声明依赖版本,子工程需依赖时无需再声明版本,一般只使用该方式dependencies
标签:声明依赖,父工程声明的依赖在子工程中会自动全部导入,子工程无需任何声明,一般不使用,防止多导入依赖给子工程聚合的项目通过父工程执行 maven 构建命令时,会同时触发其子模块的对应构建
聚合语法:
标签,注意,module
标签中包含的并不是子项目的项目名,而是项目的位置,即聚合不是必须得是父子项目关系
<project>
<groupId>com.examplegroupId>
<artifactId>parent-projectartifactId>
<packaging>pompackaging>
<version>1.0.0version>
<modules>
<module>child-project1module>
<module>child-project2module>
modules>
project>
Maven 私服是一种特殊的Maven远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的远程仓库(中央仓库、其他远程公共仓库)。
常见的Maven私服产品
Archiva
Artifactory
Nexus
([ˈneksəs])(当前最流行、使用最广泛)./nexus/run
命令启动;需等到启动成功,需要一定时间仓库名称 | 说明 |
---|---|
maven-central | Nexus 对 Maven 中央仓库的代理,可点击 设置->仓库 修改对应仓库地址为阿里云仓库 |
maven-public | Nexus 默认创建,供开发人员下载使用的组仓库 |
maven-releases | Nexus 默认创建,供开发人员部署自己 jar 包的宿主仓库 要求 releases 版本 |
maven-snapshots | Nexus 默认创建,供开发人员部署自己 jar 包的宿主仓库 要求 snapshots 版本 |
仓库类型 | 说明 |
---|---|
proxy | 某个远程仓库的代理 |
group | 存放:通过 Nexus 获取的第三方 jar 包 |
hosted | 存放:本团队其他开发人员部署到 Nexus 的 jar 包 |
客户端配置私服镜像 settings.xml
,url 点击对应仓库的 url 列复制即可
<mirror>
<id>nexus-mineid>
<mirrorOf>centralmirrorOf>
<name>Nexus minename>
<url>http://localhost:8081/repository/maven-public/url>
mirror>
如果前面未启动匿名登陆,则需继续配置。格外注意:server 标签内的 id 标签值必须和 mirror 标签中的 id 值一样
<server>
<id>nexus-mineid>
<username>adminusername>
<password>上述自己填写的新密码password>
server>
maven工程中配置:这里 snapshotRepository 的 id 标签必须和 settings.xml 中指定的 mirror 标签的 id 属性一致。
<distributionManagement>
<snapshotRepository>
<id>nexus-mineid>
<name>Nexus Snapshotname>
<url>http://localhost:8081/repository/maven-snapshots/url>
snapshotRepository>
distributionManagement>
执行部署命令:
mvn deploy
maven工程中配置:
<repositories>
<repository>
<id>nexus-mineid>
<name>nexus-minename>
<url>http://localhost:8081/repository/maven-snapshots/url>
<snapshots>
<enabled>trueenabled>
snapshots>
<releases>
<enabled>trueenabled>
releases>
repository>
repositories>
需求案例:搭建一个电商平台项目,该平台包括用户服务、订单服务、通用工具模块等。
项目架构:
<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.0modelVersion>
<groupId>com.progroupId>
<artifactId>micro-shopartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>pompackaging>
<modules>
<module>common-servicemodule>
<module>user-servicemodule>
<module>order-servicemodule>
modules>
<properties>
<spring.version>6.0.6spring.version>
<jackson.version>2.15.0jackson.version>
<commons.version>2.11.0commons.version>
<junit.version>5.9.2junit.version>
<maven.compiler.source>17maven.compiler.source>
<maven.compiler.target>17maven.compiler.target>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>${jackson.version}version>
dependency>
<dependency>
<groupId>commons-iogroupId>
<artifactId>commons-ioartifactId>
<version>${commons.version}version>
dependency>
<dependency>
<groupId>org.junit.jupitergroupId>
<artifactId>junit-jupiter-apiartifactId>
<version>${junit.version}version>
<scope>testscope>
dependency>
dependencies>
dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-war-pluginartifactId>
<version>3.2.2version>
plugin>
plugins>
build>
project>
<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">
<parent>
<artifactId>micro-shopartifactId>
<groupId>com.progroupId>
<version>1.0-SNAPSHOTversion>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>common-serviceartifactId>
<packaging>jarpackaging>
<properties>
<maven.compiler.source>17maven.compiler.source>
<maven.compiler.target>17maven.compiler.target>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
properties>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
dependency>
<dependency>
<groupId>commons-iogroupId>
<artifactId>commons-ioartifactId>
dependency>
<dependency>
<groupId>org.junit.jupitergroupId>
<artifactId>junit-jupiter-apiartifactId>
<scope>testscope>
dependency>
dependencies>
project>
<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">
<parent>
<artifactId>micro-shopartifactId>
<groupId>com.progroupId>
<version>1.0-SNAPSHOTversion>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>user-serviceartifactId>
<packaging>warpackaging>
<properties>
<maven.compiler.source>17maven.compiler.source>
<maven.compiler.target>17maven.compiler.target>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
properties>
<dependencies>
<dependency>
<groupId>com.atguigugroupId>
<artifactId>common-serviceartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
dependencies>
project>
<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">
<parent>
<artifactId>micro-shopartifactId>
<groupId>com.atguigugroupId>
<version>1.0-SNAPSHOTversion>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>order-serviceartifactId>
<packaging>warpackaging>
<properties>
<maven.compiler.source>17maven.compiler.source>
<maven.compiler.target>17maven.compiler.target>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
properties>
<dependencies>
<dependency>
<groupId>com.atguigugroupId>
<artifactId>common-serviceartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
dependencies>
project>