课程地址
资料地址
Maven基本概念
Maven的作用:
项目构建:提供标准的,跨平台的自动化项目构建方式
依赖管理:方便快捷的管理项目依赖的资源(jar包),避免资源间的版本冲突问题
统一开发结构:提供标准的、统一的项目结构
安装 Maven:下载压缩包解压即可使用,配置环境变量 MAVEN_HOME
指向 Maven 的安装目录,并且在 PATH 中添加一个指向 maven/bin 目录的项(命令对应的可执行文件)
仓库
存储jar包资源
坐标
对仓库中的资源进行定位
Maven坐标的组成:
- groupId:当前Maven项目隶属组织名称(通常是域名的反写,例如org.mybatis)
- artifactId:当前Maven项目的名称(通常是模块名称,例如CRM,SMS)
- version:当前项目版本号
- packaing:该项目的打包方式,web工程打包为war,java工程打包为jar
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope>
</dependency>
作用:使用唯一标识,定位资源位置,通过该标识可以将资源的识别和下载交给机器完成
仓库配置
为了防止将资源存储在C盘占用系统空间,我们可以修改D:\ProgramFiles\apache-maven-3.8.6\conf\settings.xml
的配置,添加本地仓库位置:
<localRepository>D:\ProgramFiles\apache-maven-3.8.6\repository</localRepository>
添加远程镜像仓库,同样修改D:\ProgramFiles\apache-maven-3.8.6\conf\settings.xml
的配置:
<!-- 阿里云仓库 --><mirror><id>alimaven</id><mirrorOf>central</mirrorOf><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/repositories/central/</url></mirror><!-- 中央仓库1 --><mirror><id>repo1</id><mirrorOf>central</mirrorOf><name>Human Readable Name for this Mirror.</name><url>http://repo1.maven.org/maven2/</url></mirror><!-- 中央仓库2 --><mirror><id>repo2</id><mirrorOf>central</mirrorOf><name>Human Readable Name for this Mirror.</name><url>http://repo2.maven.org/maven2/</url></mirror>
上面配置的是全局setting,在C:\Users\Daniel\.m2
也能有一个每个用户的局部setting文件
第一个Maven项目
手工创建
meven项目结构:
两个源代码文件如下:
//Demo.java
package com.itheima;
public class Demo {public String say(String name) {System.out.println("hello " + name);return "hello " + name;}
}//DemoTest.java
package com.itheima;import org.junit.Test;
import org.junit.Assert;public class DemoTest {@Testpublic void sayTest() {Demo d = new Demo();String ret = d.say("maven");Assert.assertEquals("hello maven", ret);}
}
一个基本的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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.itheima</groupId><artifactId>mvn-demo</artifactId><version>1.0.0</version><name>mvn-demo</name><description>mvn-demo</description><packaging>jar</packaging><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies><build></build></project>
构建命令:
mvn complie
mvn clean
mvn test #运行单元测试,生成测试报告
mvn package #打包,在target目录生成本项目的jar包。包含了前面的 compile 和 test 步骤
mvn install #安装到本地仓库,在本地仓库maven\repository下生成本项目的jar包
如果编译时报错不再支持源选项 5。请使用 7 或更高版本。
,请在setting.xml
中升级jdk版本:
<profile><id>jdk-17</id> <activation> <activeByDefault>true</activeByDefault> <jdk>17</jdk> </activation><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties> </profile>
上面创建工程目录的过程可以通过工具自动完成:
mvn archetype:generate
-DgroupId={project-packaging}
-DartifactId={project-name}
-DarchetypeArtifactId=maven-archetype-quickstart
-DinteractiveMode=false
生成一个java工程:
mvn archetype:generate -DgroupId=com.itheima -DartifactId=demo2 -DarchetypeArtifactId=maven-archetype-quickstart -Dversion=0.0.1-snapshot -DinteractiveMode=false
生成一个web工程:
mvn archetype:generate -DgroupId=com.itheima -DartifactId=web-project -DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-snapshot -DinteractiveMode=false
IDEA创建
可以在Edit Configurations
处配置快捷操作:
添加tomcat插件:
在pom文件中添加如下内容:
<build><finalName>demo3</finalName><plugins><plugin><!-- https://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat7-maven-plugin --><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>80</port><path>/</path></configuration></plugin></plugins></build>
依赖管理
依赖是指当前项目需要的jar包:
<!--设置当前项目所依赖的所有jar--><dependencies><!--设置具体的依赖--><dependency><!--依赖所属群组id--><groupId>junit</groupId><!--依赖所属项目id--><artifactId>junit</artifactId><!--依赖版本号--><version>3.8.1</version><scope>test</scope></dependency></dependencies>
依赖传递:你的项目的依赖的依赖,在你的当前项目中可以直接使用
例如下面的2个项目中,project2 依赖于 project3,所以 project3 依赖的 log4j:log4j:1.2.14 也出现在了 project2 的依赖列表中
直接依赖:在当前项目中通过依赖配置建立的依赖关系,例如上面 log4j:log4j:1.2.13 就是 project2 的直接依赖
间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源,例如上面 log4j:log4j:1.2.14 就是 project2 的间接依赖
依赖传递冲突问题:
隐藏(可选)依赖
对外隐藏当前项目所依赖的资源,这样当你的项目被当作 jar 包被其他项目引用时,就能够确保其他人看不到你依赖的资源
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.12</version><optional>true</optional> <!--可选依赖,不可见--></dependency>
排除依赖
主动断开依赖的资源,被排除的资源无需执行版本
<dependency><groupId>com.itheima</groupId><artifactId>demo3</artifactId><version>1.0-SNAPSHOT</version><exclusions> <!--排除依赖--><exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion></exclusions></dependency>
依赖范围 scope
生命周期与插件
一个 java 项目构建的生命周期:编译-测试-打包-部署
- compile
- test
- package:打成 jar 包
- install:安装到本地仓库
maven 对项目构建的生命周期划分为3套:
- clean:清理工作。细分为 pre-clean、clean、post-clean
- default:核心工作,包含上面的编译、测试、打包、部署等
- site:产生报告,发布站点等。细分为 pre-site、site、post-site、site-deploy
default 构建生命周期包含的内容比较多:
其中每一项都需要在前面的所有项都完成才能够执行
生命周期中的所有动作都是靠插件完成的
插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能
默认maven在各个生命周期上绑定有预设的功能
通过插件可以自定义其他功能
例如上图引入了一个打包源码的插件,配置了它在 generate-test-resources
阶段运行(在 test 之前)
则点击 test Lifecycle 之后,就会在 target 目录下生成源码包
分模块开发与设计
资料中提供了下面项目的源代码
下面将一个项目中的各个包拆分到不同的项目中,根目录为 ssm_modules
拆分 pojo 模块
创建模块 ssm_pojo,然后将 springmvc_ssm 中的 User 类放在 ssm_pojo 的 com.itheima.domain
包中。项目结构如下:
它的 pom 如下:
<?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"><modelVersion>4.0.0</modelVersion><groupId>com.itheima</groupId><artifactId>ssm_pojo</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties>
</project>
拆分 dao 模块
创建模块 ssm_dao,然后将 springmvc_ssm 中的 UserDao 类放在 ssm_dao 的 com.itheima.domain
包中,并拷贝必要的资源文件。项目结构如下:
编辑 pom 剔除不必要的依赖项,并添加 User 类的依赖,并且需要 mvn install ssm_pojo:
<dependency><groupId>com.itheima</groupId><artifactId>ssm_pojo</artifactId><version>1.0-SNAPSHOT</version></dependency>
拆分 service 模块
创建模块 ssm_service,然后将 springmvc_ssm 中的 UserService 接口及其实现类放在 ssm_service 的 com.itheima.service
包中,并拷贝必要的资源文件。项目结构如下:
编辑 pom 剔除不必要的依赖项,并添加 UserDao 类的依赖,并且需要 mvn install ssm_domain:
<dependency><groupId>com.itheima</groupId><artifactId>ssm_domain</artifactId><version>1.0-SNAPSHOT</version></dependency>
拆分 controller 模块
聚合
将原始项目拆分为多个模块后,每个模块单独开发,因为模块之间的层层依赖,可能导致某一个模块更新后,其他模块没有更新对应的依赖
例如下图中 ssm_dao
模块更新后,ssm_service
和 ssm_controller
可能没有更新对应的依赖
这就需要用一个外层模块统一管理所有子模块,统一构建
新建一个模块(聚合项目),专门用于模块管理,其 pom 如下:
<?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"><modelVersion>4.0.0</modelVersion><groupId>com.itheima</groupId><artifactId>ssm</artifactId><version>1.0-SNAPSHOT</version><!--定义该工程用于进行构建管理--><packaging>pom</packaging><!--管理的工程列表--><modules><!--具体的工程名称--><module>../ssm_controller</module><module>../ssm_service</module><module>../ssm_dao</module><module>../ssm_pojo</module></modules>
</project>
聚合项目的打包方式是 pom
对于一般的项目,默认的打包方式是 jar。对于 web 项目,默认的打包方式是 war
继承
在一个聚合项目中,子模块可能依赖于不同版本的资源,造成了管理混乱
可以通过继承的方式统一在父工程中管理这些模块。例如下面的 ssm_service
和 ssm_dao
都依赖于 spring-context
,则将其配置在父工程方便做版本控制
通过继承可以实现在子工程中沿用父工程的配置(依赖)。在子工程中声明继承关系:
<parent><groupId>com.itheima</groupId><artifactId>ssm</artifactId><version>1.0-SNAPSHOT</version><!-- 填写父工程的 pom 文件--><relativePath>../ssm/pom.xml</relativePath>
</parent>
原则上子工程的 groupId
和 version
应该与父工程保持一致(parent
中声明的),所以可以省略
在父工程中声明依赖管理:
<!-- 声明此处进行依赖管理 -->
<dependencyManagement><!-- 具体的依赖 --><dependencies><!--spring 环境 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.9.RELEASE</version></dependency><dependencies>
<dependencyManagement>
继承依赖的使用:在子工程中定义依赖关系,无需声明版本,它会参考父工程中依赖的版本
<dependencies><!--spring 环境 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency>
</dependencies>
同样的,插件也可以通过 pluginManagement
实现继承
属性
属性相当于变量,一处定义,处处复用,统一维护
属性包括5种:
- 自定义属性
- 内置属性
- setting 属性
- java 系统属性
- 环境变量属性
自定义属性
定义格式:
<properties><spring.version>5.1.9.RELEASE</spring.version><junit.version>4.12</junit.version>
</properties>
调用格式:
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version>
</dependency>
内置属性
maven 的内置属性。调用格式:
${basedir}
${version}
例如下图中三个依赖的版本都跟 ssm
的 version 保持一致
setting 属性
maven 配置文件 setting.xml 中的标签属性,用于动态配置
${settings.localRepository}
Java 系统属性
${user.home}
环境变量属性
${env.JAVA_HOME}
版本管理
工程版本分为2类:快照版本和发布版本
资源配置
资源配置主要是针对 properties 文件的管理,例如 jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm_db
jdbc.username=root
jdbc.password=itheima
将他的 url 抽取到 pom 的属性中,并在 build 中配置资源文件对应的信息:
<properties><jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url></properties><build><!--配置资源文件对应的信息--><resources><resource><directory>${project.basedir}/src/main/resources</directory><filtering>true</filtering></resource></resources><!--配置测试资源文件对应的信息--><testResources><testResource><directory>${project.basedir}/src/test/resources</directory><filtering>true</filtering></testResource></testResources></build>
那么在 properties 文件中就可以直接引用这个属性值:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=${jdbc.url}
jdbc.username=root
jdbc.password=itheima
多环境配置
<!--创建多环境--><profiles><!--定义具体的环境:生产环境--><profile><!--定义环境对应的唯一名称--><id>pro_env</id><!--定义环境中换用的属性值--><properties><jdbc.url>jdbc:mysql://127.1.1.1:3306/ssm_db</jdbc.url></properties><!--设置默认启动--><activation><activeByDefault>true</activeByDefault></activation></profile><!--定义具体的环境:开发环境--><profile><id>dep_env</id><properties><jdbc.url>jdbc:mysql://127.2.2.2:3306/ssm_db</jdbc.url></properties></profile></profiles>
加载指定环境:
# mvn 指令 -P 环境id
mvn install -P pro_env
跳过测试
使用命令跳过测试
执行的指令生命周期必须包含测试环节
mvn 指令 -D skipTests
使用界面操作跳过测试
使用配置跳过测试
测试阶段是由插件完成的,所以可以通过配置对应的插件来跳过部分测试
<plugin><artifactId>maven-surefire-plugin</artifactId><version>2.22.1</version><configuration><skipTests>true</skipTests><!-- 设置跳过测试 --><includes> <!-- 包含指定的测试用例 --><include>**/User*Test.java</include></includes><excludes><!-- 排除指定的测试用例 --><exclude>**/User*TestCase.java</exclude></excludes></configuration>
</plugin>
私服
nexus 是 Sonatype 公司的一款 maven 私服产品
在 D:\ProgramFiles\nexus-3.74.0-05-java17-win64\nexus-3.74.0-05\bin
目录下启动 nexus 服务器:
nexus.exe /run nexus
访问地址是 localhost:8081
私服资源获取: