This is an automated email from the ASF dual-hosted git repository.

albumenj pushed a commit to branch 3.1
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.1 by this push:
     new 7705811ff5 Add coverage module & file lint test (#10920)
7705811ff5 is described below

commit 7705811ff5c10f1b7a6492ea712331bb2f585607
Author: Albumen Kevin <[email protected]>
AuthorDate: Sat Nov 12 14:39:33 2022 +0800

    Add coverage module & file lint test (#10920)
---
 Jenkinsfile.sonar                                  |   8 +-
 .../dubbo-demo-spring-boot-consumer/pom.xml        |   1 +
 .../dubbo-demo-spring-boot-provider/pom.xml        |   1 +
 dubbo-distribution/dubbo-all/pom.xml               | 240 +++++++---
 dubbo-distribution/dubbo-bom/pom.xml               | 295 +++++++++++--
 ...g.apache.dubbo.registry.client.ServiceDiscovery |   1 -
 .../metadata/rest/ServiceRestMetadataResolver.java |   3 +
 dubbo-native-plugin/pom.xml                        |   2 +-
 ...istry.client.metadata.SubscribedURLsSynthesizer |   1 -
 dubbo-test/dubbo-dependencies-all/pom.xml          | 338 ++++++++++++++
 dubbo-test/{ => dubbo-test-modules}/pom.xml        |  42 +-
 .../java/org/apache/dubbo/dependency/FileTest.java | 491 +++++++++++++++++++++
 dubbo-test/pom.xml                                 |   2 +
 ...g.apache.dubbo.registry.client.ServiceDiscovery |   1 -
 pom.xml                                            |   8 +
 15 files changed, 1283 insertions(+), 151 deletions(-)

diff --git a/Jenkinsfile.sonar b/Jenkinsfile.sonar
index b16366afb0..52677cb229 100644
--- a/Jenkinsfile.sonar
+++ b/Jenkinsfile.sonar
@@ -17,7 +17,9 @@
  *
  */
 pipeline {
-    agent any
+    agent {
+        label 'ubuntu'
+    }
 
     tools {
         maven 'maven_3_latest'
@@ -34,12 +36,12 @@ pipeline {
                     if ( env.BRANCH_NAME.startsWith("PR-") ) {
                         // this is a pull request
                         withCredentials([string(credentialsId: 
'sonarcloud-token', variable: 'SONAR_TOKEN')]) {
-                            sh 'mvn --batch-mode --no-snapshot-updates -e 
--no-transfer-progress --fail-fast clean verify sonar:sonar -Pjacoco 
-Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=apache 
-Dsonar.projectKey=apache_dubbo -Dsonar.pullrequest.branch=${CHANGE_BRANCH} 
-Dsonar.pullrequest.base=${CHANGE_TARGET} -Dsonar.pullrequest.key=${CHANGE_ID} 
-Dsonar.login=${SONAR_TOKEN}'
+                            sh 'mvn --batch-mode --no-snapshot-updates -e 
--no-transfer-progress --fail-fast clean verify sonar:sonar -Pjacoco 
-Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=apache 
-Dsonar.projectKey=apache_dubbo 
-Dsonar.coverage.jacoco.xmlReportPaths=dubbo-test/dubbo-dependencies-all/target/site/jacoco-aggregate/jacoco.xml
 -Dsonar.pullrequest.branch=${CHANGE_BRANCH} 
-Dsonar.pullrequest.base=${CHANGE_TARGET} -Dsonar.pullrequest.key=${CHANGE_ID} 
-Dsonar.login= [...]
                         }
                     } else {
                         // this is just a branch
                         withCredentials([string(credentialsId: 
'sonarcloud-token', variable: 'SONAR_TOKEN')]) {
-                            sh 'mvn --batch-mode --no-snapshot-updates -e 
--no-transfer-progress --fail-fast clean verify sonar:sonar -Pjacoco 
-Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=apache 
-Dsonar.projectKey=apache_dubbo -Dsonar.branch.name=${BRANCH_NAME} 
-Dsonar.login=${SONAR_TOKEN}'
+                            sh 'mvn --batch-mode --no-snapshot-updates -e 
--no-transfer-progress --fail-fast clean verify sonar:sonar -Pjacoco 
-Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=apache 
-Dsonar.projectKey=apache_dubbo 
-Dsonar.coverage.jacoco.xmlReportPaths=dubbo-test/dubbo-dependencies-all/target/site/jacoco-aggregate/jacoco.xml
 -Dsonar.branch.name=${BRANCH_NAME} -Dsonar.login=${SONAR_TOKEN}'
                         }
                     }
                 }
diff --git 
a/dubbo-demo/dubbo-demo-spring-boot/dubbo-demo-spring-boot-consumer/pom.xml 
b/dubbo-demo/dubbo-demo-spring-boot/dubbo-demo-spring-boot-consumer/pom.xml
index 9eb606818c..ba276f26e3 100644
--- a/dubbo-demo/dubbo-demo-spring-boot/dubbo-demo-spring-boot-consumer/pom.xml
+++ b/dubbo-demo/dubbo-demo-spring-boot/dubbo-demo-spring-boot-consumer/pom.xml
@@ -32,6 +32,7 @@
         <maven.compiler.target>8</maven.compiler.target>
         <slf4j-log4j12.version>1.7.25</slf4j-log4j12.version>
         <spring-boot.version>2.3.1.RELEASE</spring-boot.version>
+        <skip_maven_deploy>true</skip_maven_deploy>
     </properties>
 
     <dependencies>
diff --git 
a/dubbo-demo/dubbo-demo-spring-boot/dubbo-demo-spring-boot-provider/pom.xml 
b/dubbo-demo/dubbo-demo-spring-boot/dubbo-demo-spring-boot-provider/pom.xml
index c31ff38435..0116283824 100644
--- a/dubbo-demo/dubbo-demo-spring-boot/dubbo-demo-spring-boot-provider/pom.xml
+++ b/dubbo-demo/dubbo-demo-spring-boot/dubbo-demo-spring-boot-provider/pom.xml
@@ -32,6 +32,7 @@
         <maven.compiler.target>8</maven.compiler.target>
         <slf4j-log4j12.version>1.7.25</slf4j-log4j12.version>
         <spring-boot.version>2.3.1.RELEASE</spring-boot.version>
+        <skip_maven_deploy>true</skip_maven_deploy>
     </properties>
 
     <dependencies>
diff --git a/dubbo-distribution/dubbo-all/pom.xml 
b/dubbo-distribution/dubbo-all/pom.xml
index 09d4ef8a99..eb8efb463d 100644
--- a/dubbo-distribution/dubbo-all/pom.xml
+++ b/dubbo-distribution/dubbo-all/pom.xml
@@ -31,146 +31,167 @@
         <skip_maven_deploy>false</skip_maven_deploy>
     </properties>
     <dependencies>
+        <!-- cluster -->
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-config-api</artifactId>
+            <artifactId>dubbo-cluster</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
+
+        <!-- common -->
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-config-spring</artifactId>
+            <artifactId>dubbo-common</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
+
+        <!-- compatible -->
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-cluster</artifactId>
+            <artifactId>dubbo-compatible</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
+
+        <!-- config -->
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-common</artifactId>
+            <artifactId>dubbo-config-api</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-remoting-api</artifactId>
+            <artifactId>dubbo-config-spring</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
+
+        <!-- config-center -->
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-remoting-netty</artifactId>
+            <artifactId>dubbo-configcenter-zookeeper</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-remoting-netty4</artifactId>
+            <artifactId>dubbo-configcenter-apollo</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-remoting-zookeeper</artifactId>
+            <artifactId>dubbo-configcenter-nacos</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
+
+        <!-- container -->
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-remoting-zookeeper-curator5</artifactId>
+            <artifactId>dubbo-container-api</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-rpc-api</artifactId>
+            <artifactId>dubbo-container-spring</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
+
+        <!-- filter -->
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-rpc-dubbo</artifactId>
+            <artifactId>dubbo-filter-cache</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-rpc-injvm</artifactId>
+            <artifactId>dubbo-filter-validation</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
+
+        <!-- kubernetes -->
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-rpc-rest</artifactId>
+            <artifactId>dubbo-kubernetes</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
+
+        <!-- metadata -->
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-rpc-grpc</artifactId>
+            <artifactId>dubbo-metadata-api</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-rpc-triple</artifactId>
+            <artifactId>dubbo-metadata-report-zookeeper</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-registry-api</artifactId>
+            <artifactId>dubbo-metadata-report-nacos</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-registry-multicast</artifactId>
+            <artifactId>dubbo-metadata-report-redis</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-registry-zookeeper</artifactId>
+            <artifactId>dubbo-metadata-definition-protobuf</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
+
+        <!-- metrics -->
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-registry-nacos</artifactId>
+            <artifactId>dubbo-metrics-api</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-registry-multiple</artifactId>
+            <artifactId>dubbo-metrics-prometheus</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
+
+        <!-- monitor -->
         <dependency>
             <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo-monitor-api</artifactId>
@@ -185,9 +206,11 @@
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
+
+        <!-- plugin -->
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-container-spring</artifactId>
+            <artifactId>dubbo-auth</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
@@ -201,138 +224,183 @@
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-api</artifactId>
+            <artifactId>dubbo-reactive</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
+
+        <!-- registry -->
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-hessian2</artifactId>
+            <artifactId>dubbo-registry-api</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-fastjson2</artifactId>
+            <artifactId>dubbo-registry-multicast</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-jdk</artifactId>
+            <artifactId>dubbo-registry-multiple</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-configcenter-zookeeper</artifactId>
+            <artifactId>dubbo-registry-nacos</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-configcenter-apollo</artifactId>
+            <artifactId>dubbo-registry-zookeeper</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
+
+        <!-- remoting -->
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-configcenter-nacos</artifactId>
+            <artifactId>dubbo-remoting-api</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-compatible</artifactId>
+            <artifactId>dubbo-remoting-http</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
-            <groupId>com.alibaba</groupId>
-            <artifactId>hessian-lite</artifactId>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-remoting-netty</artifactId>
+            <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
-        <!-- metadata -->
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-metadata-api</artifactId>
+            <artifactId>dubbo-remoting-netty4</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-metadata-report-zookeeper</artifactId>
+            <artifactId>dubbo-remoting-zookeeper</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-metadata-report-nacos</artifactId>
+            <artifactId>dubbo-remoting-zookeeper-curator5</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
+
+        <!-- rpc -->
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-metadata-report-redis</artifactId>
+            <artifactId>dubbo-rpc-api</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-auth</artifactId>
+            <artifactId>dubbo-rpc-dubbo</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-filter-cache</artifactId>
+            <artifactId>dubbo-rpc-injvm</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-filter-validation</artifactId>
+            <artifactId>dubbo-rpc-rest</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-kubernetes</artifactId>
+            <artifactId>dubbo-rpc-grpc</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-xds</artifactId>
+            <artifactId>dubbo-rpc-triple</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
+
+        <!-- serialization -->
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-reactive</artifactId>
+            <artifactId>dubbo-serialization-api</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-hessian2</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-fastjson2</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-jdk</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+
+        <!-- xds -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-xds</artifactId>
             <version>${project.version}</version>
             <scope>compile</scope>
             <optional>true</optional>
         </dependency>
 
+        <!-- Hessian Lite -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>hessian-lite</artifactId>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
 
         <!-- Transitive dependencies -->
         <dependency>
@@ -388,6 +456,7 @@
             <scope>test</scope>
             <optional>true</optional>
         </dependency>
+
     </dependencies>
     <build>
         <plugins>
@@ -412,32 +481,22 @@
                                     
<include>org.apache.dubbo:dubbo-compatible</include>
                                     
<include>org.apache.dubbo:dubbo-config-api</include>
                                     
<include>org.apache.dubbo:dubbo-config-spring</include>
-                                    
<include>org.apache.dubbo:dubbo-config</include>
                                     
<include>org.apache.dubbo:dubbo-configcenter-apollo</include>
                                     
<include>org.apache.dubbo:dubbo-configcenter-nacos</include>
                                     
<include>org.apache.dubbo:dubbo-configcenter-zookeeper</include>
-                                    
<include>org.apache.dubbo:dubbo-configcenter</include>
                                     
<include>org.apache.dubbo:dubbo-container-api</include>
                                     
<include>org.apache.dubbo:dubbo-container-spring</include>
-                                    
<include>org.apache.dubbo:dubbo-container</include>
                                     
<include>org.apache.dubbo:dubbo-filter-cache</include>
                                     
<include>org.apache.dubbo:dubbo-filter-validation</include>
-                                    
<include>org.apache.dubbo:dubbo-filter</include>
                                     
<include>org.apache.dubbo:dubbo-metadata-api</include>
                                     
<include>org.apache.dubbo:dubbo-metadata-definition-protobuf</include>
-                                    
<include>org.apache.dubbo:dubbo-metadata-processor</include>
                                     
<include>org.apache.dubbo:dubbo-metadata-report-nacos</include>
                                     
<include>org.apache.dubbo:dubbo-metadata-report-redis</include>
                                     
<include>org.apache.dubbo:dubbo-metadata-report-zookeeper</include>
-                                    
<include>org.apache.dubbo:dubbo-metadata</include>
                                     
<include>org.apache.dubbo:dubbo-metrics-api</include>
                                     
<include>org.apache.dubbo:dubbo-metrics-prometheus</include>
-                                    
<include>org.apache.dubbo:dubbo-metrics</include>
                                     
<include>org.apache.dubbo:dubbo-monitor-api</include>
                                     
<include>org.apache.dubbo:dubbo-monitor-default</include>
-                                    
<include>org.apache.dubbo:dubbo-monitor</include>
-                                    
<include>org.apache.dubbo:dubbo-native</include>
-                                    
<include>org.apache.dubbo:dubbo-plugin</include>
                                     
<include>org.apache.dubbo:dubbo-qos</include>
                                     
<include>org.apache.dubbo:dubbo-reactive</include>
                                     
<include>org.apache.dubbo:dubbo-registry-api</include>
@@ -445,27 +504,22 @@
                                     
<include>org.apache.dubbo:dubbo-registry-multiple</include>
                                     
<include>org.apache.dubbo:dubbo-registry-nacos</include>
                                     
<include>org.apache.dubbo:dubbo-registry-zookeeper</include>
-                                    
<include>org.apache.dubbo:dubbo-registry</include>
                                     
<include>org.apache.dubbo:dubbo-remoting-api</include>
                                     
<include>org.apache.dubbo:dubbo-remoting-http</include>
                                     
<include>org.apache.dubbo:dubbo-remoting-netty4</include>
                                     
<include>org.apache.dubbo:dubbo-remoting-netty</include>
                                     
<include>org.apache.dubbo:dubbo-remoting-zookeeper</include>
                                     
<include>org.apache.dubbo:dubbo-remoting-zookeeper-curator5</include>
-                                    
<include>org.apache.dubbo:dubbo-remoting</include>
                                     
<include>org.apache.dubbo:dubbo-rpc-api</include>
                                     
<include>org.apache.dubbo:dubbo-rpc-dubbo</include>
                                     
<include>org.apache.dubbo:dubbo-rpc-grpc</include>
                                     
<include>org.apache.dubbo:dubbo-rpc-injvm</include>
                                     
<include>org.apache.dubbo:dubbo-rpc-rest</include>
                                     
<include>org.apache.dubbo:dubbo-rpc-triple</include>
-                                    
<include>org.apache.dubbo:dubbo-rpc</include>
                                     
<include>org.apache.dubbo:dubbo-serialization-api</include>
                                     
<include>org.apache.dubbo:dubbo-serialization-hessian2</include>
                                     
<include>org.apache.dubbo:dubbo-serialization-fastjson2</include>
                                     
<include>org.apache.dubbo:dubbo-serialization-jdk</include>
-                                    
<include>org.apache.dubbo:dubbo-serialization</include>
-                                    
<include>org.apache.dubbo:dubbo-compiler</include>
                                     
<include>org.apache.dubbo:dubbo-kubernetes</include>
                                     
<include>org.apache.dubbo:dubbo-xds</include>
                                 </includes>
@@ -801,12 +855,6 @@
                                         
META-INF/dubbo/internal/org.apache.dubbo.registry.client.RegistryClusterIdentifier
                                     </resource>
                                 </transformer>
-                                <transformer
-                                    
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
-                                    <resource>
-                                        
META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery
-                                    </resource>
-                                </transformer>
                                 <transformer
                                     
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                     <resource>
@@ -825,12 +873,6 @@
                                         
META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.MetadataServiceURLBuilder
                                     </resource>
                                 </transformer>
-                                <transformer
-                                    
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
-                                    <resource>
-                                        
META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.SubscribedURLsSynthesizer
-                                    </resource>
-                                </transformer>
                                 <transformer
                                     
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                     <resource>
@@ -1104,19 +1146,73 @@
                                 <transformer
                                     
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                     <resource>
-                                        
META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.tri.Compressor
+                                        
META-INF/dubbo/internal/org.apache.dubbo.rpc.PathResolver
                                     </resource>
                                 </transformer>
                                 <transformer
                                     
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                     <resource>
-                                        
META-INF/dubbo/internal/org.apache.dubbo.rpc.PathResolver
+                                        
META-INF/dubbo/internal/org.apache.dubbo.validation.Validation
                                     </resource>
                                 </transformer>
                                 <transformer
                                     
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                                     <resource>
-                                        
META-INF/dubbo/internal/org.apache.dubbo.validation.Validation
+                                        
META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.ServiceInstanceNotificationCustomizer
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                    
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        
META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.tri.compressor.Compressor
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                    
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        
META-INF/dubbo/internal/org.apache.dubbo.rpc.protocol.tri.compressor.DeCompressor
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                    
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        
META-INF/dubbo/internal/org.apache.dubbo.common.metrics.service.MetricsService
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                    
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        
META-INF/dubbo/internal/org.apache.dubbo.common.metrics.service.MetricsServiceExporter
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                    
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        
META-INF/dubbo/internal/org.apache.dubbo.common.metrics.MetricsReporterFactory
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                    
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        
META-INF/dubbo/internal/org.apache.dubbo.common.threadpool.event.ThreadPoolExhaustedListener
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                    
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        
META-INF/dubbo/internal/org.apache.dubbo.remoting.api.pu.PortUnificationTransporter
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                    
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        
META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.router.mesh.util.TracingContextProvider
+                                    </resource>
+                                </transformer>
+                                <transformer
+                                    
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        
META-INF/dubbo/internal/org.apache.dubbo.metadata.rest.ServiceRestMetadataResolver
                                     </resource>
                                 </transformer>
                             </transformers>
diff --git a/dubbo-distribution/dubbo-bom/pom.xml 
b/dubbo-distribution/dubbo-bom/pom.xml
index 013d842f75..4711f43dd3 100644
--- a/dubbo-distribution/dubbo-bom/pom.xml
+++ b/dubbo-distribution/dubbo-bom/pom.xml
@@ -33,19 +33,38 @@
 
     <dependencyManagement>
         <dependencies>
+            <!-- cluster -->
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo</artifactId>
+                <artifactId>dubbo-cluster</artifactId>
                 <version>${project.version}</version>
             </dependency>
+
+            <!-- common -->
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-cluster</artifactId>
+                <artifactId>dubbo-common</artifactId>
                 <version>${project.version}</version>
             </dependency>
+
+            <!-- compatible -->
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-common</artifactId>
+                <artifactId>dubbo-compatible</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+
+            <!-- compiler -->
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-compiler</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+
+            <!-- config -->
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-config</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
@@ -58,99 +77,169 @@
                 <artifactId>dubbo-config-spring</artifactId>
                 <version>${project.version}</version>
             </dependency>
+
+            <!-- config-center -->
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-filter-cache</artifactId>
+                <artifactId>dubbo-configcenter</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-filter-validation</artifactId>
+                <artifactId>dubbo-configcenter-zookeeper</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-remoting-api</artifactId>
+                <artifactId>dubbo-configcenter-apollo</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-remoting-http</artifactId>
+                <artifactId>dubbo-configcenter-nacos</artifactId>
                 <version>${project.version}</version>
             </dependency>
+
+            <!-- container -->
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-remoting-netty</artifactId>
+                <artifactId>dubbo-container</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-remoting-netty4</artifactId>
+                <artifactId>dubbo-container-api</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-remoting-zookeeper</artifactId>
+                <artifactId>dubbo-container-spring</artifactId>
                 <version>${project.version}</version>
             </dependency>
+
+            <!-- dependencies -->
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-remoting-zookeeper-curator5</artifactId>
+                <artifactId>dubbo-dependencies</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-rpc-api</artifactId>
+                <artifactId>dubbo-dependencies-zookeeper</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-rpc-dubbo</artifactId>
+                <artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
                 <version>${project.version}</version>
             </dependency>
+
+            <!-- dependencies-bom -->
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-rpc-injvm</artifactId>
+                <artifactId>dubbo-dependencies-bom</artifactId>
                 <version>${project.version}</version>
             </dependency>
+
+            <!-- distribution -->
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-rpc-rest</artifactId>
+                <artifactId>dubbo-distribution</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-rpc-grpc</artifactId>
+                <artifactId>dubbo</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-rpc-triple</artifactId>
+                <artifactId>dubbo-bom</artifactId>
                 <version>${project.version}</version>
             </dependency>
+
+            <!-- filter -->
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-registry-api</artifactId>
+                <artifactId>dubbo-filter</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-registry-multiple</artifactId>
+                <artifactId>dubbo-filter-cache</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-registry-multicast</artifactId>
+                <artifactId>dubbo-filter-validation</artifactId>
                 <version>${project.version}</version>
             </dependency>
+
+            <!-- kubernetes -->
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-registry-zookeeper</artifactId>
+                <artifactId>dubbo-kubernetes</artifactId>
                 <version>${project.version}</version>
             </dependency>
+
+            <!-- metadata -->
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-registry-nacos</artifactId>
+                <artifactId>dubbo-metadata</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-metadata-api</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-metadata-report-zookeeper</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-metadata-report-nacos</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-metadata-report-redis</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-metadata-processor</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-metadata-definition-protobuf</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+
+            <!-- metrics -->
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-metrics</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-metrics-api</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-metrics-prometheus</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+
+            <!-- monitor -->
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-monitor</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
@@ -163,23 +252,27 @@
                 <artifactId>dubbo-monitor-default</artifactId>
                 <version>${project.version}</version>
             </dependency>
+
+            <!-- native -->
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-container-api</artifactId>
+                <artifactId>dubbo-native</artifactId>
                 <version>${project.version}</version>
             </dependency>
+
+            <!-- native-plugin -->
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-container-spring</artifactId>
+                <artifactId>dubbo-native-plugin</artifactId>
                 <version>${project.version}</version>
             </dependency>
+
+            <!-- plugin -->
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-reactive</artifactId>
+                <artifactId>dubbo-plugin</artifactId>
                 <version>${project.version}</version>
             </dependency>
-
-            <!-- dubbo plugin -->
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
                 <artifactId>dubbo-auth</artifactId>
@@ -190,97 +283,151 @@
                 <artifactId>dubbo-qos</artifactId>
                 <version>${project.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-reactive</artifactId>
+                <version>${project.version}</version>
+            </dependency>
 
+            <!-- registry -->
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-serialization-api</artifactId>
+                <artifactId>dubbo-registry</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-serialization-hessian2</artifactId>
+                <artifactId>dubbo-registry-api</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-serialization-fastjson2</artifactId>
+                <artifactId>dubbo-registry-multicast</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-serialization-jdk</artifactId>
+                <artifactId>dubbo-registry-multiple</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-serialization-protobuf</artifactId>
+                <artifactId>dubbo-registry-nacos</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-compatible</artifactId>
+                <artifactId>dubbo-registry-zookeeper</artifactId>
                 <version>${project.version}</version>
             </dependency>
 
-            <!-- metadata -->
+            <!-- remoting -->
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-metadata-api</artifactId>
+                <artifactId>dubbo-remoting</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-metadata-report-zookeeper</artifactId>
+                <artifactId>dubbo-remoting-api</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-metadata-report-nacos</artifactId>
+                <artifactId>dubbo-remoting-http</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-metadata-report-redis</artifactId>
+                <artifactId>dubbo-remoting-netty</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-metadata-processor</artifactId>
+                <artifactId>dubbo-remoting-netty4</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-metadata-definition-protobuf</artifactId>
+                <artifactId>dubbo-remoting-zookeeper</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-remoting-zookeeper-curator5</artifactId>
                 <version>${project.version}</version>
             </dependency>
 
-            <!-- config-center -->
+            <!-- rpc -->
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-configcenter-zookeeper</artifactId>
+                <artifactId>dubbo-rpc</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-configcenter-apollo</artifactId>
+                <artifactId>dubbo-rpc-api</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-configcenter-nacos</artifactId>
+                <artifactId>dubbo-rpc-dubbo</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-kubernetes</artifactId>
+                <artifactId>dubbo-rpc-injvm</artifactId>
                 <version>${project.version}</version>
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-xds</artifactId>
+                <artifactId>dubbo-rpc-rest</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-rpc-grpc</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-rpc-triple</artifactId>
                 <version>${project.version}</version>
             </dependency>
 
+            <!-- serialization -->
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-serialization</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-serialization-api</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-serialization-hessian2</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-serialization-fastjson2</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-serialization-jdk</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+
+            <!-- spring-boot -->
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-spring-boot</artifactId>
+                <version>${project.version}</version>
+            </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
                 <artifactId>dubbo-spring-boot-actuator</artifactId>
@@ -291,6 +438,11 @@
                 <artifactId>dubbo-spring-boot-autoconfigure</artifactId>
                 <version>${project.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-spring-boot-compatible</artifactId>
+                <version>${project.version}</version>
+            </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
                 <artifactId>dubbo-spring-boot-actuator-compatible</artifactId>
@@ -309,8 +461,57 @@
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
                 <artifactId>dubbo-dependencies-zookeeper</artifactId>
-                <version>${project.version}</version>
                 <type>pom</type>
+                <version>${project.version}</version>
+            </dependency>
+
+            <!-- test -->
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-test</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-test-check</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-test-common</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-test-modules</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-test-spring</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-test-spring3.2</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-test-spring4.1</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-test-spring4.2</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+
+            <!-- xds -->
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-xds</artifactId>
+                <version>${project.version}</version>
             </dependency>
         </dependencies>
     </dependencyManagement>
diff --git 
a/dubbo-kubernetes/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery
 
b/dubbo-kubernetes/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery
deleted file mode 100644
index 3e1b88e44c..0000000000
--- 
a/dubbo-kubernetes/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery
+++ /dev/null
@@ -1 +0,0 @@
-kubernetes=org.apache.dubbo.registry.kubernetes.KubernetesServiceDiscovery
\ No newline at end of file
diff --git 
a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/ServiceRestMetadataResolver.java
 
b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/ServiceRestMetadataResolver.java
index 0c1ece882a..41ea25d999 100644
--- 
a/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/ServiceRestMetadataResolver.java
+++ 
b/dubbo-metadata/dubbo-metadata-api/src/main/java/org/apache/dubbo/metadata/rest/ServiceRestMetadataResolver.java
@@ -16,12 +16,15 @@
  */
 package org.apache.dubbo.metadata.rest;
 
+import org.apache.dubbo.common.extension.SPI;
+
 /**
  * The interface to resolve the {@link ServiceRestMetadata REST metadata} from 
the specified
  * Dubbo Service interface or type.
  *
  * @since 2.7.6
  */
+@SPI
 public interface ServiceRestMetadataResolver {
 
     /**
diff --git a/dubbo-native-plugin/pom.xml b/dubbo-native-plugin/pom.xml
index 1410c737d0..ba4d9d7098 100644
--- a/dubbo-native-plugin/pom.xml
+++ b/dubbo-native-plugin/pom.xml
@@ -56,7 +56,7 @@
 
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo</artifactId>
+            <artifactId>dubbo-common</artifactId>
             <version>${project.version}</version>
         </dependency>
 
diff --git 
a/dubbo-registry/dubbo-registry-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.SubscribedURLsSynthesizer
 
b/dubbo-registry/dubbo-registry-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.SubscribedURLsSynthesizer
deleted file mode 100644
index 5fc303da86..0000000000
--- 
a/dubbo-registry/dubbo-registry-api/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.metadata.SubscribedURLsSynthesizer
+++ /dev/null
@@ -1 +0,0 @@
-rest=org.apache.dubbo.registry.client.metadata.RestProtocolSubscribedURLsSynthesizer
\ No newline at end of file
diff --git a/dubbo-test/dubbo-dependencies-all/pom.xml 
b/dubbo-test/dubbo-dependencies-all/pom.xml
new file mode 100644
index 0000000000..83374e72df
--- /dev/null
+++ b/dubbo-test/dubbo-dependencies-all/pom.xml
@@ -0,0 +1,338 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You 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/maven-v4_0_0.xsd";>
+    <parent>
+        <artifactId>dubbo-test</artifactId>
+        <groupId>org.apache.dubbo</groupId>
+        <version>${revision}</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>dubbo-dependencies-all</artifactId>
+    <description>Aggregate jacoco report</description>
+
+    <properties>
+        <skip_maven_deploy>true</skip_maven_deploy>
+    </properties>
+
+    <dependencies>
+        <!-- cluster -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-cluster</artifactId>
+        </dependency>
+
+        <!-- common -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-common</artifactId>
+        </dependency>
+
+        <!-- compatible -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-compatible</artifactId>
+        </dependency>
+
+        <!-- compiler -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-compiler</artifactId>
+        </dependency>
+
+        <!-- config -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-config-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-config-spring</artifactId>
+        </dependency>
+
+        <!-- config-center -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-configcenter-zookeeper</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-configcenter-apollo</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-configcenter-nacos</artifactId>
+        </dependency>
+
+        <!-- container -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-container-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-container-spring</artifactId>
+        </dependency>
+
+        <!-- distribution -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo</artifactId>
+        </dependency>
+
+        <!-- filter -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-filter-cache</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-filter-validation</artifactId>
+        </dependency>
+
+        <!-- kubernetes -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-kubernetes</artifactId>
+        </dependency>
+
+        <!-- metadata -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-metadata-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-metadata-report-zookeeper</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-metadata-report-nacos</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-metadata-report-redis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-metadata-processor</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-metadata-definition-protobuf</artifactId>
+        </dependency>
+
+        <!-- metrics -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-metrics-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-metrics-prometheus</artifactId>
+        </dependency>
+
+        <!-- monitor -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-monitor-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-monitor-default</artifactId>
+        </dependency>
+
+        <!-- native -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-native</artifactId>
+        </dependency>
+
+        <!-- native-plugin -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-native-plugin</artifactId>
+        </dependency>
+
+        <!-- plugin -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-auth</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-qos</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-reactive</artifactId>
+        </dependency>
+
+        <!-- registry -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-registry-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-registry-multicast</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-registry-multiple</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-registry-nacos</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-registry-zookeeper</artifactId>
+        </dependency>
+
+        <!-- remoting -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-remoting-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-remoting-http</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-remoting-netty</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-remoting-netty4</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-remoting-zookeeper</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-remoting-zookeeper-curator5</artifactId>
+        </dependency>
+
+        <!-- rpc -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-dubbo</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-injvm</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-rest</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-grpc</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-rpc-triple</artifactId>
+        </dependency>
+
+        <!-- serialization -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-hessian2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-fastjson2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-jdk</artifactId>
+        </dependency>
+
+        <!-- spring-boot -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-spring-boot-actuator</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-spring-boot-autoconfigure</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-spring-boot-actuator-compatible</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-spring-boot-autoconfigure-compatible</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-spring-boot-starter</artifactId>
+        </dependency>
+
+        <!-- test -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-test-check</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-test-common</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-test-modules</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-test-spring</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-test-spring3.2</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-test-spring4.1</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-test-spring4.2</artifactId>
+        </dependency>
+
+        <!-- xds -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-xds</artifactId>
+        </dependency>
+    </dependencies>
+</project>
diff --git a/dubbo-test/pom.xml b/dubbo-test/dubbo-test-modules/pom.xml
similarity index 58%
copy from dubbo-test/pom.xml
copy to dubbo-test/dubbo-test-modules/pom.xml
index ee20080694..a8f8fd600e 100644
--- a/dubbo-test/pom.xml
+++ b/dubbo-test/dubbo-test-modules/pom.xml
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
 <!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
@@ -18,40 +19,31 @@
          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";>
     <parent>
+        <artifactId>dubbo-test</artifactId>
         <groupId>org.apache.dubbo</groupId>
-        <artifactId>dubbo-parent</artifactId>
         <version>${revision}</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>
-    <artifactId>dubbo-test</artifactId>
-    <packaging>pom</packaging>
 
-    <modules>
-        <module>dubbo-test-check</module>
-        <module>dubbo-test-common</module>
-        <module>dubbo-test-spring</module>
-        <module>dubbo-test-spring3.2</module>
-        <module>dubbo-test-spring4.1</module>
-        <module>dubbo-test-spring4.2</module>
-    </modules>
+    <artifactId>dubbo-test-modules</artifactId>
+    <description>Check if dependencies configured properly</description>
 
     <properties>
-        <maven.compiler.source>8</maven.compiler.source>
-        <maven.compiler.target>8</maven.compiler.target>
         <skip_maven_deploy>true</skip_maven_deploy>
+        <dom4j_version>2.1.3</dom4j_version>
     </properties>
 
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-bom</artifactId>
-                <version>${project.parent.version}</version>
-                <type>pom</type>
-                <scope>import</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
+    <dependencies>
+        <dependency>
+            <groupId>org.dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+            <version>${dom4j_version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-common</artifactId>
+        </dependency>
+    </dependencies>
 </project>
diff --git 
a/dubbo-test/dubbo-test-modules/src/test/java/org/apache/dubbo/dependency/FileTest.java
 
b/dubbo-test/dubbo-test-modules/src/test/java/org/apache/dubbo/dependency/FileTest.java
new file mode 100644
index 0000000000..1973d98340
--- /dev/null
+++ 
b/dubbo-test/dubbo-test-modules/src/test/java/org/apache/dubbo/dependency/FileTest.java
@@ -0,0 +1,491 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.dubbo.dependency;
+
+import org.apache.commons.io.FileUtils;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+public class FileTest {
+    private final static List<Pattern> ignoredModules = new LinkedList<>();
+    private final static List<Pattern> ignoredModulesInDubboAll = new 
LinkedList<>();
+
+    static {
+        ignoredModules.add(Pattern.compile("dubbo-apache-release"));
+        ignoredModules.add(Pattern.compile("dubbo-build-tools"));
+        ignoredModules.add(Pattern.compile("dubbo-dependencies-all"));
+        ignoredModules.add(Pattern.compile("dubbo-parent"));
+        ignoredModules.add(Pattern.compile("dubbo-core-spi"));
+        ignoredModules.add(Pattern.compile("dubbo-demo.*"));
+
+        ignoredModulesInDubboAll.add(Pattern.compile("dubbo"));
+        ignoredModulesInDubboAll.add(Pattern.compile("dubbo-bom"));
+        ignoredModulesInDubboAll.add(Pattern.compile("dubbo-compiler"));
+        ignoredModulesInDubboAll.add(Pattern.compile("dubbo-dependencies.*"));
+        ignoredModulesInDubboAll.add(Pattern.compile("dubbo-distribution"));
+        
ignoredModulesInDubboAll.add(Pattern.compile("dubbo-metadata-processor"));
+        ignoredModulesInDubboAll.add(Pattern.compile("dubbo-native.*"));
+        ignoredModulesInDubboAll.add(Pattern.compile("dubbo-spring-boot.*"));
+    }
+
+    @Test
+    public void checkDubboBom() throws DocumentException {
+        File baseFile = getBaseFile();
+
+        List<File> poms = new LinkedList<>();
+        readPoms(baseFile, poms);
+
+        SAXReader reader = new SAXReader();
+
+        List<String> artifactIds = poms.stream()
+            .map(f -> {
+                try {
+                    return reader.read(f);
+                } catch (DocumentException e) {
+                    throw new RuntimeException(e);
+                }
+            })
+            .map(Document::getRootElement)
+            .map(doc -> doc.elementText("artifactId"))
+            .sorted()
+            .collect(Collectors.toList());
+
+        String dubboBomPath = "dubbo-distribution/dubbo-bom/pom.xml";
+        Document dubboBom = reader.read(new File(getBaseFile(), dubboBomPath));
+        List<String> artifactIdsInDubboBom = dubboBom.getRootElement()
+            .element("dependencyManagement")
+            .element("dependencies")
+            .elements("dependency")
+            .stream()
+            .map(ele -> ele.elementText("artifactId"))
+            .collect(Collectors.toList());
+
+        List<String> expectedArtifactIds = new LinkedList<>(artifactIds);
+        expectedArtifactIds.removeAll(artifactIdsInDubboBom);
+        expectedArtifactIds.removeIf(artifactId -> 
ignoredModules.stream().anyMatch(pattern -> 
pattern.matcher(artifactId).matches()));
+
+        Assertions.assertTrue(expectedArtifactIds.isEmpty(), "Newly created 
modules must be added to dubbo-bom. Found modules: " + expectedArtifactIds);
+    }
+
+    @Test
+    public void checkDubboDependenciesAll() throws DocumentException {
+        File baseFile = getBaseFile();
+
+        List<File> poms = new LinkedList<>();
+        readPoms(baseFile, poms);
+
+        SAXReader reader = new SAXReader();
+
+        List<String> artifactIds = poms.stream()
+            .map(f -> {
+                try {
+                    return reader.read(f);
+                } catch (DocumentException e) {
+                    throw new RuntimeException(e);
+                }
+            })
+            .map(Document::getRootElement)
+            .filter(doc -> !Objects.equals("pom", 
doc.elementText("packaging")))
+            .map(doc -> doc.elementText("artifactId"))
+            .sorted()
+            .collect(Collectors.toList());
+
+        String dubboDependenciesAllPath = 
"dubbo-test/dubbo-dependencies-all/pom.xml";
+        Document dubboDependenciesAll = reader.read(new File(getBaseFile(), 
dubboDependenciesAllPath));
+        List<String> artifactIdsInDubboDependenciesAll = 
dubboDependenciesAll.getRootElement()
+            .element("dependencies")
+            .elements("dependency")
+            .stream()
+            .map(ele -> ele.elementText("artifactId"))
+            .collect(Collectors.toList());
+
+        List<String> expectedArtifactIds = new LinkedList<>(artifactIds);
+        expectedArtifactIds.removeAll(artifactIdsInDubboDependenciesAll);
+        expectedArtifactIds.removeIf(artifactId -> 
ignoredModules.stream().anyMatch(pattern -> 
pattern.matcher(artifactId).matches()));
+
+        Assertions.assertTrue(expectedArtifactIds.isEmpty(), "Newly created 
modules must be added to dubbo-dependencies-all. Found modules: " + 
expectedArtifactIds);
+    }
+
+    @Test
+    public void checkDubboAllDependencies() throws DocumentException {
+        File baseFile = getBaseFile();
+
+        List<File> poms = new LinkedList<>();
+        readPoms(baseFile, poms);
+
+        SAXReader reader = new SAXReader();
+
+        List<String> artifactIds = poms.stream()
+            .map(f -> {
+                try {
+                    return reader.read(f);
+                } catch (DocumentException e) {
+                    throw new RuntimeException(e);
+                }
+            })
+            .map(Document::getRootElement)
+            .map(doc -> doc.elementText("artifactId"))
+            .sorted()
+            .collect(Collectors.toList());
+
+        Assertions.assertEquals(poms.size(), artifactIds.size());
+
+        List<String> deployedArtifactIds = poms.stream()
+            .map(f -> {
+                try {
+                    return reader.read(f);
+                } catch (DocumentException e) {
+                    throw new RuntimeException(e);
+                }
+            })
+            .map(Document::getRootElement)
+            .filter(doc -> !Objects.equals("pom", 
doc.elementText("packaging")))
+            .filter(doc -> Objects.isNull(doc.element("properties")) ||
+                (!Objects.equals("true", 
doc.element("properties").elementText("skip_maven_deploy")) &&
+                    !Objects.equals("true", 
doc.element("properties").elementText("maven.deploy.skip"))))
+            .map(doc -> doc.elementText("artifactId"))
+            .sorted()
+            .collect(Collectors.toList());
+
+        String dubboAllPath = "dubbo-distribution/dubbo-all/pom.xml";
+        Document dubboAll = reader.read(new File(getBaseFile(), dubboAllPath));
+        List<String> artifactIdsInDubboAll = dubboAll.getRootElement()
+            .element("dependencies")
+            .elements("dependency")
+            .stream()
+            .map(ele -> ele.elementText("artifactId"))
+            .collect(Collectors.toList());
+
+        List<String> expectedArtifactIds = new 
LinkedList<>(deployedArtifactIds);
+        expectedArtifactIds.removeAll(artifactIdsInDubboAll);
+        expectedArtifactIds.removeIf(artifactId -> 
ignoredModules.stream().anyMatch(pattern -> 
pattern.matcher(artifactId).matches()));
+        expectedArtifactIds.removeIf(artifactId -> 
ignoredModulesInDubboAll.stream().anyMatch(pattern -> 
pattern.matcher(artifactId).matches()));
+
+        Assertions.assertTrue(expectedArtifactIds.isEmpty(), "Newly created 
modules must be added to dubbo-all(dubbo-distribution/dubbo-all/pom.xml). Found 
modules: " + expectedArtifactIds);
+
+        List<String> unexpectedArtifactIds = new 
LinkedList<>(artifactIdsInDubboAll);
+        unexpectedArtifactIds.removeIf(artifactId -> 
!artifactIds.contains(artifactId));
+        unexpectedArtifactIds.removeAll(deployedArtifactIds);
+        Assertions.assertTrue(unexpectedArtifactIds.isEmpty(), "Undeploy 
dependencies should not be added to 
dubbo-all(dubbo-distribution/dubbo-all/pom.xml). Found modules: " + 
unexpectedArtifactIds);
+
+        unexpectedArtifactIds = new LinkedList<>();
+        for (String artifactId : artifactIdsInDubboAll) {
+            if (!artifactIds.contains(artifactId)) {
+                continue;
+            }
+            if (ignoredModules.stream().anyMatch(pattern -> 
pattern.matcher(artifactId).matches())) {
+                unexpectedArtifactIds.add(artifactId);
+            }
+            if (ignoredModulesInDubboAll.stream().anyMatch(pattern -> 
pattern.matcher(artifactId).matches())) {
+                unexpectedArtifactIds.add(artifactId);
+            }
+        }
+        Assertions.assertTrue(unexpectedArtifactIds.isEmpty(), "Unexpected 
dependencies should not be added to 
dubbo-all(dubbo-distribution/dubbo-all/pom.xml). Found modules: " + 
unexpectedArtifactIds);
+    }
+
+    @Test
+    public void checkDubboAllShade() throws DocumentException {
+        File baseFile = getBaseFile();
+
+        List<File> poms = new LinkedList<>();
+        readPoms(baseFile, poms);
+
+        SAXReader reader = new SAXReader();
+
+        List<String> artifactIds = poms.stream()
+            .map(f -> {
+                try {
+                    return reader.read(f);
+                } catch (DocumentException e) {
+                    throw new RuntimeException(e);
+                }
+            })
+            .map(Document::getRootElement)
+            .map(doc -> doc.elementText("artifactId"))
+            .sorted()
+            .collect(Collectors.toList());
+
+        Assertions.assertEquals(poms.size(), artifactIds.size());
+
+        List<String> deployedArtifactIds = poms.stream()
+            .map(f -> {
+                try {
+                    return reader.read(f);
+                } catch (DocumentException e) {
+                    throw new RuntimeException(e);
+                }
+            })
+            .map(Document::getRootElement)
+            .filter(doc -> Objects.isNull(doc.element("properties")) ||
+                (!Objects.equals("true", 
doc.element("properties").elementText("skip_maven_deploy")) &&
+                    !Objects.equals("true", 
doc.element("properties").elementText("maven.deploy.skip"))))
+            .filter(doc -> !Objects.equals("pom", 
doc.elementText("packaging")))
+            .map(doc -> doc.elementText("artifactId"))
+            .sorted()
+            .collect(Collectors.toList());
+
+        String dubboAllPath = "dubbo-distribution/dubbo-all/pom.xml";
+        Document dubboAll = reader.read(new File(getBaseFile(), dubboAllPath));
+        List<String> artifactIdsInDubboAll = dubboAll.getRootElement()
+            .element("build")
+            .element("plugins")
+            .elements("plugin")
+            .stream()
+            .filter(ele -> 
ele.elementText("artifactId").equals("maven-shade-plugin"))
+            .map(ele -> ele.element("executions"))
+            .map(ele -> ele.elements("execution"))
+            .flatMap(Collection::stream)
+            .filter(ele -> ele.elementText("phase").equals("package"))
+            .map(ele -> ele.element("configuration"))
+            .map(ele -> ele.element("artifactSet"))
+            .map(ele -> ele.element("includes"))
+            .map(ele -> ele.elements("include"))
+            .flatMap(Collection::stream)
+            .map(Element::getText)
+            .filter(artifactId -> artifactId.startsWith("org.apache.dubbo:"))
+            .map(artifactId -> 
artifactId.substring("org.apache.dubbo:".length()))
+            .collect(Collectors.toList());
+
+        List<String> expectedArtifactIds = new 
LinkedList<>(deployedArtifactIds);
+        expectedArtifactIds.removeAll(artifactIdsInDubboAll);
+        expectedArtifactIds.removeIf(artifactId -> 
ignoredModules.stream().anyMatch(pattern -> 
pattern.matcher(artifactId).matches()));
+        expectedArtifactIds.removeIf(artifactId -> 
ignoredModulesInDubboAll.stream().anyMatch(pattern -> 
pattern.matcher(artifactId).matches()));
+
+        Assertions.assertTrue(expectedArtifactIds.isEmpty(), "Newly created 
modules must be added to dubbo-all (dubbo-distribution/dubbo-all/pom.xml in 
shade plugin). Found modules: " + expectedArtifactIds);
+
+        List<String> unexpectedArtifactIds = new 
LinkedList<>(artifactIdsInDubboAll);
+        unexpectedArtifactIds.removeIf(artifactId -> 
!artifactIds.contains(artifactId));
+        unexpectedArtifactIds.removeAll(deployedArtifactIds);
+        Assertions.assertTrue(unexpectedArtifactIds.isEmpty(), "Undeploy 
dependencies should not be added to dubbo-all 
(dubbo-distribution/dubbo-all/pom.xml in shade plugin). Found modules: " + 
unexpectedArtifactIds);
+
+        unexpectedArtifactIds = new LinkedList<>();
+        for (String artifactId : artifactIdsInDubboAll) {
+            if (!artifactIds.contains(artifactId)) {
+                continue;
+            }
+            if (ignoredModules.stream().anyMatch(pattern -> 
pattern.matcher(artifactId).matches())) {
+                unexpectedArtifactIds.add(artifactId);
+            }
+            if (ignoredModulesInDubboAll.stream().anyMatch(pattern -> 
pattern.matcher(artifactId).matches())) {
+                unexpectedArtifactIds.add(artifactId);
+            }
+        }
+        Assertions.assertTrue(unexpectedArtifactIds.isEmpty(), "Unexpected 
dependencies should not be added to dubbo-all 
(dubbo-distribution/dubbo-all/pom.xml in shade plugin). Found modules: " + 
unexpectedArtifactIds);
+    }
+
+    @Test
+    public void checkDubboAllTransform() throws DocumentException {
+        File baseFile = getBaseFile();
+        List<String> spis = new LinkedList<>();
+        readSPI(baseFile, spis);
+
+        String dubboAllPath = "dubbo-distribution/dubbo-all/pom.xml";
+
+        SAXReader reader = new SAXReader();
+        Document dubboAll = reader.read(new File(baseFile, dubboAllPath));
+
+        List<String> transformsInDubboAll = dubboAll.getRootElement()
+            .element("build")
+            .element("plugins")
+            .elements("plugin")
+            .stream()
+            .filter(ele -> 
ele.elementText("artifactId").equals("maven-shade-plugin"))
+            .map(ele -> ele.element("executions"))
+            .map(ele -> ele.elements("execution"))
+            .flatMap(Collection::stream)
+            .filter(ele -> ele.elementText("phase").equals("package"))
+            .map(ele -> ele.element("configuration"))
+            .map(ele -> ele.element("transformers"))
+            .map(ele -> ele.elements("transformer"))
+            .flatMap(Collection::stream)
+            .map(ele -> ele.elementText("resource"))
+            .map(String::trim)
+            .map(resource -> resource.substring(resource.lastIndexOf("/") + 1))
+            .collect(Collectors.toList());
+
+        List<String> expectedSpis = new LinkedList<>(spis);
+        expectedSpis.removeAll(transformsInDubboAll);
+        Assertions.assertTrue(expectedSpis.isEmpty(), "Newly created SPI 
interface must be added to dubbo-all(dubbo-distribution/dubbo-all/pom.xml in 
shade plugin) to being transformed. Found spis: " + expectedSpis);
+
+        List<String> unexpectedSpis = new LinkedList<>(transformsInDubboAll);
+        unexpectedSpis.removeAll(spis);
+        Assertions.assertTrue(unexpectedSpis.isEmpty(), "Class without `@SPI` 
declaration should not be added to 
dubbo-all(dubbo-distribution/dubbo-all/pom.xml in shade plugin) to being 
transformed. Found spis: " + unexpectedSpis);
+    }
+
+    @Test
+    public void checkSpiFiles() {
+        File baseFile = getBaseFile();
+        List<String> spis = new LinkedList<>();
+        readSPI(baseFile, spis);
+
+        Map<File, String> spiResources = new HashMap<>();
+        readSPIResource(baseFile, spiResources);
+        Map<File, String> copyOfSpis = new HashMap<>(spiResources);
+        copyOfSpis.entrySet().removeIf(entry -> 
spis.contains(entry.getValue()));
+        Assertions.assertTrue(copyOfSpis.isEmpty(), "Newly created spi 
profiles must have a valid class declared with `@SPI`. Found spi profiles: " + 
copyOfSpis.keySet());
+
+        List<File> unexpectedSpis = new LinkedList<>();
+        readSPIUnexpectedResource(baseFile, unexpectedSpis);
+        unexpectedSpis.removeIf(file -> 
file.getAbsolutePath().contains("dubbo-common/src/main/resources/META-INF/services/org.apache.dubbo.common.extension.LoadingStrategy"));
+        Assertions.assertTrue(unexpectedSpis.isEmpty(), "Dubbo native provided 
spi profiles must filed in `META-INF/dubbo/internal`. Please move to proper 
folder . Found spis: " + unexpectedSpis);
+    }
+
+    private static File getBaseFile() {
+        File baseFile = new File(new File("").getAbsolutePath());
+        while (baseFile != null) {
+            if (new File(baseFile, ".asf.yaml").exists()) {
+                break;
+            }
+            baseFile = baseFile.getParentFile();
+        }
+        Assertions.assertNotNull(baseFile, "Can not find base dir");
+
+        System.out.println("Found Project Base Path: " + 
baseFile.getAbsolutePath());
+        return baseFile;
+    }
+
+    public void readPoms(File path, List<File> poms) {
+        if (path.isDirectory()) {
+            File[] files = path.listFiles();
+            if (files != null) {
+                for (File file : files) {
+                    readPoms(file, poms);
+                }
+            }
+        } else if (path.isFile()) {
+            if (path.getAbsolutePath().contains("target")) {
+                return;
+            }
+            if (path.getName().equals("pom.xml")) {
+                poms.add(path);
+            }
+        }
+    }
+
+    public void readSPI(File path, List<String> spis) {
+        if (path.isDirectory()) {
+            File[] files = path.listFiles();
+            if (files != null) {
+                for (File file : files) {
+                    readSPI(file, spis);
+                }
+            }
+        } else if (path.isFile()) {
+            if (path.getAbsolutePath().contains("target")) {
+                return;
+            }
+            if (path.getAbsolutePath().contains("src/main/java")) {
+                String content;
+                try {
+                    content = FileUtils.readFileToString(path, 
StandardCharsets.UTF_8);
+                } catch (IOException e) {
+                    throw new RuntimeException(e);
+                }
+                if (content != null && content.contains("@SPI")) {
+                    String absolutePath = path.getAbsolutePath();
+                    absolutePath = 
absolutePath.substring(absolutePath.lastIndexOf("src/main/java/") + 
"src/main/java/".length());
+                    absolutePath = absolutePath.substring(0, 
absolutePath.lastIndexOf(".java"));
+                    absolutePath = absolutePath.replaceAll("/", ".");
+                    spis.add(absolutePath);
+                }
+            }
+        }
+    }
+
+    public void readSPIResource(File path, Map<File, String> spis) {
+        if (path.isDirectory()) {
+            File[] files = path.listFiles();
+            if (files != null) {
+                for (File file : files) {
+                    readSPIResource(file, spis);
+                }
+            }
+        } else if (path.isFile()) {
+            if (path.getAbsolutePath().contains("target")) {
+                return;
+            }
+            if 
(path.getAbsolutePath().contains("src/main/resources/META-INF/dubbo/internal/"))
 {
+                String absolutePath = path.getAbsolutePath();
+                absolutePath = 
absolutePath.substring(absolutePath.lastIndexOf("src/main/resources/META-INF/dubbo/internal/")
 + "src/main/resources/META-INF/dubbo/internal/".length());
+                absolutePath = absolutePath.replaceAll("/", ".");
+                spis.put(path, absolutePath);
+            }
+        }
+    }
+
+    public void readSPIUnexpectedResource(File path, List<File> spis) {
+        if (path.isDirectory()) {
+            File[] files = path.listFiles();
+            if (files != null) {
+                for (File file : files) {
+                    readSPIUnexpectedResource(file, spis);
+                }
+            }
+        } else if (path.isFile()) {
+            if (path.getAbsolutePath().contains("target")) {
+                return;
+            }
+            if 
(path.getAbsolutePath().contains("src/main/resources/META-INF/dubbo/org.apache.dubbo"))
 {
+                spis.add(path);
+            }
+            if 
(path.getAbsolutePath().contains("src/main/resources/META-INF/dubbo/com.alibaba.dubbo"))
 {
+                spis.add(path);
+            }
+            if 
(path.getAbsolutePath().contains("src/main/resources/META-INF/services/org.apache.dubbo"))
 {
+                spis.add(path);
+            }
+            if 
(path.getAbsolutePath().contains("src/main/resources/META-INF/services/com.alibaba.dubbo"))
 {
+                spis.add(path);
+            }
+
+            if 
(path.getAbsolutePath().contains("src/main/resources/META-INF.dubbo/org.apache.dubbo"))
 {
+                spis.add(path);
+            }
+            if 
(path.getAbsolutePath().contains("src/main/resources/META-INF.dubbo/com.alibaba.dubbo"))
 {
+                spis.add(path);
+            }
+            if 
(path.getAbsolutePath().contains("src/main/resources/META-INF.services/org.apache.dubbo"))
 {
+                spis.add(path);
+            }
+            if 
(path.getAbsolutePath().contains("src/main/resources/META-INF.services/com.alibaba.dubbo"))
 {
+                spis.add(path);
+            }
+            if 
(path.getAbsolutePath().contains("src/main/resources/META-INF.dubbo.internal/org.apache.dubbo"))
 {
+                spis.add(path);
+            }
+            if 
(path.getAbsolutePath().contains("src/main/resources/META-INF.dubbo.internal/com.alibaba.dubbo"))
 {
+                spis.add(path);
+            }
+        }
+    }
+}
diff --git a/dubbo-test/pom.xml b/dubbo-test/pom.xml
index ee20080694..5d5a256394 100644
--- a/dubbo-test/pom.xml
+++ b/dubbo-test/pom.xml
@@ -34,6 +34,8 @@
         <module>dubbo-test-spring3.2</module>
         <module>dubbo-test-spring4.1</module>
         <module>dubbo-test-spring4.2</module>
+        <module>dubbo-dependencies-all</module>
+        <module>dubbo-test-modules</module>
     </modules>
 
     <properties>
diff --git 
a/dubbo-xds/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery
 
b/dubbo-xds/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery
deleted file mode 100644
index daf1bb1d13..0000000000
--- 
a/dubbo-xds/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.registry.client.ServiceDiscovery
+++ /dev/null
@@ -1 +0,0 @@
-xds=org.apache.dubbo.registry.xds.XdsServiceDiscovery
diff --git a/pom.xml b/pom.xml
index c8459669b7..7123f6053f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -599,8 +599,16 @@
                         <id>report-aggregate</id>
                         <phase>verify</phase>
                         <goals>
+                            <goal>report</goal>
                             <goal>report-aggregate</goal>
                         </goals>
+                        <configuration>
+                            <includes>
+                                <include>target/classes/**/*</include>
+                                <include>target/classes/**</include>
+                                <include>**/*</include>
+                            </includes>
+                        </configuration>
                     </execution>
                 </executions>
             </plugin>

Reply via email to