Maven是一个强大的项目管理和构建工具,它能够简化Java项目的构建、依赖管理和发布过程。以下是Maven的一些主要特点和功能:
标准化项目结构:
标准化构建流程:
依赖管理:
使用maven前:
使用maven后:
Apache Maven是一个开源的项目管理和构建工具,它是由Apache软件基金会开发和维护的。Maven使用基于项目对象模型(Project Object Model,简称POM)的概念来管理项目,并提供了一套规范和工具来支持项目的构建、依赖管理和发布.
Maven的项目对象模型(Project Object Model,简称POM)是一种XML文件,用于描述和定义Maven项目的结构、依赖关系、构建配置等信息。每个Maven项目都有一个对应的POM文件,位于项目根目录下,文件名为pom.xml
POM文件包含了以下主要元素:
通过POM文件,Maven可以理解项目的结构和依赖关系,以及如何进行构建和发布。开发人员可以在POM文件中声明和管理项目的各种属性和配置,使得项目的构建和管理更加简单和可控。
POM文件还支持继承机制,可以通过父子模块关系实现项目间的代码复用和依赖管理。子模块的POM文件可以继承父模块的配置,同时可以覆盖或添加自己特定的配置。
•仓库分类:
本地仓库:自己计算机上的一个目录
中央仓库:由Maven团队维护的全球唯一的仓库
•地址:https://repo1.maven.org/maven2/
远程仓库(私服):一般由公司团队搭建的私有仓库
当项目中使用坐标引入对应依赖jar包后,首先会查找本地仓库中是否有对应的jar包:如果有,则在项目直接引用; 如果没有,则去中央仓库中下载对应的jar包到本地仓库。还可以搭建远程仓库,将来jar包的查找顺序则变为:本地仓库 -> 远程仓库 ->中央仓库
maven的配置文件: conf/setting.xml
<!--配置本地仓库的地址-->
<localRepository>D:\repository</localRepository>
<!--中央仓库的镜像的配置-->
<mirrors>
<!--设置阿里云镜像-->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
<profiles>
<!--设置maven编译的jdk的版本-->
<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>
在idea的setting选项中:
使用本地上安装并且配置好的maven;
使用本地配置好的maven配置文件;
使用本地仓库;
在setting中配置完maven后, 需要在New Projects Setup中也配置一下, 否则每次新建项目都需要重新配置maven
compile :编译 clean:清理 test:测试 package:打包 install:安装
Maven 构建项目生命周期描述的是一次构建过程经历经历了多少个事件;
Maven 对项目构建的生命周期划分为3套
clean:清理工作:
default:核心工作,例如编译,测试,打包,安装等
site:产生报告,发布站点等
validate(校验) 校验项目是否正确并且所有必要的信息可以完成项目的构建过程。
initialize(初始化) 初始化构建状态,比如设置属性值。
generate-sources(生成源代码) 生成包含在编译阶段中的任何源代码。
process-sources(处理源代码) 处理源代码,比如说,过滤任意值。
generate-resources(生成资源文件) 生成将会包含在项目包中的资源文件。
process-resources (处理资源文件) 复制和处理资源到目标目录,为打包阶段最好准备。
compile(编译) 编译项目的源代码。
process-classes(处理类文件) 处理编译生成的文件,比如说对Java class文件做字节码改善优化。
generate-test-sources(生成测试源代码) 生成包含在编译阶段中的任何测试源代码。
process-test-sources(处理测试源代码) 处理测试源代码,比如说,过滤任意值。
generate-test-resources(生成测试资源文件) 为测试创建资源文件。
process-test-resources(处理测试资源文件) 复制和处理测试资源到目标目录。
test-compile(编译测试源码) 编译测试源代码到测试目标目录.
process-test-classes(处理测试类文件) 处理测试源码编译生成的文件。
test(测试) 使用合适的单元测试框架运行测试(Juint是其中之一)。
prepare-package(准备打包) 在实际打包之前,执行任何的必要的操作为打包做准备。
package(打包) 将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。
pre-integration-test(集成测试前) 在执行集成测试前进行必要的动作。比如说,搭建需要的环境。
integration-test(集成测试) 处理和部署项目到可以运行集成测试环境中。
post-integration-test(集成测试后) 在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。
verify (验证) 运行任意的检查来验证项目包有效且达到质量标准。
install(安装) 安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。
deploy(部署) 将最终的项目包复制到远程仓库中与其他开发者和项目共享。
Maven中每个项目都有一个坐标, 只有
什么是坐标?
Maven 中的坐标是资源的唯一标识
使用坐标来定义项目或引入项目中需要的依赖
Maven 坐标主要组成
groupId:定义当前Maven项目隶属组织名称(通常是域名反写,例如:com.itheima)
artifactId:定义当前Maven项目名称(通常是模块名称,例如 order-service、goods-service)
version:定义当前项目版本号
pom.xml文件中
单个的依赖信息是
<!--设置maven的依赖管理-->
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.3</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.3</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.8</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.6</version>
</dependency>
</dependencies>
POM文件修改后, 需要重新加载maven项目;
在Maven中,packaging是用来指定项目打包的类型。它定义了项目构建后生成的最终产物的格式和类型。
常见的几种packaging类型包括:
<!--设置项目的打包类型 web需用tomcat的是war -->
<packaging>war</packaging>
在Maven中,依赖的可传递性是指当一个项目依赖于其他项目时,是否会自动引入这些被依赖项目所声明的依赖项。
默认情况下,Maven启用了依赖的传递性。也就是说,如果项目A依赖于项目B,而项目B又依赖于项目C,那么项目A将会自动引入项目B和项目C的依赖项。
依赖传递冲突问题:
路径优先:当依赖中出现相同的资源时,层级越深,优先级越低,层级越浅,优先级越高
声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
特殊优先:当同级配置了相同资源的不同版本,后配置的覆盖先配置的
1)添加项目的war到tomcat中;
2)运行tomcat
3)部署当前项目(会自动运行maven指令, 生成target文件夹和打包的项目)
当导入依赖spring-webmvc时, 由于spring-webmvc会依赖其他的相关依赖, 所以同时也会导入其他依赖, 利用
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.3</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
</exclusions>
</dependency>
引入依赖后, 可以使用scope对该依赖的有效范围进行设置;
scope取值 | 有效范围(compile, runtime, test) | 依赖传递 | 例子 |
compile | all | 是 | spring-core |
provided | compile, test | 否 | servlet-api |
runtime | runtime, test | 是 | JDBC驱动 |
test | test | 否 | JUnit |
system | compile, test | 是 |
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
在Maven中,Optional是一个用于指定依赖项的元数据标记。它提供了一种机制,用于在构建项目时指定某个依赖项是否是可选的。
当Optional设置为true时, 表示依赖为可选; 默认为false, 表示依赖为不可选;
当依赖设置为可选时,只有在项目明确声明需要这个依赖时,它才会被包含在构建中。换句话说,可选依赖不会隐式传递到依赖于当前项目的其他项目中;
例如1: 假设我们正在开发一个名为library-a的库,它依赖于另一个名为library-b的库。然而,library-b有一些我们并不需要的依赖项。为了避免这些不必要的依赖项传递给使用library-a的项目,我们可以将它们设置为可选。
library-a.xml
<dependency>
<groupId>com.example</groupId>
<artifactId>library-b</artifactId>
<version>1.0.0</version>
<optional>true</optional>
</dependency>
例如2: 一个日志库可能支持多种日志框架,但我们希望让用户选择他们要使用的框架,而不是强制将所有可能的依赖项包含在构建中。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.30</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.30</version>
<optional>true</optional>
</dependency>
slf4j-api是必需的依赖项,而slf4j-simple和slf4j-log4j12是可选的。使用我们的日志库的项目用户可以根据需要选择要使用的日志框架;
总之,Maven Optional依赖提供了一种灵活的方式来管理项目的依赖关系。通过将某些依赖项设置为可选,我们可以精简依赖传递、避免依赖冲突,以及减少构建大小。此外,Optional依赖还可以帮助我们实现可插拔的功能和支持可选的扩展模块,使我们的库更加灵活和易于使用
在Maven中,type是用来指定依赖项的类型的属性。它用于区分不同类型的依赖项,例如JAR文件、WAR文件、POM文件等。
type属性对于Maven来说是很重要的,因为它可以告诉Maven如何处理这个依赖项。当你在pom.xml文件中声明一个依赖项时,可以使用type属性来显式地指定该依赖项的类型。
常见的几种依赖项类型包括:
通过使用type属性,你可以明确指定依赖项的类型,以便Maven在构建和部署过程中正确地处理它们。这有助于确保项目正确地引入和使用所需的依赖项,并且避免混淆和错误。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.11</version>
<type>pom</type>
</dependency>
在Maven中,继承是一种机制,允许创建一个父项目(也称为聚合项目)来共享和管理子项目的配置信息。通过继承关系,子项目可以继承和覆盖父项目的设置,从而避免重复配置。
实现继承的方式是通过在子项目的pom.xml文件中使用
<parent>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
</parent>
父项目的坐标(groupId、artifactId和version)会被显式地指定在子项目中, 子类项目就不用再设置groupId、artifactId;
在继承关系中,子项目可以覆盖或添加属性、依赖、插件和插件配置等。通过在子项目中声明相同的元素,子项目可以覆盖父项目中相应元素的值或配置。
在继承关系中,通常会将各个理, 那么所有的子类项目在按需使用这些依赖时, 就不需要再指定版本, 这样可以避免各个依赖之间的版本冲突等, 也简化了很多代码;
继承关系可以帮助简化项目的配置和管理。当有多个项目共享相同的配置或依赖关系时,可以将这些设置提取到父项目中,以减少冗余和重复的配置。
|
在进行依赖的版本管理时, 使用
就是创建普通的maven项目, 然后设置pom.xml文件中的
在父类项目的pom.xml文件中加入依赖的版本管理信息;
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 所有依赖的版本 -->
<spring-version>5.3.3</spring-version>
<mybatis-version>3.5.6</mybatis-version>
<mybatis-spring-version>2.0.5</mybatis-spring-version>
<jackson-version>2.11.2</jackson-version>
<mysql-version>8.0.20</mysql-version>
<druid-version>1.1.20</druid-version>
<hibernate-validator-version>6.0.20.Final</hibernate-validator-version>
<validation-api-version>2.0.1.Final</validation-api-version>
<commons-io-version>1.3.2</commons-io-version>
<commons-fileupload-version>1.3.2</commons-fileupload-version>
<pagehelper-version>5.2.0</pagehelper-version>
</properties>
<dependencyManagement>
<dependencies>
<!-- 上传-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload-version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io-version}</version>
</dependency>
<!-- 数据校验 -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>${validation-api-version}</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>${hibernate-validator-version}</version>
</dependency>
<!--分页-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>${pagehelper-version}</version>
</dependency>
<!--连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid-version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-version}</version>
</dependency>
<!--json-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson-version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson-version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson-version}</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring-version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis-version}</version>
</dependency>
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring-version}</version>
</dependency>
</dependencies>
</dependencyManagement>
2)创建子类项目
按照上图分别创建ssm-common, ssm-dao,ssm-pojo,ssm-service,ssm-web等5个子类项目;
ssm-web的pom.xml
依赖ssm-service项目, ssm-service项目的依赖也会传递到ssm-web中;
<parent>
<groupId>cn.guotu</groupId>
<artifactId>ssm-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>cn.guotu</groupId>
<artifactId>ssm-service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
ssm-service的pom.xml
添加的spring-webmvc依赖无需设置版本号;
<dependencies>
<dependency>
<groupId>cn.guotu</groupId>
<artifactId>ssm-dao</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
</dependencies>
所有的配置文件都放在web项目中:
3)编写完成各个子类项目后, 部署web项目到tomcat运行;
略