聚合工程的微服务之父pom配置
1、属性配置
<!-- 属性配置,集中管理jar包版本,进行自定义标签 -->
<properties>
<!-- 关掉单元测试,否则在打包的时候会执行单元测试 -->
<skipTests>true</skipTests>
<!-- 项目构建时源码的编码方式 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 报告输出文件的字符编码 -->
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- 编译时的编码; 否则在DOS下运行mvn compile命令时会出现莫名的错误,因为系统默认使用GBK编码,如果不在dos下执行mvn compile命令,可以不用配置-->
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<!-- 项目编译使用jdk版本,设置输入源码的jdk为 1.8 -->
<maven.compiler.source>1.8</maven.compiler.source>
<!-- 项目编译使用jdk版本,设置编译输出的字节码的jdk为 1.8 -->
<maven.compiler.target>1.8</maven.compiler.target>
<!-- SpringBoot 版本号 -->
<spring-boot.version>2.7.13</spring-boot.version>
<!-- spring-cloud 版本号 -->
<spring-cloud.version>2021.0.8</spring-cloud.version>
<!-- spring-cloud-alibaba 版本号 -->
<spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
</properties>
2、依赖声明
<!-- 依赖声明 -->
<dependencyManagement>
<dependencies>
<!-- SpringCloud 微服务依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<!-- <scope>import</scope> 和 <type>pom</type>作用:该pom中dependencyManagement就会包含导入的spring-cloud-dependencies中dependencyManagement里的所有dependency,为了解决pom类型的父工程Maven依赖单继承问题,可以导入其它工程pom中的dependencyManagement。-->
<!-- 此依赖包的类型,默认为jar,这里改为pom,表示为Maven项目模块,即这个依赖不是一个可执行的Java应用程序或库,而是一个纯粹的Maven项目模块,它不会生成任何构建产物,只用于管理依赖关系。-->
<type>pom</type>
<!--此依赖包的使用范围,默认为compile,表示为当前依赖参与项目的编译、测试和运行阶段,属于强依赖,打包之时会打到包里去。-->
<!--scope值为import:表示该依赖项只用于管理子模块的依赖关系,不会被子模块添加使用(不会被打到子模块包里去),避免不必要的依赖项被打包进去,减小打包文件的大小。主要作用就是导入其它工程pom中的dependencyManagement-->
<!--import这个是maven2.0.9版本后出的属性,import只能在<dependencyManagement>下使用并且必须声明类型type为pom。-->
<scope>import</scope>
</dependency>
<!-- SpringCloud Alibaba 微服务依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- SpringBoot 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- hutool工具包-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.23</version>
</dependency>
</dependencies>
</dependencyManagement>
type值有jar、war、pom 3种,默认为jar,对应pom.xml文件中的packaging,将Maven项目的packing元素设为pom,表示这个项目不是一个可执行的Java应用程序或库,而是一个纯粹的Maven项目模块,它不会生成任何构建产物,只用于管理依赖关系。
scope代表依赖包的使用范围,默认为compile,表示为当前依赖参与项目的编译、测试和运行阶段,属于强依赖,打包之时会打到包里去。import 这个是maven2.0.9版本后出的属性,import只能在dependencyManagement中使用,能解决maven依赖单继承问题,import依赖关系实际上并不参与限制依赖关系的传递性。
当一个父pom中的 dependencyManagement 标签中需要导入另一个工程pom中的dependencyManagement的时候,必须同时使用<scope>import</scope>
和 <type>pom</type>
。
注意: dependencyManagement只在父工程(即pom类型的maven工程)中声明,这样在子工程中定义无需声明版本从而生效。如果在jar类型的maven工程中添加了dependencyManagement,是没有意义的。
好处: 当我们需要引入很多 jar 包的时候,会导致 pom.xml 文件过大,这个时候我们引进来一个 type 为 pom 的dependency,意味着我们可以将所有的 jar 包打包成一个 pom类型的dependency,然后我们依赖了该dependency,即可以下载下来该dependency下的所有依赖的 jar 包。
3、依赖管理
<!-- 依赖管理 -->
<dependencies>
<!-- 添加lombok依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<!-- provided:只能作用在编译和测试阶段,同时没有传递性。-->
<scope>provided</scope>
</dependency>
<dependency>
<!--配置处理器,如果不加这个,在properties文件中(比如SmsProperties)会报Spring Boot Configuration Annotation Processor not configured错误-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<!-- bootstrap 启动器,在SpringBoot 2.4.x的版本之后,对于bootstrap.properties或者bootstrap.yaml配置文件(我们合起来成为Bootstrap配置文件)的支持,需要导入如下的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
</dependencies>
4、build配置
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<!-- 在原始Maven打包形成的jar包基础上,进行重新打包,新形成的jar包不但包含应用类文件和配置文件,而且还会包含应用所依赖的jar包以及Springboot启动相关类(loader等),防止有些文件打包不进去。-->
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
5、在当前项目中配置使用独立的Maven远程仓库
<!-- repositories:远程仓库,用于配置当前项目下载依赖的Maven远程仓库地址,希望在当前项目中使用独立的Maven远程仓库,只对当前Maven项目有效。 -->
<repositories>
<repository>
<id>public</id>
<name>aliyun nexus</name>
<url>https://maven.aliyun.com/repository/public</url>
<!-- 告诉Maven可以从这个仓库下载releases版本的构件,不设置默认为true。 -->
<releases>
<!-- true或者false表示该仓库是否可下载某种类型构件(发布版,快照版)。 -->
<enabled>true</enabled>
</releases>
<!-- 告诉Maven不要从这个仓库下载snapshot版本的构件,禁止从公共仓库下载snapshot构件是推荐的做法,因为这些构件不稳定,且不受你控制,你应该避免使用。当然如果你想使用局域网内组织内部的仓库,你可以激活snapshot的支持 -->
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<!-- pluginRepositories:插件仓库,用于配置当前项目所用插件的远程仓库地址,针对的是maven命令需要的插件(比如clean、install)-->
<pluginRepositories>
<pluginRepository>
<id>public</id>
<name>aliyun nexus</name>
<url>https://maven.aliyun.com/repository/public</url>
<!-- 告诉Maven可以从这个仓库下载releases版本的构件,不设置默认为true。 -->
<releases>
<enabled>true</enabled>
</releases>
<!-- 告诉Maven不要从这个仓库下载snapshot版本的构件,不设置默认为true。-->
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>