聚合工程的微服务之父pom配置

发布时间 2023-11-25 11:09:12作者: 吃不胖的帅哥

1、属性配置

    <!-- 属性配置 -->
    <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>
        <!-- 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版本的构件 -->
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>
    <!-- pluginRepositories:插件仓库,用于配置当前项目所用插件的远程仓库地址,针对的是maven命令需要的插件(比如clean、install)-->
    <pluginRepositories>
        <pluginRepository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>https://maven.aliyun.com/repository/public</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <!-- 告诉Maven不要从这个仓库下载snapshot版本的构件,禁止从公共仓库下载snapshot构件是推荐的做法,因为这些构件不稳定,且不受你控制,你应该避免使用。当然,如果你想使用局域网内组织内部的仓库,你可以激活snapshot的支持 -->
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>