如果调试一个程序让你很苦恼,千万不要放弃,成功永远在拐角之后,除非你走到拐角,否则你永远不知道你离他多远,所以,请记住,坚持不懈,直到成功。
一、Maven简述
1.1 什么是Maven?
Apache Maven
是一款基于 Java 平台的项目管理和构建工具,它基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建、报告和文档。
简单来讲Maven就是一个项目管理工具,用来管理我们的项目和依赖(jar),这样我们能把更多的精力放在开发上。
当然除了学习Maven外后期还会接触Gradle等构建工具。(之前搞安卓的时候接触过Gradle🐘)
Apache Maven官网:https://maven.apache.org/
Maven是专门用于管理和构建Java项目的工具,它的主要功能有:
-
提供了一套标准化的项目结构(所有IDE使用Maven构建的项目结构完全一样)
-
提供了一套标准化的构建流程(如 编译、测试、打包(jar包)、发布等)
-
提供了一套依赖管理机制(使用Maven坐标配置来管理各种依赖)
1.2 Maven模型
- POM(Project Object Model)项目对象模型。
- Dependency 依赖管理模型。
- Plugin 插件。
1.3 Maven仓库
Maven Repository(Maven仓库)
Maven中有如下3种仓库:
-
本地仓库,自己电脑上的仓库(存jar包的位置)
-
私服仓库,速度比中央仓库要快,通常都是由一些公司、组织搭建的私有仓库,用于同步中央仓库上的文件。
-
中央仓库:在互联网中,由Apache团队维护,包含了基本所有的jar包,版权原因不包含Oracle的驱动包
-
中央仓库地址:https://mvnrepository.com
二、Maven的安装配置
2.1 下载Maven
新版Maven的下载地址:https://maven.apache.org/download.cgi
通常比较新的东西不太稳定,接下来我们下载一个maven3.6.1Windows版。
Maven3.6.1下载地址:https://archive.apache.org/dist/maven/maven-3/3.6.1/binaries
下载成功后,将Maven文件夹移动到你的工作目录并解压包即可。
Maven目录结构如下:
- bin目录:存放一些可执行命令。(例如 mvn命令)
- boot目录:该目录下只有一个文件
plexus-classworlds-xxx.jar
,这个文件它是一个类加载器框架,相对于默认的 java 类加载器,它提供了更丰富的语法以方便配置,Maven 使用该框架加载自己的类库。 - conf目录:存放maven相关的配置文件。(例如 setting.xml)
- lib目录:存放maven依赖的jar包。(Maven也是使用java开发的,所以它也需要依赖其他的jar包)
2.2 配置环境变量
1、新建系统变量MAVEN_HOME
变量名 | 变量值 |
---|---|
MAVEN_HOME | D:\Program Files\Environment\apache-maven-3.6.1(Maven的安装目录/位置) |
2、在系统变量path中引用这个变量
变量名 | 变量值 |
---|---|
Path | %MAVEN_HOME%\bin |
3、在命令提示符窗口中输入mvn -version
mvn -version
出现上述结果,表示Maven已经安装成功啦。
当然Maven的卸载也很简单,将Maven的工作目录删除,然后删除它的环境变量即可。
2.3 配置本地仓库
1、在Maven的工作目录中创建一个maven_repo
文件夹,用来存放我们以后从中央仓库下载的jar包。
2、在conf/setting.xml
文件中配置一个<localRepository>
标签,并指向本地仓库位置。
<localRepository>D:\Program Files\Environment\apache-maven-3.6.1\maven_repo</localRepository>
配置之后,项目需要的依赖jar包如果本地仓库没有的话就需要去中央仓库下载,但是中央仓库在国外,速度会很慢,这时我们可以配置镜像服务器,只需要在conf/setting.xml
中添加镜像地址即可。
2.4 配置阿里云镜像加速
在conf/setting.xml文件的<mirrors>
标签中添加阿里云私服。
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
2.5 配置使用JDK8编译
maven3.6.1版本默认的jdk版本是1.5,就会导致项目的兼容性问题,所以需要配置成1.8。
在 conf/settings.xml
文的 <profiles>
标签中配置:
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
三、Maven的基本使用
3.1 Maven常用命令
Maven常用命令:
-
编译(compile)
-
清理(clean)
-
打包(package)
-
测试 (test)
-
安装(install)
命令详解:
mvn compile # 编译项目的源代码(执行这个命令后,项目会自动生成target目录,会将class字节码文件放在target目标目录中)
mvn clean # 清除项目中target目录
mvn package # 将编译后的代码打包,如jar、war或者ear文件
mvn test # 运行应用程序中的单元测试
mvn install # 将项目包安装到本地仓库,这样项目包就可以用作其他本地项目的依赖
注意:执行maven命令需要当前项目目录有pom文件,然后在cmd窗口执行命令。
3.2 Maven的生命周期
Maven构建项目的生命周期描述的是一次构建过程经历经历了多少个事件。
Maven 对项目构建的生命周期划分为3套:
-
清理生命周期 CleanLifeCycle,常用命令:
clean
-
默认生命周期(构建生命周期)DefaultLifeCycle,常用命令:
compile -> test -> package -> install -> deploy
。 -
站点生命周期 SiteLifeCycle,常用命令:
site
。生成Maven项目的描述信息文档。
注意: 同一生命周期内,执行后面的命令,前边的所有命令都会自动执行。
例如 小张对maven项目进行打包操作,执行流程就是编译->测试->打包。
也就是同一生命周期内,执行后面的命令,前边的所有命令都会自动执行。
3.3 在IntelliJ IDEA中配置Maven
参考文章:https://blog.csdn.net/QZP51ZX/article/details/107522316
1、设置IntelliJ IDEA使用本地安装的Maven,并修改配置文件路径:
2、设置maven在不联网的情况下使用本地插件构建项目:
-DarchetypeCatalog=internal -Dfile.encoding=GB2312
然后重启IntelliJ IDEA即可!
3.4 Maven坐标详解
1、Maven坐标是用来干什么的?
-
Maven坐标:可以理解为jar包的唯一标识,用于快速定位一个jar包;
-
使用坐标来构建项目或者引入项目中需要的依赖(dependency)
2、Maven坐标主要组成:
- groupId:定义当前Maven项目隶属组织名称(通常是公司域名反写,例如: com.baidou)
- artifactId:定义当前Maven项目名称(通常是模块名称)
- version:定义当前项目的版本号(SNAPSHOP快照版本,RELEASE稳定版本 )
3.5 使用IDEA创建Maven普通项目
maven项目结构详解:
可以在IDEA安装一个MavenHelper,简化Maven的使用。
3.6 使用IDEA导入Maven项目
1、选择右侧Maven面板,点击 +
号。
2、选中对应项目的pom.xml
文件,双击即可。
3、如果没有Maven面板,选择View → Appearance > Tool Window Bars
即可。
3.7 使用IDEA移除Maven项目
1、打开maven面板
2、选中要移除的maven工程,并鼠标右键,然后点击【Unlink Maven Projects】
3.8 使用IDEA构建Maven Web项目
1、创建一个Maven-Web项目
2、向pom.xml中引入Tomcat插件,并刷新依赖
<build>
<plugins>
<!-- Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port> <!-- 访问端口 -->
<path>/</path> <!-- 访问路径 -->
</configuration>
</plugin>
</plugins>
</build>
3、启动Tomcat
控制台出现如下结果表示启动成功。
4、测试访问 http://127.0.0.1:8080
扩展
另一种简单创建web项目方式:使用插件将Maven普通项目转成Maven-Web项目。
1、创建Maven普通项目。(不使用骨架构建)
2、IDEA下载插件:JBLJavaToWeb
3、鼠标右键Maven项目,然后选中【JBLJavaToWeb】 ,会自动生成webapp目录和web.xml文件。
3.9 使用Maven构建SpringBoot项目
Maven 的配置:
<!--阿里云镜像源-->
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
<!--切换jdk编译版本-->
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
1、 创建一个普通Maven项目
2、向 pom.xml 文件中引入依赖
<!--父级依赖-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
<dependencies>
<!--web模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
ok已经成功将依赖导入到项目中!
3、创建一个入口程序,用于启动SpringBoot应用程序
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* SpringBoot启动类
*/
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class,args);
}
}
4、编写业务
package com.baidou.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello() {
return "你好 SpringBoot!!!";
}
}
5、测试运行
执行启动类中的main方法便可以运行这个springboot应用:
ok项目已经启动成功啦!
测试访问:http://localhost:8080/hello
6、简化配置,在resources目录中创建一个application.properties
文件
# 修改tomcat服务器的端口号
server.port=8089
重新启动项目,并测试 http://localhost:8089/hello
7、简化部署
向pom.xml引入打包插件,这样就可以将项目打成jar包,然后部署到服务器上啦。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
点击右侧的maven->Lifecycle->package
:(maven打包操作)
然后target目标目录中便会自动生成该项目的jar包;
运行jar文件:java -jar xxx.jar
。
四、依赖管理
4.1 使用坐标导入jar包
Maven中央仓库:https://mvnrepository.com
1、在pom.xml中编写<dependencies>
标签。
2、在<dependencies>
标签中使用<dependency>
引入坐标。
3、定义坐标的groupld
,artifactld
,version
。
4、点击刷新按钮,使坐标生效。
<!--引入xxx依赖坐标-->
<dependency>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
<version>版本号</version>
</dependency>
4.2 依赖范围
依赖范围(scope)指的是该jar包在哪个阶段时才会有效,只要在对应的依赖坐标里配置<scope>
标签,便可以控制依赖的作用范围。也就是设置对应jar包的作用范围:编译环境、测试环境、运行环境。(不写的话默认值是compile )
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope> <!--只在测试环境有效-->
</dependency>
依赖范围 | 编译有效 | 测试有效 | 运行时有效 | 打包有效 | 示例 |
---|---|---|---|---|---|
compile | √ | √ | √ | √ | Spring框架 |
test | x | √ | x | x | 只对测试classpath有效,例如Junit |
provided | √ | √ | x | x | provided修饰的依赖只在编译测试阶段有效,例如 servlet-api,运行阶段由web容器提供,不需要Maven重复引入依赖 |
runtime | x | √ | √ | √ | JDBC驱动 |
system | √ | √ | x | x | 本地maven仓库之外的类库 |
- compile :默认的,在编译环境、测试环境、运行环境有效。即在编译、测试和运行时都要使用该依赖jar包;
- test : 测试环境有效,在编译和运行时将无法使用该类依赖;如 junit。
- provided :编译环境和测试环境有效。在运行环境无效。如servlet-api,在项目运行时,tomcat等容器已经提供,无需Maven重复引入。
- runtime : 在测试环境和运行环境有效。如 jdbc 驱动实现,编译时只需接口。
- system:系统依赖范围,使用system范围的依赖时必须通过systemPath元素显示地指定依赖文件的路径,不依赖Maven仓库解析,所以可能会造成建构的不可移植,谨慎使用。
- import: 等同于parent标签,在parent被占用时,使用import引入父依赖。
4.3 依赖传递
例如 A依赖B,B依赖C,那么A依赖B和B依赖C都是直接依赖 而 A依赖C是间接依赖。
依赖具有传递性:
- 直接依赖。
- 间接依赖。
1、直接依赖:在当前项目中通过依赖配置建立的依赖关系。(当同级配置了相同依赖且不同版本号时,后配置的依赖会覆盖先配置的)
2、间接依赖:在当前Maven工程的pom文件配置了依赖A,然后A又依赖其他资源B,即当前工程也依赖B,B为这个工程的间接依赖。
例如 :当我们使用aop的时候,就不用单独引入spring-aop依赖,直接引入spring-context即可,因为spring-context直接依赖spring-aop,所以项目就间接依赖spring-aop。
<!--spring依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
3、间接依赖会导致依赖冲突问题(扩展)
Maven提供了默认的解决方案:
- 路径相同,谁先声明就用谁。
- 路径不同,谁的路径短就用谁的。(路径越短优先级越高)
① 间接依赖,路径相同,谁先声明就用谁。(例如spring-aop)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
② 间接依赖,路径不同,谁的路径短就用谁的。(例如spring-jcl)
<!-- spring-core中的spring-jcl(日志模块)最短路径是2级 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!-- spring-context中的spring-jcl(日志模块)最短路径是是3级 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
所以优先使用5.0.2的core和jcl依赖。
4.4 可选依赖
例如 创建两个Maven模块A和B,模块A—>模块B,模块B—>Junit,如果模块B不想让模块A知道自己依赖Junit,那么在模块B中将Junit设置对外隐藏。
在模块B中将Junit设置对外隐藏。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<!-- optional可选项:true表示两个项目之间的依赖不传递 -->
<!-- optional:false或者不配置optional标签表示依赖传递 -->
<optional>true</optional>
</dependency>
4.5 排除依赖
例如 创建两个Maven模块A和B,模块A—>模块B,模块B—>Junit,如果模块A不想引入Junit,那么在模块A中配置排除Junit依赖,不需要指定版本号。
<dependency>
<groupId>org.example</groupId>
<artifactId>maven_b</artifactId>
<version>1.0-SNAPSHOT</version>
<!--排除依赖-->
<exclusions>
<!--排除junit依赖-->
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
可选依赖和排除依赖的区别:
五、分模块开发与设计
5.1 分模块开发的意义
分模块开发对工程有什么好处?
1、可以对项目进行扩展,方便其他项目引用相同的功能。
2、将原始模块按照功能拆分成若干个子模块,方便模块间的相互调用,接口共享。
5.2 分模块开发(模块拆分)
一个完整的工程依据什么来进行模块的拆分?
-
按照层级进行拆分。(例如 controller单独一个模块,其他各自一个模块 等等)
-
按照业务模块进行拆分。(例如用户模块,账户模块,订单模块,商品模块,支付模块 等等)
注意事项:分模块开发需要先针对模块功能进行设计,再进行编码。 不会先将工程开发完毕后再进行拆分。
通过maven指令将模块安装到本地仓库(install命令):
mvn install
注意事项:团队会将 【开发好的模块或者开发需要的模块】 发布到内部可共享的仓库中(私服),方便内部去使用。
六、聚合与继承
6.1 聚合工程(分模块开发)
-
聚合:就是将多个模块组织成一个整体,同时进行项目构建的过程称为聚合。(maven的特点:依赖管理和一键构建)
-
聚合工程:通常是一个不具有业务功能的【空工程】(有且仅有一个pom文件)
-
聚合工程的作用:当工程中某个模块发生更新(变更)时,必须保障工程中与已更新模块关联的模块同步更新,此时可以使用聚合工程来解决批量模块同步构建的问题。
6.2 聚合工程开发
Maven工程打包方式:jar(默认)、war(web项目)、pom(聚合工程)。
聚合工程开发步骤:(以父工程ssm与子工程ssm_service为例)
1、创建Maven模块,将打包方式设置为pom。
<packaging>pom</packaging>
将父工程的打包方式设置为pom:
将子模块的打包方式设置为pom:
2、设置当前聚合工程所包含的子模块名称。
<modules>
<module>ssm_controller</module>
<module>ssm_dao</module>
<module>ssm_pojo</module>
<module>ssm_config</module>
<module>ssm_service</module>
</modules>
注意事项:
- 聚合工程中所包含的模块在进行构建时会根据模块间的依赖关系设置构建顺序,与聚合工程中模块的配置书写位置无关。
- 参与聚合的工程无法向上感知是否参与聚合,只能向下配置哪些模块参与本工程的聚合。
6.3 继承关系(继承父工程配置)
什么是Maven的继承?
- 继承描述的是两个工程之间的关系,与Java中的继承相似,子工程可以继承父工程中的配置信息,即依赖关系的继承(也就是子工程可以继承父工程的依赖)。
- 作用:简化配置、减少版本冲突。
6.4 继承关系开发
Maven聚合继承工程开发步骤:(以父工程ssm与子工程ssm_dao为例)
1、创建Maven模块,打包类型设置为pom。(父工程打包方式也设置为pom)
<packaging>pom</packaging>
2、在父工程的pom文件中配置依赖关系(子工程将继承父工程中的依赖关系)
<!--父工程中引入的依赖-->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
</dependencies>
3、在父工程的pom文件中配置子工程中可选的依赖关系。(dependencyManagement标签)
<!--锁定子工程使用的依赖版本-->
<dependencyManagement>
<dependencies>
<!--druid版本为1.1.16-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
<!--junit版本为4.13-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>
只是锁定子工程的依赖以及版本,并没有引入该依赖。
4、在子工程中配置当前工程所继承的父工程。(parent标签)
<!--为该工程指定一个父工程-->
<parent>
<artifactId>ssm</artifactId>
<groupId>com.baidou</groupId>
<version>1.0-SNAPSHOT</version>
<!--指定父工程的pom文件,根据实际情况填写-->
<!--<relativePath>../pom.xml</relativePath>-->
</parent>
5、在子工程中配置使用父工程中可选依赖的坐标。
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</dependency>
</dependencies>
注意事项:
- 子工程中使用父工程中的可选依赖时,仅需要提供群组id和项目id,无需提供版本,版本由父工程统一提供,可以避免版本冲突;若父工程中的版本有问题的话,也可以自己单独指定版本。
- 子工程中还可以配置父工程中没有的依赖。(扩展父工程)
6.5 聚合和继承的区别
1、聚合和继承的作用:
- 聚合用于快速构建项目。(一键构建,一个大哥领多个小弟,老大说句话,小弟们跟着做)
- 继承用于快速配置。(子工程继承父工程中的配置信息)
2、相同点:
- 聚合与继承的pom文件打包方式均为pom,可以将两种关系制作到同一个pom文件中。
- 聚合与继承均属于设计型模块,并无实际的模块内容。
3、不同点:
- 聚合是在当前模块中配置关系,聚合可以感知到参与聚合的模块有哪些。(在父工程pom文件中配置modules标签)
- 继承是在子模块中配置关系(在子模块pom文件中配置parent标签),父模块无法感知哪些子模块继承了自己。
七、属性管理
定义属性的好处:将依赖的版本号抽取成变量,下次使用的时候通过${变量名}
引用即可。
7.1 属性的配置与使用
1、定义属性(在properties标签中配置)
<!--定义自定义属性-->
<properties>
<mysql.version>5.1.47</mysql.version>
<mybatis.version>3.5.5</mybatis.version>
<spring.version>5.2.10.RELEASE</spring.version>
</properties>
2、引入属性
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
7.2 资源文件引用属性
1、定义属性
<!-- 定义自定义属性-->
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<jdbc.url>jdbc:mysql://127.0.0.1:3306/ssm_db</jdbc.url>
</properties>
2、在数据库配置文件jdbc.properties
中引用属性。
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=${jdbc.url}
jdbc.username=root
jdbc.password=123456
3、在父工程pom文件中配置开启资源文件目录加载属性的过滤器。
<build>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
4、配置maven打war包时,忽略web.xml检查。
有时候maven打war包会出现没有web.xml问题。(它要求WEB-INF目录下必须要有web.xml文件,但是在servlet3.0之后,对web.xml文件配置是可选的)
解决方案如下:(bulid—>plugins标签中配置)
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
7.3 其他属性
maven属性
可以给maven项目的pom文件引入如下属性:
- 自定义属性(常用)
- 内置属性
- Setting属性
- Java系统属性
- 环境变量属性
属性分类 | 引用格式 | 示例 |
---|---|---|
自定义属性 | ${自定义属性名} | 如 ${spring.version} 、 ${mysql.version} |
内置属性 | ${内置属性名} | 如${basedir} 表示maven项目的根目录(也就是pom文件的父目录) 、${version} 表示项目的版本号(等价于${project.version} ) |
Setting属性 | ${setting.属性名} | 如 ${settings.localRepository} 表示本地仓库地址,可以作为maven属性去使用 |
Java系统属性 | ${系统属性分类.系统属性名} | 如 ${user.home} 表示本地用户目录 |
环境变量属性 | ${env.环境变量属性名} | 如 ${env.JAVA_HOME} 表示JAVA_HOME环境变量的值 |
通过cmd窗口执行: mvn help:system
可以获取环境变量(jvm和系统)的内容。
mvn help:system
7.4 版本管理
项目开发的版本可以分为:工程版本和发布版本。
工程版本
SNAPSHOT
(快照版本)- 项目开发过程中临时输出的版本,称为快照版本。
- 快照版本会随着开发的进展不断更新。
RELEASE
(发布版本)- 项目开发到进入阶段里程碑后,向团队外部发布较为稳定的版本,这种版本所对应的构件文件是稳定的。
- 即便进行功能的后续开发,也不会改变当前发布版本内容,这种版本称为发布版本。
发布版本 (alpha版、beta版、纯数字版)
1、 Alpha
:Alpha是内部测试版,表示最初的版本,一般不会向外部发布。Alpha版会有很多Bug,除非你想去测试最新的功能,否则一般不建议使用。
2、Beta
(测试):该版本相对于Alpha版已有了很大的改进,消除了严重的错误,但还是存在着一缺陷,需要经过多次测试来进一步消除。这个阶段的版本会一直加入新的功能。
3、RC(Release Candidate)
:Candidate是候选人的意思,用在软件上就是候选版本。Release Candidate就是发行候选版本。和Beta版最大的差别在于Beta阶段会一直加入新的功能,但是到了RC版本,几乎就不会加入新的功能了,而主要着重于除错,主要着重于修复测试中发现的缺陷! RC版本是最终发放给用户的最接近正式版的版本,发行后改正bug就是正式版了,就是正式版之前的最后一个测试版。
4、GA(general availability
:General Availability,正式发布的版本,国外通常用 GA 来标识 release 版本,GA 版本是开发团队认为该版本是稳定版(有的软件可能会标识为 Stable 版本或者 Production 版本,其意思和 GA 相同),可以在较为关键的场合使用,比如生产环境。
5、Release
: 该版本意味“最终版本”,在前面版本的一系列测试版之后,终归会有一个正式版本,是最终交付用户使用的一个版本。该版本有时也称为标准版。一般情况下,Release不会以单词形式出现在软件封面上,取而代之的是符号®。
八、多环境配置与应用
8.1 多环境配置
maven提供配置多种环境配置,帮助开发者使用过程中快速切换环境。
例如:开发、测试、生产环境的数据库位置是不一样的。
1、在父工程pom文件中配置多环境
<!--定义多环境-->
<profiles>
<!--定义具体的环境:生产环境-->
<profile>
<!--定义环境对应的唯一名称-->
<id>env_dep</id>
<!--定义环境中专用的属性值-->
<properties>
<jdbc.url>jdbc:mysql://39.156.66.18:3306/ssm_db</jdbc.url>
</properties>
</profile>
<!--定义具体的环境:开发环境-->
<profile>
<id>env_pro</id>
<properties>
<jdbc.url>jdbc:mysql://127.0.0.1:3306/ssm_db</jdbc.url>
</properties>
<!--设置默认激活环境-->
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!--定义具体的环境:测试环境-->
<profile>
<!--定义环境对应的唯一名称-->
<id>env_test</id>
<!--定义环境中专用的属性值-->
<properties>
<jdbc.url>jdbc:mysql://104.20.5.247:3306/ssm_db</jdbc.url>
</properties>
</profile>
</profiles>
2、使用命令切换环境
mvn [指令] -P [环境定义id]
例如:切换测试环境打包
mvn package -P env_test
8.2 跳过测试
使用Maven打包的时候,可能会因为单元测试打包失败,这时候就需要跳过单元测试,完成项目快速打包操作。
第一种方式:点击maven面板上的小闪电⚡跳过单元测试
第二种方式:使用命令跳过单元测试
跳过测试命令:
mvn package -D skipTests
注意事项: 执行的项目构建指令必须包含测试生命周期,否则无效果。例如 执行compile生命周期,不经过test生命周期。
第三种方式:通过插件细粒度控制跳过测试
在父工程pom文件中配置,放在project–>build–>plugins标签中:
<!--打包跳过单元测试-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
通过excludes控制哪些代码不需要测试:
<plugin>
<!--maven测试插件-->
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
<configuration>
<!--设置跳过测试-->
<skipTests>true</skipTests>
<!--通过excludes控制哪些不需要测试-->
<excludes>
<exclude>**/HelloTest.java</exclude>
</excludes>
</configuration>
</plugin>
九、Maven私服
9.1 私服概述
- 私服是一台独立的服务器,用于解决团队内部的资源共享与资源同步问题。
-
Nexus是Sonatype公司的一款maven私服产品。
9.2 使用Nexus搭建Maven私服
以windows版nexus-3.30.1-01-win64.zip为例
1、下载nexus3.x版本。
https://download.sonatype.com/nexus/3/nexus-3.30.1-01-win64.zip
2、将nexus解压到自定义的环境目录
- 在nexus工作目录下的etc目录有一个
nexus-default.properties
文件,里面保存了nexus基础配置信息,例如默认端口号。 - 在nexus软件目录下的bin目录有一个
nexus.vmoptions
文件,里面保存了nexus服务器启动对应的配置信息,例如默认占用内存空间。
3、通过命令启动nexus服务器
进入nexus软件的bin目录,然后打开cmd窗口,执行命名:nexus.exe /run nexus
。
nexus.exe /run nexus
注意:启动成功后,这个窗口不要关闭,否则nexus服务器就会停止服务。
nexus.vmoptions配置文件内容如下:
如果8081端口被占用需要修改nexus端口号,进入nexus工作目录(sonatype-work)
下的etc目录
,修改nexus.properties
中的端口号即可。
4、测试nexus服务器是否启动成功(nexus默认端口号是8081)
浏览器访问:http://localhost:8081
默认是游客登录。
5、登录用户操作
- 用户名:admin
- 临时密码:在一个文件中,改完密码临时文件就消失了。
点击下一步:
修改密码为admin123:
允许匿名访问:
点击完成:
如果上面没有配置允许匿名访问,登录用户后在设置面板中也能配置允许匿名访问:
9.3 私服资源操作流程
私服是建立在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方资源(例如 阿里云镜像)。有了私服之后,当 Maven需要下载jar包时,直接请求私服即可,如果私服上有这个jar包则下载到本地仓库;否则,私服会请求外部的远程仓库,将jar包下载到私服,然后再提供给本地仓库下载。
私服仓库分类:
- 宿主仓库(hosted),用于保存自主研发+第三方资源,完成上传操作。
- 代理仓库(proxy),用于代理连接中央仓库,完成下载操作。
- 仓库组(group),为仓库编组简化下载操作,完成下载操作。
9.4 从私服中下载依赖
1、将maven的setting.xml文件备份。
2、在maven的settings.xml文件中配置镜像,将之前配置的阿里云镜像注释掉。
<!--自定义的maven私服镜像-->
<mirror>
<!--镜像的ID,叫啥都行-->
<id>nexus-aopmin</id>
<!--之前阿里云代理中央仓库central,*表示代理任意仓库镜像-->
<mirrorOf>*</mirrorOf>
<!--镜像的名字-->
<name>Nexus aopmin</name>
<!--私服仓库组位置-->
<url>http://localhost:8081/repository/maven-public/</url>
</mirror>
这样下载jar优先从私服中查找。
3、在nexus中设置允许匿名下载。
4、配置让私服去阿里云中下载依赖。(如果私服中没有对应的jar,默认会去中央仓库下载,速度很慢)
阿里云镜像地址:http://maven.aliyun.com/nexus/content/groups/public
保存配置:
5、当我们更新maven项目坐标,如果这个jar本地仓库没有,去找私服,私服要是没有,就会从阿里云同步到私服中,然后再下载到本地仓库。
私服上已经同步maven项目上所用的依赖jar包:
这时本地仓库上已经有junit4.13的jar包啦。
9.5 上传依赖到私服
上传的时候需要在本地maven的setting.xml中通过server配置远程仓库使用的用户名和密码,然后找到自己需要上传工程的pom文件,通过distributionManagement在pom中配置上传的目标仓库。
1、在私服上创建宿主仓库名字分别为:aopmin-snapshot(存放测试版依赖) 和 aopmin-release(存放正式版依赖)
2、将我们新建的仓库加入仓库组中,这样别人下载的才方便。
将新建的仓库加到maven-public组中:(maven-public是私服的仓库组)
3、配置本地仓库访问私服的权限(在maven的settings.xml的servers标签中配置)
<!--配置本地仓库访问私服的权限-->
<server>
<!--id任意,多个server的id不重复就行,后面会用到-->
<id>aopmin-snapshot</id>
<username>admin</username>
<password>admin123</password><!--填写自己nexus设定的登录密码-->
</server>
<server>
<!--id任意,多个server的id不重复就行,后面会用到-->
<id>aopmin-release</id>
<username>admin</username>
<password>admin123</password><!--填写自己nexus设定的登录密码-->
</server>
4、配置当前项目访问私服上传资源的保存位置(项目的pom.xml文件中配置或者直接在父工程中配)
<!-- 定义snapshots库和releases库的nexus私服地址 -->
<distributionManagement>
<!--正式版本的仓库-->
<repository>
<!--和maven/settings.xml中server中的id一致,表示使用该id对应的用户名和密码-->
<id>aopmin-release</id>
<!--如果jar的版本是release版本,那么就上传到这个仓库,根据自己情况修改-->
<url>http://localhost:8081/repository/aopmin-release/</url>
</repository>
<!--快照版本的仓库-->
<snapshotRepository>
<!--和maven/settings.xml中server中的id一致,表示使用该id对应的用户名和密码-->
<id>aopmin-snapshot</id>
<!--如果jar的版本是snapshot版本,那么就上传到这个仓库,根据自己情况修改-->
<url>http://localhost:8081/repository/aopmin-snapshot/</url>
</snapshotRepository>
</distributionManagement>
注意:pom中配置私服仓库的id值要和maven的settings.xml中<server>
—> <id>aopmin-xxx</id>
对应。
5、使用命令将项目发布到私服
mvn deploy
使用maven-helper插件,将ssm_pojo发布到私服中:
发布成功后,查看私服上创建的宿主仓库里的依赖以及maven坐标:
ok已经成功将我们的项目发布到私服仓库中啦。
如果别人想用这个jar包,导入这个依赖的maven坐标即可。
<dependency>
<groupId>com.baidou</groupId>
<artifactId>ssm_pojo</artifactId>
<version>1.0-20221224.171024-1</version>
</dependency>
9.6 关闭nexus私服
将启动nexus服务的黑窗口关掉即可。