Maven - Maven 核心概念一网打尽:轻松掌握项目构建与管理技巧

在这里插入图片描述

基本信息

仓库信息

在这里插入图片描述

Maven 中引入了仓库的概念,开发人员将所编写的 JAR 按照相应格式推送到仓库中。

其他开发者需要引用这个 jar 包时,在工程中引用相应依赖,则会先从本地仓库进行下载。对于部分组织或机构,通常会在此基础上额外搭建私人仓库。

在引用依赖时会先从私人仓库进行读取,如果未找到再从中央仓库下载至私人仓库,最后再下载到本地仓库。

通过这种方式开发者则无需再手动管理繁杂的项目 JAR 包,从而实现更高的效率。

配置信息

一个最基本的 Maven 项目通常应包含如下内容,当我们引用一个模块时,也是通过 groupId、 artifactId、 version AVG 三项内容进行确定

groupId 通常为组织或公司域名反写。

artifactId 项目的名称。

version 项目的版本信息

name 项目的简称

description 项目的简要描述

举个例子

在这里插入图片描述

依赖管理

依赖引入

通过 dependencies 标签我们即可导入所需要的工程依赖。

代码语言:javascript
复制
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
        <version>xxxx</version>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
</dependencies>

其中

compile 编译时需要用到该 JAR 包(默认)

runtime 编译时不需要,但运行时需要用到。

provided 编译时需要用到,但运行时由 JDK 或某个服务器提供。

test 编译Test时需要用到该 JAR 包。

optional 标签禁用依赖传递


间接依赖

当项目需要引用到其它依赖时,只需指定所依赖的工程的基本信息即可,剩下的一切都交给 Maven 处理。即便是所要依赖的工程依赖了其它工程,我们也只需引入项目所直接的依赖的工程。

在这里插入图片描述

依赖顺序

在 maven 工程中遵循先定义先导入的原则,即当存在多个相同间接依赖,优先导入其父依赖定义在前的简洁依赖。

举个例子,如工程中引入 Dependency-ADependency-B 两个依赖,二者又分别引用了不同版本的 Dependency-C ,但对于 Maven 而言最终编译时同一个依赖即便是不同的版本也只会选择一份。

在这里插入图片描述

其计算规则如下:若 Dependency-A 定义在 Dependency-B 之前则最终将导入 Dependency-A 中的 C-1.0 版本。

而在右侧图例中虽然 Dependency-A 引入优先级高于 Dependency-B ,但是 C-2.0 的间接依赖层级高于 C-1.0,因此将导入 C-2.0 版本。


依赖排除

在引用多个模块时可能会发生版本兼容冲突问题,通过 excludes 标签即可实现依赖排除。

在工程中引入了 demo-a 依赖,但其又引用 dependency-b 依赖,如想要在当前工程中移除 dependency-b 依赖,此时即可通过 excludes 标签将 dependency-b 排除依赖

代码语言:javascript
复制
<dependencies>
    <dependency>
        <groupId>com.artisan</groupId>
        <artifactId>demo-a</artifactId>
        <version>1.0.0</version>
        <excludes>
            <exclude>
                <groupId>com.little</groupId>
                <artifactId>dependency-b</artifactId>
                <version>1.0.0</version>
            </exclude>
        </excludes>
    </dependency>
</dependencies>

除了手动通过 excludes 标签排除依赖,被引模块也可以在导入依赖时通过 optional 标签禁用依赖传递。

上述示例中若在 demo-a 工程中引入 dependency-b 依赖时添加 optional 标签,那么其它工程在引入 demo-a 依赖时将不会将 dependency-b 作为间接依赖导入

代码语言:javascript
复制
<dependencies>
    <dependency>
        <groupId>com.little</groupId>
        <artifactId>dependency-b</artifactId>
        <version>1.0.0</version>
        <optional>true</optional>
    </dependency>
</dependencies>

变量配置

当项目中引入了大量依赖,为了方便管理通常将引入依赖的版本通过变量进行统一配置,从而实现更直观的依赖管理。

通过 properties 标签即可自定义变量配置,然后使用 ${} 引用变量

代码语言:javascript
复制
<properties>
    <mysql.version>8.0.30</mysql.version>
    <junit.version>4.13.2</junit.version>
</properties>

<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!-- 使用 "${}" 引用上述自定义变量 -->
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
</dependencies>


模块配置

当项目包含多个子项目时,通过 modules 标签即可实现模块管理。

模块管理

我们来看下nacos是如何通过modules管理子模块的

在这里插入图片描述


其中包含了 如下子模块

代码语言:javascript
复制
    <!-- Submodule management -->
<modules>
<module>config</module>
<module>core</module>
<module>naming</module>
<module>address</module>
<module>test</module>
<module>api</module>
<module>client</module>
<module>example</module>
<module>common</module>
<module>distribution</module>
<module>console</module>
<module>cmdb</module>
<module>istio</module>
<module>consistency</module>
<module>auth</module>
<module>sys</module>
</modules>

模块继承

通过 parent 即可标记当前模块的父模块,且子模块将会继承父模块中的所有依赖配置。子模块若没有指定的 groupIdversion 默认继承父模块中的配置。

其中 relativePath 用于指定父模块的 POM 文件目录,省略时默认值为 ../pom.xml 即当前目录的上一级中,若仍未找到则会在本地仓库中寻找。

我们以 nacos-naming 为例 看一下

在这里插入图片描述


关键信息如下:

代码语言:javascript
复制
 <parent>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-all</artifactId>
<version>${revision}</version>
<relativePath>../pom.xml</relativePath>
</parent>

&lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;

&lt;artifactId&gt;nacos-naming&lt;/artifactId&gt;
&lt;packaging&gt;jar&lt;/packaging&gt;

&lt;name&gt;nacos-naming ${project.version}&lt;/name&gt;
&lt;url&gt;http://nacos.io&lt;/url&gt;</code></pre></div></div><p>其中<code>parent</code>就是 根POM的 AVG信息,如下</p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:100%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1722960659790442638.png" /></div><div class="figure-desc">在这里插入图片描述</div></div></div></figure><figure class=""><hr/></figure><h2 id="6cv7i" name="%E7%BB%9F%E4%B8%80%E7%AE%A1%E7%90%86">统一管理</h2><h3 id="t6n3" name="%E4%BE%9D%E8%B5%96%E7%AE%A1%E7%90%86">依赖管理</h3><p>假如项目中包含多个模块,且多个模块引用了相同依赖时显然重复引用是不太合适的,而通过 <code>dependencyManagement</code> 即可很好的解决依赖共用的问题。</p><p>将项目依赖统一定义在父模块的 <code>dependencyManagement</code> 标签中,子模块只需继承父模块并在 <code>dependencies</code> 引入所需的依赖,便可自动读取父模块 <code>dependencyManagement</code> 所指定的版本。</p><p><code>dependencyManagement</code> 既不会在当前模块引入依赖,也不会给其子模块引入依赖,但其可以被继承的,只有在子模块下同样声明了该依赖,才会引入到模块中,子模块中只需在依赖中引入 <code>groupId</code> 与 <code>artifactId</code> 即可, 也可以指定版本则会进行覆盖。</p><p>举个例子</p><figure class=""><div class="rno-markdown-img-url" style="text-align:center"><div class="rno-markdown-img-url-inner" style="width:100%"><div style="width:100%"><img src="https://cdn.static.attains.cn/app/developer-bbs/upload/1722960660394632762.png" /></div><div class="figure-desc">在这里插入图片描述</div></div></div></figure><div class="rno-markdown-code"><div class="rno-markdown-code-toolbar"><div class="rno-markdown-code-toolbar-info"><div class="rno-markdown-code-toolbar-item is-type"><span class="is-m-hidden">代码语言:</span>javascript</div></div><div class="rno-markdown-code-toolbar-opt"><div class="rno-markdown-code-toolbar-copy"><i class="icon-copy"></i><span class="is-m-hidden">复制</span></div></div></div><div class="developer-code-block"><pre class="prism-token token line-numbers language-javascript"><code class="language-javascript" style="margin-left:0">&lt;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&gt;

<!--
~ Copyright 1999-2021 Alibaba Group Holding Ltd.
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
-->
<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">

&lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;
&lt;inceptionYear&gt;2018&lt;/inceptionYear&gt;
&lt;groupId&gt;com.alibaba.nacos&lt;/groupId&gt;
&lt;artifactId&gt;nacos-all&lt;/artifactId&gt;
&lt;version&gt;${revision}&lt;/version&gt;
&lt;packaging&gt;pom&lt;/packaging&gt;

&lt;name&gt;Alibaba NACOS ${project.version}&lt;/name&gt;
&lt;description&gt;Top Nacos project pom.xml file&lt;/description&gt;
&lt;url&gt;http://nacos.io&lt;/url&gt;
&lt;prerequisites&gt;
    &lt;maven&gt;3.2.5&lt;/maven&gt;
&lt;/prerequisites&gt;

&lt;scm&gt;
    &lt;url&gt;git@github.com:alibaba/nacos.git&lt;/url&gt;
    &lt;connection&gt;scm:git@github.com:alibaba/nacos.git&lt;/connection&gt;
    &lt;developerConnection&gt;scm:git@github.com:alibaba/nacos.git&lt;/developerConnection&gt;
    &lt;tag&gt;nacos-all-${revision}&lt;/tag&gt;
&lt;/scm&gt;

&lt;mailingLists&gt;
    &lt;mailingList&gt;
        &lt;name&gt;Development List&lt;/name&gt;
        &lt;subscribe&gt;dev-nacos+subscribe@googlegroups.com&lt;/subscribe&gt;
        &lt;unsubscribe&gt;dev-nacos+unsubscribe@googlegroups.com&lt;/unsubscribe&gt;
        &lt;post&gt;dev-nacos@googlegroups.com&lt;/post&gt;
    &lt;/mailingList&gt;
    &lt;mailingList&gt;
        &lt;name&gt;User List&lt;/name&gt;
        &lt;subscribe&gt;users-nacos+subscribe@googlegroups.com&lt;/subscribe&gt;
        &lt;unsubscribe&gt;users-nacos+unsubscribe@googlegroups.com&lt;/unsubscribe&gt;
        &lt;post&gt;users-nacos@googlegroups.com&lt;/post&gt;
    &lt;/mailingList&gt;
    &lt;mailingList&gt;
        &lt;name&gt;Commits List&lt;/name&gt;
        &lt;subscribe&gt;commits-nacos+subscribe@googlegroups.com&lt;/subscribe&gt;
        &lt;unsubscribe&gt;commits-nacos+unsubscribe@googlegroups.com&lt;/unsubscribe&gt;
        &lt;post&gt;commits-nacos@googlegroups.com&lt;/post&gt;
    &lt;/mailingList&gt;
&lt;/mailingLists&gt;

&lt;developers&gt;
    &lt;developer&gt;
        &lt;id&gt;Alibaba Nacos&lt;/id&gt;
        &lt;name&gt;Nacos&lt;/name&gt;
        &lt;url&gt;http://nacos.io&lt;/url&gt;
        &lt;email&gt;nacos_dev@linux.alibaba.com&lt;/email&gt;
    &lt;/developer&gt;
&lt;/developers&gt;

&lt;licenses&gt;
    &lt;license&gt;
        &lt;name&gt;Apache License, Version 2.0&lt;/name&gt;
        &lt;url&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/url&gt;
        &lt;distribution&gt;repo&lt;/distribution&gt;
    &lt;/license&gt;
&lt;/licenses&gt;

&lt;organization&gt;
    &lt;name&gt;Alibaba Group&lt;/name&gt;
    &lt;url&gt;https://github.com/alibaba&lt;/url&gt;
&lt;/organization&gt;

&lt;issueManagement&gt;
    &lt;system&gt;github&lt;/system&gt;
    &lt;url&gt;https://github.com/alibaba/nacos/issues&lt;/url&gt;
&lt;/issueManagement&gt;

&lt;properties&gt;
    &lt;revision&gt;2.1.0-SNAPSHOT&lt;/revision&gt;
    &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;
    &lt;project.reporting.outputEncoding&gt;UTF-8&lt;/project.reporting.outputEncoding&gt;
    &lt;!-- Compiler settings properties --&gt;
    &lt;maven.compiler.source&gt;1.8&lt;/maven.compiler.source&gt;
    &lt;maven.compiler.target&gt;1.8&lt;/maven.compiler.target&gt;
    &lt;!-- Maven properties --&gt;
    &lt;maven.test.skip&gt;false&lt;/maven.test.skip&gt;
    &lt;maven.javadoc.skip&gt;true&lt;/maven.javadoc.skip&gt;
    &lt;sonar.java.coveragePlugin&gt;jacoco&lt;/sonar.java.coveragePlugin&gt;
    &lt;!-- Exclude all generated code --&gt;
    &lt;sonar.jacoco.itReportPath&gt;${project.basedir}/../test/target/jacoco-it.exec&lt;/sonar.jacoco.itReportPath&gt;
    &lt;sonar.exclusions&gt;file:**/generated-sources/**,**/test/**&lt;/sonar.exclusions&gt;
    
    &lt;!-- plugin version --&gt;
    &lt;versions-maven-plugin.version&gt;2.2&lt;/versions-maven-plugin.version&gt;
    &lt;dependency-mediator-maven-plugin.version&gt;1.0.2&lt;/dependency-mediator-maven-plugin.version&gt;
    &lt;clirr-maven-plugin.version&gt;2.7&lt;/clirr-maven-plugin.version&gt;
    &lt;maven-enforcer-plugin.version&gt;1.4.1&lt;/maven-enforcer-plugin.version&gt;
    &lt;maven-compiler-plugin.version&gt;3.5.1&lt;/maven-compiler-plugin.version&gt;
    &lt;maven-javadoc-plugin.version&gt;2.10.4&lt;/maven-javadoc-plugin.version&gt;
    &lt;maven-source-plugin.version&gt;3.0.1&lt;/maven-source-plugin.version&gt;
    &lt;maven-pmd-plugin.version&gt;3.8&lt;/maven-pmd-plugin.version&gt;
    &lt;apache-rat-plugin.version&gt;0.12&lt;/apache-rat-plugin.version&gt;
    &lt;maven-resources-plugin.version&gt;3.0.2&lt;/maven-resources-plugin.version&gt;
    &lt;coveralls-maven-plugin.version&gt;4.3.0&lt;/coveralls-maven-plugin.version&gt;
    &lt;jacoco-maven-plugin.version&gt;0.7.8&lt;/jacoco-maven-plugin.version&gt;
    &lt;maven-surefire-plugin.version&gt;2.20&lt;/maven-surefire-plugin.version&gt;
    &lt;findbugs-maven-plugin.version&gt;3.0.4&lt;/findbugs-maven-plugin.version&gt;
    &lt;sonar-maven-plugin.version&gt;3.0.2&lt;/sonar-maven-plugin.version&gt;
    &lt;maven-gpg-plugin.version&gt;1.6&lt;/maven-gpg-plugin.version&gt;
    &lt;maven-failsafe-plugin.version&gt;2.19.1&lt;/maven-failsafe-plugin.version&gt;
    &lt;maven-assembly-plugin.version&gt;3.0.0&lt;/maven-assembly-plugin.version&gt;
    &lt;maven-checkstyle-plugin.version&gt;3.1.2&lt;/maven-checkstyle-plugin.version&gt;
    &lt;maven-flatten-version&gt;1.1.0&lt;/maven-flatten-version&gt;
    &lt;!-- dependency version related to plugin --&gt;
    &lt;extra-enforcer-rules.version&gt;1.0-beta-4&lt;/extra-enforcer-rules.version&gt;
    &lt;p3c-pmd.version&gt;1.3.0&lt;/p3c-pmd.version&gt;
    
    &lt;!-- dependency version --&gt;
    &lt;spring-boot-dependencies.version&gt;2.1.17.RELEASE&lt;/spring-boot-dependencies.version&gt;
    &lt;servlet-api.version&gt;3.0&lt;/servlet-api.version&gt;
    &lt;commons-io.version&gt;2.7&lt;/commons-io.version&gt;
    &lt;commons-collections.version&gt;3.2.2&lt;/commons-collections.version&gt;
    &lt;commons-logging.version&gt;1.2&lt;/commons-logging.version&gt;
    &lt;commons-dbcp.version&gt;1.4&lt;/commons-dbcp.version&gt;
    &lt;commons-cli.version&gt;1.2&lt;/commons-cli.version&gt;
    &lt;slf4j-api.version&gt;1.7.7&lt;/slf4j-api.version&gt;
    &lt;logback.version&gt;1.2.9&lt;/logback.version&gt;
    &lt;log4j.version&gt;2.17.1&lt;/log4j.version&gt;
    
    &lt;httpasyncclient.version&gt;4.1.3&lt;/httpasyncclient.version&gt;
    &lt;mysql-connector-java.version&gt;8.0.21&lt;/mysql-connector-java.version&gt;
    &lt;derby.version&gt;10.14.2.0&lt;/derby.version&gt;
    &lt;cglib-nodep.version&gt;2.1&lt;/cglib-nodep.version&gt;
    &lt;jcip-annotations.version&gt;1.0&lt;/jcip-annotations.version&gt;
    &lt;jackson-core.version&gt;2.12.2&lt;/jackson-core.version&gt;
    &lt;jackson-databind.version&gt;2.12.2&lt;/jackson-databind.version&gt;
    &lt;jackson.annotations.version&gt;2.12.2&lt;/jackson.annotations.version&gt;
    &lt;jackson-core-asl.version&gt;1.9.13&lt;/jackson-core-asl.version&gt;
    &lt;jjwt.version&gt;0.11.2&lt;/jjwt.version&gt;
    &lt;netty-all.version&gt;4.1.59.Final&lt;/netty-all.version&gt;
    &lt;mina-core.version&gt;2.0.0-RC1&lt;/mina-core.version&gt;
    &lt;guava.version&gt;30.1-jre&lt;/guava.version&gt;
    &lt;javatuples.version&gt;1.2&lt;/javatuples.version&gt;
    &lt;commonOkHttp.version&gt;0.4.1&lt;/commonOkHttp.version&gt;
    &lt;grpc-java.version&gt;1.24.0&lt;/grpc-java.version&gt;
    &lt;proto-google-common-protos.version&gt;1.17.0&lt;/proto-google-common-protos.version&gt;
    &lt;protobuf-java.version&gt;3.16.1&lt;/protobuf-java.version&gt;
    &lt;protoc-gen-grpc-java.version&gt;1.24.0&lt;/protoc-gen-grpc-java.version&gt;
    &lt;hessian.version&gt;4.0.63&lt;/hessian.version&gt;
    &lt;reflections.version&gt;0.9.11&lt;/reflections.version&gt;
    &lt;mockito-all.version&gt;1.10.19&lt;/mockito-all.version&gt;
    &lt;mockito-core.version&gt;3.8.0&lt;/mockito-core.version&gt;
    &lt;hamcrest-all.version&gt;1.3&lt;/hamcrest-all.version&gt;
    &lt;prometheus-simpleclient.version&gt;0.5.0&lt;/prometheus-simpleclient.version&gt;
    &lt;tomcat-embed-jasper.version&gt;9.0.40&lt;/tomcat-embed-jasper.version&gt;
    &lt;truth.version&gt;0.30&lt;/truth.version&gt;
    &lt;HikariCP.version&gt;3.4.2&lt;/HikariCP.version&gt;
    &lt;jraft-core.version&gt;1.3.8&lt;/jraft-core.version&gt;
    &lt;rpc-grpc-impl.version&gt;1.3.8&lt;/rpc-grpc-impl.version&gt;
&lt;/properties&gt;
&lt;!-- == --&gt;
&lt;!-- =========================================================Build plugins================================================ --&gt;
&lt;!-- == --&gt;
&lt;build&gt;
    &lt;plugins&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
            &lt;artifactId&gt;versions-maven-plugin&lt;/artifactId&gt;
            &lt;version&gt;${versions-maven-plugin.version}&lt;/version&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;com.github.vongosling&lt;/groupId&gt;
            &lt;artifactId&gt;dependency-mediator-maven-plugin&lt;/artifactId&gt;
            &lt;version&gt;${dependency-mediator-maven-plugin.version}&lt;/version&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
            &lt;artifactId&gt;clirr-maven-plugin&lt;/artifactId&gt;
            &lt;version&gt;${clirr-maven-plugin.version}&lt;/version&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
            &lt;artifactId&gt;maven-enforcer-plugin&lt;/artifactId&gt;
            &lt;version&gt;${maven-enforcer-plugin.version}&lt;/version&gt;
            &lt;executions&gt;
                &lt;execution&gt;
                    &lt;id&gt;enforce-ban-circular-dependencies&lt;/id&gt;
                    &lt;goals&gt;
                        &lt;goal&gt;enforce&lt;/goal&gt;
                    &lt;/goals&gt;
                &lt;/execution&gt;
            &lt;/executions&gt;
            &lt;configuration&gt;
                &lt;rules&gt;
                    &lt;banCircularDependencies/&gt;
                &lt;/rules&gt;
                &lt;fail&gt;true&lt;/fail&gt;
            &lt;/configuration&gt;
            &lt;dependencies&gt;
                &lt;dependency&gt;
                    &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
                    &lt;artifactId&gt;extra-enforcer-rules&lt;/artifactId&gt;
                    &lt;version&gt;${extra-enforcer-rules.version}&lt;/version&gt;
                &lt;/dependency&gt;
            &lt;/dependencies&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
            &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;
            &lt;version&gt;${maven-compiler-plugin.version}&lt;/version&gt;
            &lt;configuration&gt;
                &lt;source&gt;${maven.compiler.source}&lt;/source&gt;
                &lt;target&gt;${maven.compiler.target}&lt;/target&gt;
                &lt;compilerVersion&gt;${maven.compiler.source}&lt;/compilerVersion&gt;
                &lt;showDeprecation&gt;true&lt;/showDeprecation&gt;
                &lt;showWarnings&gt;true&lt;/showWarnings&gt;
            &lt;/configuration&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
            &lt;artifactId&gt;maven-javadoc-plugin&lt;/artifactId&gt;
            &lt;version&gt;${maven-javadoc-plugin.version}&lt;/version&gt;
            &lt;configuration&gt;
                &lt;charset&gt;UTF-8&lt;/charset&gt;
            &lt;/configuration&gt;
            &lt;executions&gt;
                &lt;execution&gt;
                    &lt;id&gt;attach-javadocs&lt;/id&gt;
                    &lt;goals&gt;
                        &lt;goal&gt;jar&lt;/goal&gt;
                    &lt;/goals&gt;
                &lt;/execution&gt;
            &lt;/executions&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
            &lt;artifactId&gt;maven-source-plugin&lt;/artifactId&gt;
            &lt;version&gt;${maven-source-plugin.version}&lt;/version&gt;
            &lt;executions&gt;
                &lt;execution&gt;
                    &lt;id&gt;attach-sources&lt;/id&gt;
                    &lt;goals&gt;
                        &lt;goal&gt;jar&lt;/goal&gt;
                    &lt;/goals&gt;
                &lt;/execution&gt;
            &lt;/executions&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
            &lt;artifactId&gt;maven-pmd-plugin&lt;/artifactId&gt;
            &lt;version&gt;${maven-pmd-plugin.version}&lt;/version&gt;
            &lt;configuration&gt;
                &lt;rulesets&gt;
                    &lt;ruleset&gt;rulesets/java/ali-comment.xml&lt;/ruleset&gt;
                    &lt;ruleset&gt;rulesets/java/ali-concurrent.xml&lt;/ruleset&gt;
                    &lt;ruleset&gt;rulesets/java/ali-constant.xml&lt;/ruleset&gt;
                    &lt;ruleset&gt;rulesets/java/ali-exception.xml&lt;/ruleset&gt;
                    &lt;ruleset&gt;rulesets/java/ali-flowcontrol.xml&lt;/ruleset&gt;
                    &lt;ruleset&gt;rulesets/java/ali-naming.xml&lt;/ruleset&gt;
                    &lt;ruleset&gt;rulesets/java/ali-oop.xml&lt;/ruleset&gt;
                    &lt;ruleset&gt;rulesets/java/ali-orm.xml&lt;/ruleset&gt;
                    &lt;ruleset&gt;rulesets/java/ali-other.xml&lt;/ruleset&gt;
                    &lt;ruleset&gt;rulesets/java/ali-set.xml&lt;/ruleset&gt;
                &lt;/rulesets&gt;
                &lt;printFailingErrors&gt;true&lt;/printFailingErrors&gt;
                &lt;excludes&gt;
                    &lt;exclude&gt;**/consistency/entity/*.java&lt;/exclude&gt;
                    &lt;exclude&gt;**/istio/model/mcp/*.java&lt;/exclude&gt;
                    &lt;exclude&gt;**/istio/model/naming/*.java&lt;/exclude&gt;
                    &lt;exclude&gt;**/istio/model/*.java&lt;/exclude&gt;
                    &lt;exclude&gt;**/api/grpc/auto/*.java&lt;/exclude&gt;
                    &lt;exclude&gt;**/istio/mcp/**&lt;/exclude&gt;
                    &lt;exclude&gt;**/istio/networking/**&lt;/exclude&gt;
                    &lt;exclude&gt;**/google/protobuf/**&lt;/exclude&gt;
                &lt;/excludes&gt;
            &lt;/configuration&gt;
            &lt;executions&gt;
                &lt;execution&gt;
                    &lt;goals&gt;
                        &lt;goal&gt;check&lt;/goal&gt;
                    &lt;/goals&gt;
                &lt;/execution&gt;
            &lt;/executions&gt;
            &lt;dependencies&gt;
                &lt;dependency&gt;
                    &lt;groupId&gt;com.alibaba.p3c&lt;/groupId&gt;
                    &lt;artifactId&gt;p3c-pmd&lt;/artifactId&gt;
                    &lt;version&gt;${p3c-pmd.version}&lt;/version&gt;
                &lt;/dependency&gt;
            &lt;/dependencies&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
            &lt;artifactId&gt;maven-checkstyle-plugin&lt;/artifactId&gt;
            &lt;version&gt;${maven-checkstyle-plugin.version}&lt;/version&gt;
            &lt;configuration&gt;
                &lt;configLocation&gt;style/NacosCheckStyle.xml&lt;/configLocation&gt;
                &lt;includeTestSourceDirectory&gt;true&lt;/includeTestSourceDirectory&gt;
                &lt;encoding&gt;UTF-8&lt;/encoding&gt;
                &lt;consoleOutput&gt;true&lt;/consoleOutput&gt;
                &lt;failsOnError&gt;true&lt;/failsOnError&gt;
                &lt;excludes&gt;**/consistency/entity/**,**/nacos/test/**,**/api/grpc/auto/**,**/istio/**,**/protobuf/**&lt;/excludes&gt;
            &lt;/configuration&gt;
            &lt;executions&gt;
                &lt;execution&gt;
                    &lt;id&gt;validate&lt;/id&gt;
                    &lt;phase&gt;validate&lt;/phase&gt;
                    &lt;goals&gt;
                        &lt;goal&gt;check&lt;/goal&gt;
                    &lt;/goals&gt;
                &lt;/execution&gt;
            &lt;/executions&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.apache.rat&lt;/groupId&gt;
            &lt;artifactId&gt;apache-rat-plugin&lt;/artifactId&gt;
            &lt;version&gt;${apache-rat-plugin.version}&lt;/version&gt;
            &lt;configuration&gt;
                &lt;excludes&gt;
                    &lt;exclude&gt;.editorconfig&lt;/exclude&gt;
                    &lt;exclude&gt;.travis.yml&lt;/exclude&gt;
                    &lt;exclude&gt;CONTRIBUTING.md&lt;/exclude&gt;
                    &lt;exclude&gt;CODE_OF_CONDUCT.md&lt;/exclude&gt;
                    &lt;exclude&gt;CHANGELOG.md&lt;/exclude&gt;
                    &lt;exclude&gt;style/codeStyle.md&lt;/exclude&gt;
                    &lt;exclude&gt;REPORTING-BUGS.md&lt;/exclude&gt;
                    &lt;exclude&gt;README.md&lt;/exclude&gt;
                    &lt;exclude&gt;.github/**/*&lt;/exclude&gt;
                    &lt;exclude&gt;doc/*&lt;/exclude&gt;
                    &lt;exclude&gt;derby.log&lt;/exclude&gt;
                    &lt;exclude&gt;logs/*&lt;/exclude&gt;
                    &lt;exclude&gt;src/main/resources/static/**&lt;/exclude&gt;
                    &lt;exclude&gt;**/istio/model/**&lt;/exclude&gt;
                    &lt;exclude&gt;**/consistency/entity/**&lt;/exclude&gt;
                    &lt;exclude&gt;**/*.txt&lt;/exclude&gt;
                    &lt;exclude&gt;**/*.factories&lt;/exclude&gt;
                    &lt;exclude&gt;/console-ui/**&lt;/exclude&gt;
                    &lt;exclude&gt;**/gogo.proto&lt;/exclude&gt;
                    &lt;exclude&gt;**/any.proto&lt;/exclude&gt;
                &lt;/excludes&gt;
            &lt;/configuration&gt;
            &lt;executions&gt;
                &lt;execution&gt;
                    &lt;phase&gt;verify&lt;/phase&gt;
                    &lt;goals&gt;
                        &lt;goal&gt;check&lt;/goal&gt;
                    &lt;/goals&gt;
                &lt;/execution&gt;
            &lt;/executions&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
            &lt;artifactId&gt;maven-resources-plugin&lt;/artifactId&gt;
            &lt;version&gt;${maven-resources-plugin.version}&lt;/version&gt;
            &lt;configuration&gt;
                &lt;!-- We are not suppose to setup the customer resources here --&gt;
                &lt;encoding&gt;${project.build.sourceEncoding}&lt;/encoding&gt;
            &lt;/configuration&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.eluder.coveralls&lt;/groupId&gt;
            &lt;artifactId&gt;coveralls-maven-plugin&lt;/artifactId&gt;
            &lt;version&gt;${coveralls-maven-plugin.version}&lt;/version&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.jacoco&lt;/groupId&gt;
            &lt;artifactId&gt;jacoco-maven-plugin&lt;/artifactId&gt;
            &lt;version&gt;${jacoco-maven-plugin.version}&lt;/version&gt;
            &lt;executions&gt;
                &lt;execution&gt;
                    &lt;id&gt;default-prepare-agent&lt;/id&gt;
                    &lt;goals&gt;
                        &lt;goal&gt;prepare-agent&lt;/goal&gt;
                    &lt;/goals&gt;
                    &lt;configuration&gt;
                        &lt;destFile&gt;${project.build.directory}/jacoco.exec&lt;/destFile&gt;
                    &lt;/configuration&gt;
                &lt;/execution&gt;
                &lt;execution&gt;
                    &lt;id&gt;default-prepare-agent-integration&lt;/id&gt;
                    &lt;phase&gt;pre-integration-test&lt;/phase&gt;
                    &lt;goals&gt;
                        &lt;goal&gt;prepare-agent-integration&lt;/goal&gt;
                    &lt;/goals&gt;
                    &lt;configuration&gt;
                        &lt;destFile&gt;${project.build.directory}/jacoco-it.exec&lt;/destFile&gt;
                        &lt;propertyName&gt;failsafeArgLine&lt;/propertyName&gt;
                    &lt;/configuration&gt;
                &lt;/execution&gt;
                &lt;execution&gt;
                    &lt;id&gt;default-report&lt;/id&gt;
                    &lt;goals&gt;
                        &lt;goal&gt;report&lt;/goal&gt;
                    &lt;/goals&gt;
                &lt;/execution&gt;
                &lt;execution&gt;
                    &lt;id&gt;default-report-integration&lt;/id&gt;
                    &lt;goals&gt;
                        &lt;goal&gt;report-integration&lt;/goal&gt;
                    &lt;/goals&gt;
                &lt;/execution&gt;
            &lt;/executions&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
            &lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
            &lt;version&gt;${maven-surefire-plugin.version}&lt;/version&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
            &lt;artifactId&gt;findbugs-maven-plugin&lt;/artifactId&gt;
            &lt;version&gt;${findbugs-maven-plugin.version}&lt;/version&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.sonarsource.scanner.maven&lt;/groupId&gt;
            &lt;artifactId&gt;sonar-maven-plugin&lt;/artifactId&gt;
            &lt;version&gt;${sonar-maven-plugin.version}&lt;/version&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
            &lt;artifactId&gt;maven-assembly-plugin&lt;/artifactId&gt;
            &lt;version&gt;${maven-assembly-plugin.version}&lt;/version&gt;
        &lt;/plugin&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
            &lt;artifactId&gt;flatten-maven-plugin&lt;/artifactId&gt;
            &lt;version&gt;${maven-flatten-version}&lt;/version&gt;
            &lt;configuration&gt;
                &lt;updatePomFile&gt;true&lt;/updatePomFile&gt;
                &lt;flattenMode&gt;resolveCiFriendliesOnly&lt;/flattenMode&gt;
                &lt;pomElements&gt;
                    &lt;dependencies&gt;expand&lt;/dependencies&gt;
                &lt;/pomElements&gt;
            &lt;/configuration&gt;
            &lt;executions&gt;
                &lt;execution&gt;
                    &lt;id&gt;flatten&lt;/id&gt;
                    &lt;phase&gt;process-resources&lt;/phase&gt;
                    &lt;goals&gt;
                        &lt;goal&gt;flatten&lt;/goal&gt;
                    &lt;/goals&gt;
                &lt;/execution&gt;
                &lt;execution&gt;
                    &lt;id&gt;flatten.clean&lt;/id&gt;
                    &lt;phase&gt;clean&lt;/phase&gt;
                    &lt;goals&gt;
                        &lt;goal&gt;clean&lt;/goal&gt;
                    &lt;/goals&gt;
                &lt;/execution&gt;
            &lt;/executions&gt;
        &lt;/plugin&gt;
    &lt;/plugins&gt;
&lt;/build&gt;

&lt;profiles&gt;
    &lt;profile&gt;
        &lt;id&gt;jdk8&lt;/id&gt;
        &lt;activation&gt;
            &lt;jdk&gt;[1.8,)&lt;/jdk&gt;
        &lt;/activation&gt;
        &lt;!-- Disable doclint under JDK 8 --&gt;
        &lt;reporting&gt;
            &lt;plugins&gt;
                &lt;plugin&gt;
                    &lt;artifactId&gt;maven-javadoc-plugin&lt;/artifactId&gt;
                    &lt;version&gt;${maven-javadoc-plugin.version}&lt;/version&gt;
                    &lt;configuration&gt;
                        &lt;additionalparam&gt;-Xdoclint:none&lt;/additionalparam&gt;
                    &lt;/configuration&gt;
                &lt;/plugin&gt;
            &lt;/plugins&gt;
        &lt;/reporting&gt;
        &lt;build&gt;
            &lt;plugins&gt;
                &lt;plugin&gt;
                    &lt;artifactId&gt;maven-javadoc-plugin&lt;/artifactId&gt;
                    &lt;version&gt;${maven-javadoc-plugin.version}&lt;/version&gt;
                    &lt;configuration&gt;
                        &lt;additionalparam&gt;-Xdoclint:none&lt;/additionalparam&gt;
                    &lt;/configuration&gt;
                &lt;/plugin&gt;
            &lt;/plugins&gt;
        &lt;/build&gt;
    &lt;/profile&gt;
    &lt;profile&gt;
        &lt;id&gt;release-sign-artifacts&lt;/id&gt;
        &lt;activation&gt;
            &lt;property&gt;
                &lt;name&gt;performRelease&lt;/name&gt;
                &lt;value&gt;true&lt;/value&gt;
            &lt;/property&gt;
        &lt;/activation&gt;
        
        &lt;properties&gt;
            &lt;maven.javadoc.skip&gt;false&lt;/maven.javadoc.skip&gt;
        &lt;/properties&gt;
        
        &lt;build&gt;
            &lt;plugins&gt;
                &lt;plugin&gt;
                    &lt;artifactId&gt;maven-gpg-plugin&lt;/artifactId&gt;
                    &lt;version&gt;${maven-gpg-plugin.version}&lt;/version&gt;
                    &lt;executions&gt;
                        &lt;execution&gt;
                            &lt;id&gt;sign-artifacts&lt;/id&gt;
                            &lt;phase&gt;verify&lt;/phase&gt;
                            &lt;goals&gt;
                                &lt;goal&gt;sign&lt;/goal&gt;
                            &lt;/goals&gt;
                        &lt;/execution&gt;
                    &lt;/executions&gt;
                &lt;/plugin&gt;
            &lt;/plugins&gt;
        &lt;/build&gt;
    &lt;/profile&gt;
    &lt;profile&gt;
        &lt;!--  Run integration tests for configuration modules separately  --&gt;
        &lt;id&gt;cit-test&lt;/id&gt;
        &lt;build&gt;
            &lt;plugins&gt;
                &lt;plugin&gt;
                    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
                    &lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
                    &lt;version&gt;${maven-surefire-plugin.version}&lt;/version&gt;
                    &lt;configuration&gt;
                        &lt;testFailureIgnore&gt;false&lt;/testFailureIgnore&gt;
                        &lt;includes&gt;
                            &lt;include&gt;**/*CITCase.java&lt;/include&gt;
                        &lt;/includes&gt;
                    &lt;/configuration&gt;
                &lt;/plugin&gt;
            &lt;/plugins&gt;
        &lt;/build&gt;
    &lt;/profile&gt;
    &lt;profile&gt;
        &lt;!--  Run integration tests for all modules separately  --&gt;
        &lt;id&gt;nit-test&lt;/id&gt;
        &lt;build&gt;
            &lt;plugins&gt;
                &lt;plugin&gt;
                    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
                    &lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
                    &lt;version&gt;${maven-surefire-plugin.version}&lt;/version&gt;
                    &lt;configuration&gt;
                        &lt;testFailureIgnore&gt;false&lt;/testFailureIgnore&gt;
                        &lt;includes&gt;
                            &lt;include&gt;**/naming/*ITCase.java&lt;/include&gt;
                        &lt;/includes&gt;
                    &lt;/configuration&gt;
                &lt;/plugin&gt;
            &lt;/plugins&gt;
        &lt;/build&gt;
    &lt;/profile&gt;
    &lt;profile&gt;
        &lt;id&gt;sonar-apache&lt;/id&gt;
        &lt;properties&gt;
            &lt;!-- URL of the ASF SonarQube server --&gt;
            &lt;sonar.host.url&gt;https://builds.apache.org/analysis&lt;/sonar.host.url&gt;
        &lt;/properties&gt;
    &lt;/profile&gt;
    &lt;profile&gt;
        &lt;id&gt;remove-test-data&lt;/id&gt;
        &lt;build&gt;
            &lt;plugins&gt;
                &lt;plugin&gt;
                    &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
                    &lt;artifactId&gt;maven-clean-plugin&lt;/artifactId&gt;
                    &lt;configuration&gt;
                        &lt;followSymLinks&gt;false&lt;/followSymLinks&gt;
                        &lt;filesets&gt;
                            &lt;fileset&gt;
                                &lt;directory&gt;${user.home}/nacos/data&lt;/directory&gt;
                            &lt;/fileset&gt;
                        &lt;/filesets&gt;
                    &lt;/configuration&gt;
                &lt;/plugin&gt;
            &lt;/plugins&gt;
        &lt;/build&gt;
    &lt;/profile&gt;
&lt;/profiles&gt;
&lt;reporting&gt;
    &lt;plugins&gt;
        &lt;plugin&gt;
            &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
            &lt;artifactId&gt;findbugs-maven-plugin&lt;/artifactId&gt;
            &lt;version&gt;${findbugs-maven-plugin.version}&lt;/version&gt;
        &lt;/plugin&gt;
    &lt;/plugins&gt;
&lt;/reporting&gt;

&lt;!-- Submodule management --&gt;
&lt;modules&gt;
    &lt;module&gt;config&lt;/module&gt;
    &lt;module&gt;core&lt;/module&gt;
    &lt;module&gt;naming&lt;/module&gt;
    &lt;module&gt;address&lt;/module&gt;
    &lt;module&gt;test&lt;/module&gt;
    &lt;module&gt;api&lt;/module&gt;
    &lt;module&gt;client&lt;/module&gt;
    &lt;module&gt;example&lt;/module&gt;
    &lt;module&gt;common&lt;/module&gt;
    &lt;module&gt;distribution&lt;/module&gt;
    &lt;module&gt;console&lt;/module&gt;
    &lt;module&gt;cmdb&lt;/module&gt;
    &lt;module&gt;istio&lt;/module&gt;
    &lt;module&gt;consistency&lt;/module&gt;
    &lt;module&gt;auth&lt;/module&gt;
    &lt;module&gt;sys&lt;/module&gt;
&lt;/modules&gt;

&lt;!-- Default dependencies in all subprojects --&gt;
&lt;dependencies&gt;
    
    &lt;dependency&gt;
        &lt;groupId&gt;junit&lt;/groupId&gt;
        &lt;artifactId&gt;junit&lt;/artifactId&gt;
        &lt;scope&gt;test&lt;/scope&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.mockito&lt;/groupId&gt;
        &lt;artifactId&gt;mockito-core&lt;/artifactId&gt;
        &lt;scope&gt;test&lt;/scope&gt;
    &lt;/dependency&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;org.mockito&lt;/groupId&gt;
        &lt;artifactId&gt;mockito-inline&lt;/artifactId&gt;
        &lt;scope&gt;test&lt;/scope&gt;
    &lt;/dependency&gt;

&lt;/dependencies&gt;

&lt;!-- Manage the version numbers of dependencies,
sub-modules will not introduce these dependencies by default --&gt;
&lt;dependencyManagement&gt;
    &lt;dependencies&gt;
        &lt;dependency&gt;
            &lt;!-- Import dependency management from Spring Boot --&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-dependencies&lt;/artifactId&gt;
            &lt;version&gt;${spring-boot-dependencies.version}&lt;/version&gt;
            &lt;type&gt;pom&lt;/type&gt;
            &lt;scope&gt;import&lt;/scope&gt;
        &lt;/dependency&gt;
        
        &lt;!-- Internal libs --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;${project.groupId}&lt;/groupId&gt;
            &lt;artifactId&gt;nacos-config&lt;/artifactId&gt;
            &lt;version&gt;${project.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;${project.groupId}&lt;/groupId&gt;
            &lt;artifactId&gt;nacos-core&lt;/artifactId&gt;
            &lt;version&gt;${project.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;${project.groupId}&lt;/groupId&gt;
            &lt;artifactId&gt;nacos-naming&lt;/artifactId&gt;
            &lt;version&gt;${project.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;${project.groupId}&lt;/groupId&gt;
            &lt;artifactId&gt;nacos-api&lt;/artifactId&gt;
            &lt;version&gt;${project.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;${project.groupId}&lt;/groupId&gt;
            &lt;artifactId&gt;nacos-client&lt;/artifactId&gt;
            &lt;version&gt;${project.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;${project.groupId}&lt;/groupId&gt;
            &lt;artifactId&gt;nacos-test&lt;/artifactId&gt;
            &lt;version&gt;${project.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;${project.groupId}&lt;/groupId&gt;
            &lt;artifactId&gt;nacos-common&lt;/artifactId&gt;
            &lt;version&gt;${project.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;${project.groupId}&lt;/groupId&gt;
            &lt;artifactId&gt;nacos-cmdb&lt;/artifactId&gt;
            &lt;version&gt;${project.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;${project.groupId}&lt;/groupId&gt;
            &lt;artifactId&gt;nacos-console&lt;/artifactId&gt;
            &lt;version&gt;${project.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;${project.groupId}&lt;/groupId&gt;
            &lt;artifactId&gt;nacos-distribution&lt;/artifactId&gt;
            &lt;version&gt;${project.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;${project.groupId}&lt;/groupId&gt;
            &lt;artifactId&gt;nacos-example&lt;/artifactId&gt;
            &lt;version&gt;${project.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;${project.groupId}&lt;/groupId&gt;
            &lt;artifactId&gt;nacos-address&lt;/artifactId&gt;
            &lt;version&gt;${project.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;${project.groupId}&lt;/groupId&gt;
            &lt;artifactId&gt;nacos-istio&lt;/artifactId&gt;
            &lt;version&gt;${project.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;${project.groupId}&lt;/groupId&gt;
            &lt;artifactId&gt;nacos-consistency&lt;/artifactId&gt;
            &lt;version&gt;${project.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;${project.groupId}&lt;/groupId&gt;
            &lt;artifactId&gt;nacos-auth&lt;/artifactId&gt;
            &lt;version&gt;${project.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;${project.groupId}&lt;/groupId&gt;
            &lt;artifactId&gt;nacos-sys&lt;/artifactId&gt;
            &lt;version&gt;${project.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;javax.servlet&lt;/groupId&gt;
            &lt;artifactId&gt;servlet-api&lt;/artifactId&gt;
            &lt;version&gt;${servlet-api.version}&lt;/version&gt;
            &lt;scope&gt;provided&lt;/scope&gt;
        &lt;/dependency&gt;
        
        &lt;!-- HikariCP --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;com.zaxxer&lt;/groupId&gt;
            &lt;artifactId&gt;HikariCP&lt;/artifactId&gt;
            &lt;version&gt;${HikariCP.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;!-- hessian --&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;com.caucho&lt;/groupId&gt;
            &lt;artifactId&gt;hessian&lt;/artifactId&gt;
            &lt;version&gt;${hessian.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;!-- Apache commons --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;commons-io&lt;/groupId&gt;
            &lt;artifactId&gt;commons-io&lt;/artifactId&gt;
            &lt;version&gt;${commons-io.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;commons-collections&lt;/groupId&gt;
            &lt;artifactId&gt;commons-collections&lt;/artifactId&gt;
            &lt;version&gt;${commons-collections.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;commons-logging&lt;/groupId&gt;
            &lt;artifactId&gt;commons-logging&lt;/artifactId&gt;
            &lt;version&gt;${commons-logging.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;commons-dbcp&lt;/groupId&gt;
            &lt;artifactId&gt;commons-dbcp&lt;/artifactId&gt;
            &lt;version&gt;${commons-dbcp.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;commons-cli&lt;/groupId&gt;
            &lt;artifactId&gt;commons-cli&lt;/artifactId&gt;
            &lt;version&gt;${commons-cli.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;!-- Logging libs --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.slf4j&lt;/groupId&gt;
            &lt;artifactId&gt;slf4j-api&lt;/artifactId&gt;
            &lt;version&gt;${slf4j-api.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;ch.qos.logback&lt;/groupId&gt;
            &lt;artifactId&gt;logback-classic&lt;/artifactId&gt;
            &lt;version&gt;${logback.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;ch.qos.logback&lt;/groupId&gt;
            &lt;artifactId&gt;logback-core&lt;/artifactId&gt;
            &lt;version&gt;${logback.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt;
            &lt;artifactId&gt;log4j-core&lt;/artifactId&gt;
            &lt;version&gt;${log4j.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt;
            &lt;artifactId&gt;log4j-api&lt;/artifactId&gt;
            &lt;version&gt;${log4j.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt;
            &lt;artifactId&gt;log4j-slf4j-impl&lt;/artifactId&gt;
            &lt;version&gt;${log4j.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;!-- HTTP client libs --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.apache.httpcomponents&lt;/groupId&gt;
            &lt;artifactId&gt;httpasyncclient&lt;/artifactId&gt;
            &lt;version&gt;${httpasyncclient.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;!-- JDBC libs --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;mysql&lt;/groupId&gt;
            &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt;
            &lt;version&gt;${mysql-connector-java.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;org.apache.derby&lt;/groupId&gt;
            &lt;artifactId&gt;derby&lt;/artifactId&gt;
            &lt;version&gt;${derby.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;!-- JRaft --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;com.alipay.sofa&lt;/groupId&gt;
            &lt;artifactId&gt;jraft-core&lt;/artifactId&gt;
            &lt;version&gt;${jraft-core.version}&lt;/version&gt;
            &lt;exclusions&gt;
                &lt;exclusion&gt;
                    &lt;groupId&gt;com.alipay.sofa&lt;/groupId&gt;
                    &lt;artifactId&gt;bolt&lt;/artifactId&gt;
                &lt;/exclusion&gt;
                &lt;exclusion&gt;
                    &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt;
                    &lt;artifactId&gt;log4j-api&lt;/artifactId&gt;
                &lt;/exclusion&gt;
                &lt;exclusion&gt;
                    &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt;
                    &lt;artifactId&gt;log4j-core&lt;/artifactId&gt;
                &lt;/exclusion&gt;
                &lt;exclusion&gt;
                    &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt;
                    &lt;artifactId&gt;log4j-slf4j-impl&lt;/artifactId&gt;
                &lt;/exclusion&gt;
                &lt;exclusion&gt;
                    &lt;groupId&gt;org.apache.logging.log4j&lt;/groupId&gt;
                    &lt;artifactId&gt;log4j-jcl&lt;/artifactId&gt;
                &lt;/exclusion&gt;
            &lt;/exclusions&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;com.alipay.sofa&lt;/groupId&gt;
            &lt;artifactId&gt;rpc-grpc-impl&lt;/artifactId&gt;
            &lt;version&gt;${rpc-grpc-impl.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;!-- Third-party libs --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;cglib&lt;/groupId&gt;
            &lt;artifactId&gt;cglib-nodep&lt;/artifactId&gt;
            &lt;version&gt;${cglib-nodep.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;net.jcip&lt;/groupId&gt;
            &lt;artifactId&gt;jcip-annotations&lt;/artifactId&gt;
            &lt;version&gt;${jcip-annotations.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;com.fasterxml.jackson.core&lt;/groupId&gt;
            &lt;artifactId&gt;jackson-core&lt;/artifactId&gt;
            &lt;version&gt;${jackson-core.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;com.fasterxml.jackson.core&lt;/groupId&gt;
            &lt;artifactId&gt;jackson-databind&lt;/artifactId&gt;
            &lt;version&gt;${jackson-databind.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;com.fasterxml.jackson.core&lt;/groupId&gt;
            &lt;artifactId&gt;jackson-annotations&lt;/artifactId&gt;
            &lt;version&gt;${jackson.annotations.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.codehaus.jackson&lt;/groupId&gt;
            &lt;artifactId&gt;jackson-core-asl&lt;/artifactId&gt;
            &lt;version&gt;${jackson-core-asl.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;io.jsonwebtoken&lt;/groupId&gt;
            &lt;artifactId&gt;jjwt-api&lt;/artifactId&gt;
            &lt;version&gt;${jjwt.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;io.jsonwebtoken&lt;/groupId&gt;
            &lt;artifactId&gt;jjwt-impl&lt;/artifactId&gt;
            &lt;version&gt;${jjwt.version}&lt;/version&gt;
            &lt;scope&gt;runtime&lt;/scope&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;io.jsonwebtoken&lt;/groupId&gt;
            &lt;artifactId&gt;jjwt-jackson&lt;/artifactId&gt;
            &lt;version&gt;${jjwt.version}&lt;/version&gt;
            &lt;scope&gt;runtime&lt;/scope&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;io.netty&lt;/groupId&gt;
            &lt;artifactId&gt;netty-all&lt;/artifactId&gt;
            &lt;version&gt;${netty-all.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;javax.annotation&lt;/groupId&gt;
            &lt;artifactId&gt;javax.annotation-api&lt;/artifactId&gt;
            &lt;version&gt;1.3.2&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;org.apache.mina&lt;/groupId&gt;
            &lt;artifactId&gt;mina-core&lt;/artifactId&gt;
            &lt;version&gt;${mina-core.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;com.google.guava&lt;/groupId&gt;
            &lt;artifactId&gt;guava&lt;/artifactId&gt;
            &lt;version&gt;${guava.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;org.javatuples&lt;/groupId&gt;
            &lt;artifactId&gt;javatuples&lt;/artifactId&gt;
            &lt;version&gt;${javatuples.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;com.github.keran213539&lt;/groupId&gt;
            &lt;artifactId&gt;commonOkHttp&lt;/artifactId&gt;
            &lt;version&gt;${commonOkHttp.version}&lt;/version&gt;
            &lt;scope&gt;test&lt;/scope&gt;
        &lt;/dependency&gt;
        
        &lt;!-- gRPC dependency start --&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;io.grpc&lt;/groupId&gt;
            &lt;artifactId&gt;grpc-netty-shaded&lt;/artifactId&gt;
            &lt;version&gt;${grpc-java.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;io.grpc&lt;/groupId&gt;
            &lt;artifactId&gt;grpc-protobuf&lt;/artifactId&gt;
            &lt;version&gt;${grpc-java.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;io.grpc&lt;/groupId&gt;
            &lt;artifactId&gt;grpc-stub&lt;/artifactId&gt;
            &lt;version&gt;${grpc-java.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;io.grpc&lt;/groupId&gt;
            &lt;artifactId&gt;protoc-gen-grpc-java&lt;/artifactId&gt;
            &lt;version&gt;${grpc-java.version}&lt;/version&gt;
            &lt;type&gt;pom&lt;/type&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;io.grpc&lt;/groupId&gt;
            &lt;artifactId&gt;grpc-testing&lt;/artifactId&gt;
            &lt;version&gt;${grpc-java.version}&lt;/version&gt;
            &lt;scope&gt;test&lt;/scope&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;com.google.api.grpc&lt;/groupId&gt;
            &lt;artifactId&gt;proto-google-common-protos&lt;/artifactId&gt;
            &lt;version&gt;${proto-google-common-protos.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;!-- gRPC dependency end --&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;com.google.protobuf&lt;/groupId&gt;
            &lt;artifactId&gt;protobuf-java&lt;/artifactId&gt;
            &lt;version&gt;${protobuf-java.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;org.reflections&lt;/groupId&gt;
            &lt;artifactId&gt;reflections&lt;/artifactId&gt;
            &lt;version&gt;${reflections.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;org.mockito&lt;/groupId&gt;
            &lt;artifactId&gt;mockito-all&lt;/artifactId&gt;
            &lt;version&gt;${mockito-all.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;org.mockito&lt;/groupId&gt;
            &lt;artifactId&gt;mockito-core&lt;/artifactId&gt;
            &lt;version&gt;${mockito-core.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;org.mockito&lt;/groupId&gt;
            &lt;artifactId&gt;mockito-inline&lt;/artifactId&gt;
            &lt;version&gt;${mockito-core.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;org.hamcrest&lt;/groupId&gt;
            &lt;artifactId&gt;hamcrest-all&lt;/artifactId&gt;
            &lt;version&gt;${hamcrest-all.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;io.prometheus&lt;/groupId&gt;
            &lt;artifactId&gt;simpleclient&lt;/artifactId&gt;
            &lt;version&gt;${prometheus-simpleclient.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;org.apache.tomcat.embed&lt;/groupId&gt;
            &lt;artifactId&gt;tomcat-embed-jasper&lt;/artifactId&gt;
            &lt;version&gt;${tomcat-embed-jasper.version}&lt;/version&gt;
        &lt;/dependency&gt;
        
        &lt;dependency&gt;
            &lt;groupId&gt;com.google.truth&lt;/groupId&gt;
            &lt;artifactId&gt;truth&lt;/artifactId&gt;
            &lt;version&gt;${truth.version}&lt;/version&gt;
        &lt;/dependency&gt;
    &lt;/dependencies&gt;
&lt;/dependencyManagement&gt;

&lt;distributionManagement&gt;
    &lt;snapshotRepository&gt;
        &lt;!-- The ID here must be exactly the same as the value
         of the server element id in the settings.xml file of MAVEN --&gt;
        &lt;id&gt;sona&lt;/id&gt;
        &lt;url&gt;https://oss.sonatype.org/content/repositories/snapshots/&lt;/url&gt;
    &lt;/snapshotRepository&gt;
    &lt;repository&gt;
        &lt;id&gt;sona&lt;/id&gt;
        &lt;url&gt;https://oss.sonatype.org/service/local/staging/deploy/maven2/&lt;/url&gt;
    &lt;/repository&gt;
&lt;/distributionManagement&gt;

</project>

根POM的完整信息如上 。

在 nacos-naming 中继承 nacos-all工程,引入 nacos-core,无需指定版本,将会自动读取父模块中 dependencyManagement 中所指定的版本。当然你也可以选择指定版本,则将会进行覆盖,但并不建议这么操作,将提高项目维护难度

在这里插入图片描述

如上,我们就通过 dependencyManagement 我们即实现了项目依赖版本的统一管理。


依赖导入

上面介绍了如何通过 dependencyManagement 实现全局的依赖版本管理,但如果工程中的两个子模块都需要配置相同的 dependencyManagement 配置时,可以选择通过继承父模块来实现

举个例子:

maven-demo 创建同级模块 maven-demo1 ,如果要实现 maven-demo 中配置的 dependencyManagement 则在其 dependencyManagement 配置中导入 maven-demo 并将 scope 设置为 import,并将 type 设置为 pom

通过导入即可实现更轻量化的模块信息继承,具体配置内容如下:

代码语言:javascript
复制
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.artisan</groupId>
<artifactId>maven-demo</artifactId>
<version>1.0.0-SNAPSHOT</version>
<!-- 导入目标模块的 dependencyManagement -->
<!-- 依赖范围为 import -->
<scope>import</scope>
<!-- 类型一般为 pom -->
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>