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

songxiaosheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-spi-extensions.git


The following commit(s) were added to refs/heads/master by this push:
     new a7aeaf1  build: Add GitHub Actions workflow (#300)
a7aeaf1 is described below

commit a7aeaf180dc565543d60aab5b1670dd9b7da2f54
Author: aofall <[email protected]>
AuthorDate: Sun Mar 31 14:36:51 2024 +0800

    build: Add GitHub Actions workflow (#300)
    
    * build: upload GitHub ci/cd workflow for push/pr
    
    * build: remove extra spotless format check
    
    * build: create license check config file
    
    * build: add some ignore file for license check
    
    * fix: prepare build-tools
    
    * fix: setup jdk error
    
    * build: add scheduled workflow
    
    * chore: fix missed or incorrect ASF license
    
    * build: add release workflow
    
    * try to fix cache key not found
    
    * try to fix cache key not found
    
    * fix coverage result filename conflict
---
 .codecov.yml                                       |  15 +
 .github/workflows/build-and-test-pr.yml            | 361 ++++++++++++++++++++
 .github/workflows/build-and-test-scheduled-3.1.yml | 365 +++++++++++++++++++++
 .github/workflows/build-and-test-scheduled-3.2.yml | 365 +++++++++++++++++++++
 .../workflows/build-and-test-scheduled-main.yml    | 365 +++++++++++++++++++++
 .github/workflows/ci.yml                           |  68 ----
 .github/workflows/release-test.yml                 | 365 +++++++++++++++++++++
 .licenserc.yaml                                    | 213 ++++++++++++
 .../cluster/loadbalance/LoadBalanceBaseTest.java   |   2 +-
 .../loadbalance/PeakEwmaLoadBalanceTest.java       |   2 +-
 .../test/resources/security/serialize.allowlist    |  19 ++
 11 files changed, 2070 insertions(+), 70 deletions(-)

diff --git a/.codecov.yml b/.codecov.yml
index 1acf443..8a9fd1b 100644
--- a/.codecov.yml
+++ b/.codecov.yml
@@ -1,3 +1,18 @@
+# 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.
+#
 coverage:
   status:
     # pull-requests only
diff --git a/.github/workflows/build-and-test-pr.yml 
b/.github/workflows/build-and-test-pr.yml
new file mode 100644
index 0000000..fd9a81a
--- /dev/null
+++ b/.github/workflows/build-and-test-pr.yml
@@ -0,0 +1,361 @@
+name: Build and Test For PR
+
+on: [push, pull_request, workflow_dispatch]
+
+permissions:
+  contents: read
+
+env:
+  FORK_COUNT: 2
+  FAIL_FAST: 0
+  SHOW_ERROR_DETAIL: 1
+  #multi-version size limit
+  VERSIONS_LIMIT: 4
+  JACOCO_ENABLE: true
+  CANDIDATE_VERSIONS: '
+    spring.version:5.3.24;
+    spring-boot.version:2.7.6;
+    '
+
+jobs:
+  # Check ASF License
+  check-license:
+    name: "Check License"
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+      - name: Check License
+        uses: apache/skywalking-eyes@e1a02359b239bd28de3f6d35fdc870250fa513d5
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+      - name: "Set up JDK 21"
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 21
+      - name: Restore Maven local repository cache
+        uses: actions/cache@v3
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+          restore-keys: |
+            ${{ runner.os }}-maven-
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+      - name: Check Dependencies' License
+        uses: 
apache/skywalking-eyes/dependency@e1a02359b239bd28de3f6d35fdc870250fa513d5
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          config: .licenserc.yaml
+          mode: check
+  # Build dubbo-build-tool
+  build-tools:
+    name: "Build-tools"
+    needs: check-license
+    runs-on: ubuntu-latest
+    outputs:
+      cache-key: ${{ steps.dubbo-build-tools.cache }}
+    steps:
+      - uses: actions/checkout@v4
+        name: build tools
+        with:
+          repository: 'apache/dubbo'
+          ref: '3.2'
+          path: dubbo
+      - name: "Set up JDK 21"
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 21
+      - uses: actions/cache@v3
+        name: "Cache local Maven repository"
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+          restore-keys: |
+            ${{ runner.os }}-maven-
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+      - name: "Build tools"
+        run: |
+          cd ./dubbo
+          ./mvnw --batch-mode -U -e --no-transfer-progress install -pl 
dubbo-build-tools -am -DskipTests=true
+  # Build from source code
+  build-source:
+    name: "Build Dubbo-SPI-Extensions"
+    needs: [check-license, build-tools]
+    runs-on: ubuntu-latest
+    # output dubbo-spi-extensions version to others jobs
+    outputs:
+      version: ${{ steps.dubbo-spi-extensions-version.outputs.version }}
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          path: dubbo-spi-extensions
+      - uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 8
+      - uses: actions/cache@v3
+        name: "Cache local Maven repository"
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}-${{ 
github.run_id }}
+          restore-keys: |
+            ${{ runner.os }}-maven-
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+      - name: "Compile Dubbo-SPI-Extensions (Linux)"
+        run: |
+          cd ./dubbo-spi-extensions
+          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast -T 2C clean compile -DskipTests=true -DskipIntegrationTests=true 
-Dcheckstyle.skip=true -Dcheckstyle_unix.skip=true -Drat.skip=true 
-Dmaven.javadoc.skip=true
+      - name: "Build Dubbo-SPI-Extensions with Maven"
+        run: |
+          cd ./dubbo-spi-extensions
+          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast clean source:jar install -Pjacoco,checkstyle 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Dmaven.wagon.http.retryHandler.count=5 -Dmaven.test.skip=true 
-Dmaven.test.skip.exec=true -DembeddedZookeeperPath=${{ github.workspace 
}}/.tmp/zookeeper
+      - name: "Pack class result"
+        run: |
+          shopt -s globstar
+          zip ${{ github.workspace }}/class.zip **/target/classes/* -r
+      - name: "Upload class result"
+        uses: actions/upload-artifact@v4
+        with:
+          name: "class-file"
+          path: ${{ github.workspace }}/class.zip
+      - name: "Pack checkstyle file if failure"
+        if: failure()
+        run: zip ${{ github.workspace }}/checkstyle.zip *checkstyle* -r
+      - name: "Upload checkstyle file if failure"
+        if: failure()
+        uses: actions/upload-artifact@v4
+        with:
+          name: "checkstyle-file"
+          path: ${{ github.workspace }}/checkstyle.zip
+      - name: "Upload coverage to Codecov"
+        uses: codecov/codecov-action@v4
+      - name: "Calculate Dubbo-SPI-Extensions Version"
+        id: dubbo-spi-extensions-version
+        run: |
+          REVISION=`awk 
'/<revision>[^<]+<\/revision>/{gsub(/<revision>|<\/revision>/,"",$1);print 
$1;exit;}' ./dubbo-spi-extensions/pom.xml`
+          echo "version=$REVISION" >> $GITHUB_OUTPUT
+          echo "dubbo-spi-extensions version: $REVISION"
+  # Download dependencies Prepare for unit test
+  unit-test-prepare:
+    name: "Preparation for Unit Test"
+    needs: [check-license, build-source]
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+    env:
+      ZOOKEEPER_VERSION: 3.6.3
+    steps:
+      - uses: actions/cache@v3
+        name: "Cache zookeeper binary archive"
+        id: "cache-zookeeper"
+        with:
+          path: ${{ github.workspace }}/.tmp/zookeeper
+          key: zookeeper-${{ runner.os }}-${{ env.ZOOKEEPER_VERSION }}
+          restore-keys: |
+            zookeeper-${{ runner.os }}-${{ env.ZOOKEEPER_VERSION }}
+      - name: "Set up msys2 if necessary"
+        if: ${{ startsWith( matrix.os, 'windows') && 
steps.cache-zookeeper.outputs.cache-hit != 'true' }}
+        uses: msys2/setup-msys2@v2
+        with:
+          release: false  # support cache, see 
https://github.com/msys2/setup-msys2#context
+      - name: "Download zookeeper binary archive in Linux OS"
+        run: |
+          mkdir -p ${{ github.workspace }}/.tmp/zookeeper
+          wget -c https://archive.apache.org/dist/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c https://apache.website-solution.net/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c http://apache.stu.edu.tw/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c http://ftp.jaist.ac.jp/pub/apache/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c http://apache.mirror.cdnetworks.com/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c http://mirror.apache-kr.org/apache/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz
+          echo "list the downloaded zookeeper binary archive"
+          ls -al ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz
+      - uses: actions/cache@v3
+        name: "Cache secret key"
+        id: "cache-secret-cert"
+        with:
+          path: ${{ github.workspace }}/.tmp/rsa
+          key: secret-rsa-${{ runner.os }}-${{ github.run_id }}
+      - name: "Create Secret"
+        run: |
+          mkdir -p ${{ github.workspace }}/.tmp/rsa
+          cd ${{ github.workspace }}/.tmp/rsa
+          openssl genrsa -out rsa_private.pem 1024
+          openssl rsa -in rsa_private.pem -pubout -out rsa_public.pem
+          echo "Current workflow run id: ${{ github.run_id }}"
+          echo "Start Print Rsa Public Key ---"
+          cat rsa_public.pem
+          echo "--- End Print Rsa Public Key"
+  # Start unit test
+  unit-test-jdk8:
+    needs: [check-license, build-source, unit-test-prepare]
+    name: "Unit Test On ubuntu-latest with JDK8"
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+    env:
+      DISABLE_FILE_SYSTEM_TEST: true
+      CURRENT_ROLE: ${{ matrix.case-role }}
+      DUBBO_DEFAULT_SERIALIZATION: fastjson2
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+      - name: "Set up JDK ${{ matrix.jdk }}"
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 8
+      - uses: actions/cache@v3
+        name: "Cache local Maven repository"
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}-${{ 
github.run_id }}
+          restore-keys: |
+            ${{ runner.os }}-maven-
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+      - uses: actions/cache@v3
+        name: "Cache zookeeper binary archive"
+        id: "cache-zookeeper"
+        with:
+          path: ${{ github.workspace }}/.tmp/zookeeper
+          key: zookeeper-${{ runner.os }}-${{ env.ZOOKEEPER_VERSION }}
+          restore-keys: |
+            zookeeper-${{ runner.os }}-
+      - uses: actions/cache@v3
+        name: "Cache secret key"
+        id: "cache-secret-cert"
+        with:
+          path: ${{ github.workspace }}/.tmp/rsa
+          key: secret-rsa-${{ runner.os }}-${{ github.run_id }}
+      #      - name: "Get sonarcloud token"
+      #        if: ${{ github.repository == 'apache/dubbo-spi-extensions' }}
+      #        run: |
+      #          curl "http://dubbo-vm.apache.org:8000/token?workflow_id=${{ 
github.run_id }}" -o ${{ github.workspace }}/.tmp/encrypted-sonarcloud-token
+      #          openssl rsautl -decrypt -in ${{ github.workspace 
}}/.tmp/encrypted-sonarcloud-token -out ${{ github.workspace 
}}/.tmp/decrypted-sonarcloud-token -inkey ${{ github.workspace 
}}/.tmp/rsa/rsa_private.pem
+      #      - name: "Test with Maven with SonarCloud Scan"
+      #        if: ${{ github.repository == 'apache/dubbo-spi-extensions' }}
+      #        timeout-minutes: 70
+      #        env:
+      #          # Needed to get some information about the pull request, if 
any
+      #          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+      #        run: |
+      #          source ${{ github.workspace }}/.tmp/decrypted-sonarcloud-token
+      #          ./mvnw --batch-mode --no-snapshot-updates -e 
--no-transfer-progress --fail-fast clean test verify 
org.sonarsource.scanner.maven:sonar-maven-plugin:sonar 
-Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 
-Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=apache 
-Dsonar.projectKey=apache_dubbo -DtrimStackTrace=false 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false 
-DskipIntegrationTests=false -Dcheckstyle.skip [...]
+      - name: "Test with Maven without SonarCloud Scan"
+        timeout-minutes: 70
+        run: |
+          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast clean test verify 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 -DtrimStackTrace=false 
-Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false 
-DskipIntegrationTests=false -Dcheckstyle.skip=false 
-Dcheckstyle_unix.skip=false -Drat.skip=false -Dmaven.javadoc.skip=true 
-DembeddedZookeeperPath=${{ github.workspace }}/.tmp/zookeeper
+      - name: "Upload coverage result"
+        uses: actions/upload-artifact@v4
+        with:
+          name: coverage-result-jdk8
+          path: "**/target/site/**/jacoco.xml"
+  unit-test-jdk11:
+    needs: [ check-license, build-source, unit-test-prepare ]
+    name: "Unit Test On ubuntu-latest with JDK11"
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+    env:
+      DISABLE_FILE_SYSTEM_TEST: true
+      CURRENT_ROLE: ${{ matrix.case-role }}
+      DUBBO_DEFAULT_SERIALIZATION: fastjson2
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+      - name: "Set up JDK ${{ matrix.jdk }}"
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 11
+      - uses: actions/cache@v3
+        name: "Cache local Maven repository"
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}-${{ 
github.run_id }}
+          restore-keys: |
+            ${{ runner.os }}-maven-
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+      - uses: actions/cache@v3
+        name: "Cache zookeeper binary archive"
+        id: "cache-zookeeper"
+        with:
+          path: ${{ github.workspace }}/.tmp/zookeeper
+          key: zookeeper-${{ runner.os }}-${{ env.ZOOKEEPER_VERSION }}
+          restore-keys: |
+            zookeeper-${{ runner.os }}-
+      - uses: actions/cache@v3
+        name: "Cache secret key"
+        id: "cache-secret-cert"
+        with:
+          path: ${{ github.workspace }}/.tmp/rsa
+          key: secret-rsa-${{ runner.os }}-${{ github.run_id }}
+      #      - name: "Get sonarcloud token"
+      #        if: ${{ github.repository == 'apache/dubbo-spi-extensions' }}
+      #        run: |
+      #          curl "http://dubbo-vm.apache.org:8000/token?workflow_id=${{ 
github.run_id }}" -o ${{ github.workspace }}/.tmp/encrypted-sonarcloud-token
+      #          openssl rsautl -decrypt -in ${{ github.workspace 
}}/.tmp/encrypted-sonarcloud-token -out ${{ github.workspace 
}}/.tmp/decrypted-sonarcloud-token -inkey ${{ github.workspace 
}}/.tmp/rsa/rsa_private.pem
+      #      - name: "Test with Maven with SonarCloud Scan"
+      #        if: ${{ github.repository == 'apache/dubbo-spi-extensions' }}
+      #        timeout-minutes: 70
+      #        env:
+      #          # Needed to get some information about the pull request, if 
any
+      #          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+      #        run: |
+      #          source ${{ github.workspace }}/.tmp/decrypted-sonarcloud-token
+      #          ./mvnw --batch-mode --no-snapshot-updates -e 
--no-transfer-progress --fail-fast clean test verify 
org.sonarsource.scanner.maven:sonar-maven-plugin:sonar 
-Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 
-Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=apache 
-Dsonar.projectKey=apache_dubbo -DtrimStackTrace=false 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false 
-DskipIntegrationTests=false -Dcheckstyle.skip [...]
+      - name: "Test with Maven without SonarCloud Scan"
+        timeout-minutes: 70
+        run: |
+          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast clean test verify 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 -DtrimStackTrace=false 
-Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false 
-DskipIntegrationTests=false -Dcheckstyle.skip=false 
-Dcheckstyle_unix.skip=false -Drat.skip=false -Dmaven.javadoc.skip=true 
-DembeddedZookeeperPath=${{ github.workspace }}/.tmp/zookeeper
+      - name: "Upload coverage result"
+        uses: actions/upload-artifact@v4
+        with:
+          name: coverage-result-jdk11
+          path: "**/target/site/**/jacoco.xml"
+
+#  error-code-inspecting:
+#    needs: [check-license, build-tools]
+#    runs-on: ubuntu-latest
+#    steps:
+#      - uses: actions/checkout@v4
+#        with:
+#          path: "./dubbo-spi-extensions"
+#      - uses: actions/checkout@v4
+#        with:
+#          repository: 'apache/dubbo-test-tools'
+#          ref: main
+#          path: "./dubbo-test-tools"
+#      - name: "Set up JDK 21"
+#        uses: actions/setup-java@v4
+#        with:
+#          distribution: 'zulu'
+#          java-version: 21
+#      - name: Restore Maven local repository cache
+#        uses: actions/cache@v3
+#        with:
+#          path: ~/.m2/repository
+#          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+#          restore-keys: |
+#            ${{ runner.os }}-maven-
+#            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+#      - name: "Compile Dubbo-SPI-Extensions (Linux)"
+#        run: |
+#          cd ${{ github.workspace }}/dubbo-spi-extensions
+#          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast -T 2C clean install -DskipTests=true -DskipIntegrationTests=true 
-Dcheckstyle.skip=true -Dcheckstyle_unix.skip=true -Drat.skip=true 
-Dmaven.javadoc.skip=true
+#      - name: "Run Error Code Inspecting"
+#        env:
+#          DUBBO_ECI_REPORT_AS_ERROR: true
+#        run: |
+#          cd ${{ github.workspace 
}}/dubbo-test-tools/dubbo-error-code-inspector
+#          ../mvnw --batch-mode --no-snapshot-updates -e 
--no-transfer-progress --fail-fast -T 2C package exec:java 
-Ddubbo.eci.report-as-error=${DUBBO_ECI_REPORT_AS_ERROR} -Dmaven.test.skip=true 
-Dmaven.test.skip.exec=true -Ddubbo.eci.path=${{ github.workspace 
}}/dubbo-spi-extensions
+#      - name: "Upload error code inspection result"
+#        # always() should not be used here, since we don't need to handle the 
'canceled' situation.
+#        if: ${{ success() || failure() }}
+#        uses: actions/upload-artifact@v4
+#        with:
+#          name: "error-inspection-result"
+#          path: ${{ github.workspace 
}}/dubbo-test-tools/dubbo-error-code-inspector/error-inspection-result.txt
diff --git a/.github/workflows/build-and-test-scheduled-3.1.yml 
b/.github/workflows/build-and-test-scheduled-3.1.yml
new file mode 100644
index 0000000..051d617
--- /dev/null
+++ b/.github/workflows/build-and-test-scheduled-3.1.yml
@@ -0,0 +1,365 @@
+name: Build and Test For PR
+
+on:
+  schedule:
+    - cron: '0 0/6 * * *'
+  workflow_dispatch:
+
+permissions:
+  contents: read
+
+env:
+  FORK_COUNT: 2
+  FAIL_FAST: 0
+  SHOW_ERROR_DETAIL: 1
+  #multi-version size limit
+  VERSIONS_LIMIT: 4
+  JACOCO_ENABLE: true
+  CANDIDATE_VERSIONS: '
+    spring.version:5.3.24;
+    spring-boot.version:2.7.6;
+    '
+
+jobs:
+  # Check ASF License
+  check-license:
+    name: "Check License"
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+      - name: Check License
+        uses: apache/skywalking-eyes@e1a02359b239bd28de3f6d35fdc870250fa513d5
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+      - name: "Set up JDK 21"
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 21
+      - name: Restore Maven local repository cache
+        uses: actions/cache@v3
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+          restore-keys: |
+            ${{ runner.os }}-maven-
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+      - name: Check Dependencies' License
+        uses: 
apache/skywalking-eyes/dependency@e1a02359b239bd28de3f6d35fdc870250fa513d5
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          config: .licenserc.yaml
+          mode: check
+  # Build dubbo-build-tool
+  build-tools:
+    name: "Build-tools"
+    needs: check-license
+    runs-on: ubuntu-latest
+    outputs:
+      cache-key: ${{ steps.dubbo-build-tools.cache }}
+    steps:
+      - uses: actions/checkout@v4
+        name: build tools
+        with:
+          repository: 'apache/dubbo'
+          ref: '3.1'
+          path: dubbo
+      - name: "Set up JDK 21"
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 21
+      - uses: actions/cache@v3
+        name: "Cache local Maven repository"
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+          restore-keys: |
+            ${{ runner.os }}-maven-
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+      - name: "Build tools"
+        run: |
+          cd ./dubbo
+          ./mvnw --batch-mode -U -e --no-transfer-progress install -pl 
dubbo-build-tools -am -DskipTests=true
+  # Build from source code
+  build-source:
+    name: "Build Dubbo-SPI-Extensions"
+    needs: [check-license, build-tools]
+    runs-on: ubuntu-latest
+    # output dubbo-spi-extensions version to others jobs
+    outputs:
+      version: ${{ steps.dubbo-spi-extensions-version.outputs.version }}
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          ref: "3.1.0"
+          path: dubbo-spi-extensions
+      - uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 8
+      - uses: actions/cache@v3
+        name: "Cache local Maven repository"
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}-${{ 
github.run_id }}
+          restore-keys: |
+            ${{ runner.os }}-maven-
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+      - name: "Compile Dubbo-SPI-Extensions (Linux)"
+        run: |
+          cd ./dubbo-spi-extensions
+          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast -T 2C clean compile -DskipTests=true -DskipIntegrationTests=true 
-Dcheckstyle.skip=true -Dcheckstyle_unix.skip=true -Drat.skip=true 
-Dmaven.javadoc.skip=true
+      - name: "Build Dubbo-SPI-Extensions with Maven"
+        run: |
+          cd ./dubbo-spi-extensions
+          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast clean source:jar install -Pjacoco,checkstyle 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Dmaven.wagon.http.retryHandler.count=5 -Dmaven.test.skip=true 
-Dmaven.test.skip.exec=true -DembeddedZookeeperPath=${{ github.workspace 
}}/.tmp/zookeeper
+      - name: "Pack class result"
+        run: |
+          shopt -s globstar
+          zip ${{ github.workspace }}/class.zip **/target/classes/* -r
+      - name: "Upload class result"
+        uses: actions/upload-artifact@v4
+        with:
+          name: "class-file"
+          path: ${{ github.workspace }}/class.zip
+      - name: "Pack checkstyle file if failure"
+        if: failure()
+        run: zip ${{ github.workspace }}/checkstyle.zip *checkstyle* -r
+      - name: "Upload checkstyle file if failure"
+        if: failure()
+        uses: actions/upload-artifact@v4
+        with:
+          name: "checkstyle-file"
+          path: ${{ github.workspace }}/checkstyle.zip
+      - name: "Upload coverage to Codecov"
+        uses: codecov/codecov-action@v4
+      - name: "Calculate Dubbo-SPI-Extensions Version"
+        id: dubbo-spi-extensions-version
+        run: |
+          REVISION=`awk 
'/<revision>[^<]+<\/revision>/{gsub(/<revision>|<\/revision>/,"",$1);print 
$1;exit;}' ./dubbo-spi-extensions/pom.xml`
+          echo "version=$REVISION" >> $GITHUB_OUTPUT
+          echo "dubbo-spi-extensions version: $REVISION"
+  # Download dependencies Prepare for unit test
+  unit-test-prepare:
+    name: "Preparation for Unit Test"
+    needs: [check-license, build-source]
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+    env:
+      ZOOKEEPER_VERSION: 3.6.3
+    steps:
+      - uses: actions/cache@v3
+        name: "Cache zookeeper binary archive"
+        id: "cache-zookeeper"
+        with:
+          path: ${{ github.workspace }}/.tmp/zookeeper
+          key: zookeeper-${{ runner.os }}-${{ env.ZOOKEEPER_VERSION }}
+          restore-keys: |
+            zookeeper-${{ runner.os }}-${{ env.ZOOKEEPER_VERSION }}
+      - name: "Set up msys2 if necessary"
+        if: ${{ startsWith( matrix.os, 'windows') && 
steps.cache-zookeeper.outputs.cache-hit != 'true' }}
+        uses: msys2/setup-msys2@v2
+        with:
+          release: false  # support cache, see 
https://github.com/msys2/setup-msys2#context
+      - name: "Download zookeeper binary archive in Linux OS"
+        run: |
+          mkdir -p ${{ github.workspace }}/.tmp/zookeeper
+          wget -c https://archive.apache.org/dist/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c https://apache.website-solution.net/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c http://apache.stu.edu.tw/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c http://ftp.jaist.ac.jp/pub/apache/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c http://apache.mirror.cdnetworks.com/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c http://mirror.apache-kr.org/apache/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz
+          echo "list the downloaded zookeeper binary archive"
+          ls -al ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz
+      - uses: actions/cache@v3
+        name: "Cache secret key"
+        id: "cache-secret-cert"
+        with:
+          path: ${{ github.workspace }}/.tmp/rsa
+          key: secret-rsa-${{ runner.os }}-${{ github.run_id }}
+      - name: "Create Secret"
+        run: |
+          mkdir -p ${{ github.workspace }}/.tmp/rsa
+          cd ${{ github.workspace }}/.tmp/rsa
+          openssl genrsa -out rsa_private.pem 1024
+          openssl rsa -in rsa_private.pem -pubout -out rsa_public.pem
+          echo "Current workflow run id: ${{ github.run_id }}"
+          echo "Start Print Rsa Public Key ---"
+          cat rsa_public.pem
+          echo "--- End Print Rsa Public Key"
+  # Start unit test
+  unit-test-jdk8:
+    needs: [check-license, build-source, unit-test-prepare]
+    name: "Unit Test On ubuntu-latest with JDK8"
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+    env:
+      DISABLE_FILE_SYSTEM_TEST: true
+      CURRENT_ROLE: ${{ matrix.case-role }}
+      DUBBO_DEFAULT_SERIALIZATION: fastjson2
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+      - name: "Set up JDK ${{ matrix.jdk }}"
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 8
+      - uses: actions/cache@v3
+        name: "Cache local Maven repository"
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}-${{ 
github.run_id }}
+          restore-keys: |
+            ${{ runner.os }}-maven-
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+      - uses: actions/cache@v3
+        name: "Cache zookeeper binary archive"
+        id: "cache-zookeeper"
+        with:
+          path: ${{ github.workspace }}/.tmp/zookeeper
+          key: zookeeper-${{ runner.os }}-${{ env.ZOOKEEPER_VERSION }}
+          restore-keys: |
+            zookeeper-${{ runner.os }}-
+      - uses: actions/cache@v3
+        name: "Cache secret key"
+        id: "cache-secret-cert"
+        with:
+          path: ${{ github.workspace }}/.tmp/rsa
+          key: secret-rsa-${{ runner.os }}-${{ github.run_id }}
+      #      - name: "Get sonarcloud token"
+      #        if: ${{ github.repository == 'apache/dubbo-spi-extensions' }}
+      #        run: |
+      #          curl "http://dubbo-vm.apache.org:8000/token?workflow_id=${{ 
github.run_id }}" -o ${{ github.workspace }}/.tmp/encrypted-sonarcloud-token
+      #          openssl rsautl -decrypt -in ${{ github.workspace 
}}/.tmp/encrypted-sonarcloud-token -out ${{ github.workspace 
}}/.tmp/decrypted-sonarcloud-token -inkey ${{ github.workspace 
}}/.tmp/rsa/rsa_private.pem
+      #      - name: "Test with Maven with SonarCloud Scan"
+      #        if: ${{ github.repository == 'apache/dubbo-spi-extensions' }}
+      #        timeout-minutes: 70
+      #        env:
+      #          # Needed to get some information about the pull request, if 
any
+      #          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+      #        run: |
+      #          source ${{ github.workspace }}/.tmp/decrypted-sonarcloud-token
+      #          ./mvnw --batch-mode --no-snapshot-updates -e 
--no-transfer-progress --fail-fast clean test verify 
org.sonarsource.scanner.maven:sonar-maven-plugin:sonar 
-Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 
-Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=apache 
-Dsonar.projectKey=apache_dubbo -DtrimStackTrace=false 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false 
-DskipIntegrationTests=false -Dcheckstyle.skip [...]
+      - name: "Test with Maven without SonarCloud Scan"
+        timeout-minutes: 70
+        run: |
+          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast clean test verify 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 -DtrimStackTrace=false 
-Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false 
-DskipIntegrationTests=false -Dcheckstyle.skip=false 
-Dcheckstyle_unix.skip=false -Drat.skip=false -Dmaven.javadoc.skip=true 
-DembeddedZookeeperPath=${{ github.workspace }}/.tmp/zookeeper
+      - name: "Upload coverage result"
+        uses: actions/upload-artifact@v4
+        with:
+          name: coverage-result-jdk8
+          path: "**/target/site/**/jacoco.xml"
+  unit-test-jdk11:
+    needs: [ check-license, build-source, unit-test-prepare ]
+    name: "Unit Test On ubuntu-latest with JDK11"
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+    env:
+      DISABLE_FILE_SYSTEM_TEST: true
+      CURRENT_ROLE: ${{ matrix.case-role }}
+      DUBBO_DEFAULT_SERIALIZATION: fastjson2
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+      - name: "Set up JDK ${{ matrix.jdk }}"
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 11
+      - uses: actions/cache@v3
+        name: "Cache local Maven repository"
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}-${{ 
github.run_id }}
+          restore-keys: |
+            ${{ runner.os }}-maven-
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+      - uses: actions/cache@v3
+        name: "Cache zookeeper binary archive"
+        id: "cache-zookeeper"
+        with:
+          path: ${{ github.workspace }}/.tmp/zookeeper
+          key: zookeeper-${{ runner.os }}-${{ env.ZOOKEEPER_VERSION }}
+          restore-keys: |
+            zookeeper-${{ runner.os }}-
+      - uses: actions/cache@v3
+        name: "Cache secret key"
+        id: "cache-secret-cert"
+        with:
+          path: ${{ github.workspace }}/.tmp/rsa
+          key: secret-rsa-${{ runner.os }}-${{ github.run_id }}
+      #      - name: "Get sonarcloud token"
+      #        if: ${{ github.repository == 'apache/dubbo-spi-extensions' }}
+      #        run: |
+      #          curl "http://dubbo-vm.apache.org:8000/token?workflow_id=${{ 
github.run_id }}" -o ${{ github.workspace }}/.tmp/encrypted-sonarcloud-token
+      #          openssl rsautl -decrypt -in ${{ github.workspace 
}}/.tmp/encrypted-sonarcloud-token -out ${{ github.workspace 
}}/.tmp/decrypted-sonarcloud-token -inkey ${{ github.workspace 
}}/.tmp/rsa/rsa_private.pem
+      #      - name: "Test with Maven with SonarCloud Scan"
+      #        if: ${{ github.repository == 'apache/dubbo-spi-extensions' }}
+      #        timeout-minutes: 70
+      #        env:
+      #          # Needed to get some information about the pull request, if 
any
+      #          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+      #        run: |
+      #          source ${{ github.workspace }}/.tmp/decrypted-sonarcloud-token
+      #          ./mvnw --batch-mode --no-snapshot-updates -e 
--no-transfer-progress --fail-fast clean test verify 
org.sonarsource.scanner.maven:sonar-maven-plugin:sonar 
-Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 
-Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=apache 
-Dsonar.projectKey=apache_dubbo -DtrimStackTrace=false 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false 
-DskipIntegrationTests=false -Dcheckstyle.skip [...]
+      - name: "Test with Maven without SonarCloud Scan"
+        timeout-minutes: 70
+        run: |
+          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast clean test verify 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 -DtrimStackTrace=false 
-Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false 
-DskipIntegrationTests=false -Dcheckstyle.skip=false 
-Dcheckstyle_unix.skip=false -Drat.skip=false -Dmaven.javadoc.skip=true 
-DembeddedZookeeperPath=${{ github.workspace }}/.tmp/zookeeper
+      - name: "Upload coverage result"
+        uses: actions/upload-artifact@v4
+        with:
+          name: coverage-result-jdk11
+          path: "**/target/site/**/jacoco.xml"
+
+#  error-code-inspecting:
+#    needs: [check-license, build-tools]
+#    runs-on: ubuntu-latest
+#    steps:
+#      - uses: actions/checkout@v4
+#        with:
+#          path: "./dubbo-spi-extensions"
+#      - uses: actions/checkout@v4
+#        with:
+#          repository: 'apache/dubbo-test-tools'
+#          ref: main
+#          path: "./dubbo-test-tools"
+#      - name: "Set up JDK 21"
+#        uses: actions/setup-java@v4
+#        with:
+#          distribution: 'zulu'
+#          java-version: 21
+#      - name: Restore Maven local repository cache
+#        uses: actions/cache@v3
+#        with:
+#          path: ~/.m2/repository
+#          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+#          restore-keys: |
+#            ${{ runner.os }}-maven-
+#            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+#      - name: "Compile Dubbo-SPI-Extensions (Linux)"
+#        run: |
+#          cd ${{ github.workspace }}/dubbo-spi-extensions
+#          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast -T 2C clean install -DskipTests=true -DskipIntegrationTests=true 
-Dcheckstyle.skip=true -Dcheckstyle_unix.skip=true -Drat.skip=true 
-Dmaven.javadoc.skip=true
+#      - name: "Run Error Code Inspecting"
+#        env:
+#          DUBBO_ECI_REPORT_AS_ERROR: true
+#        run: |
+#          cd ${{ github.workspace 
}}/dubbo-test-tools/dubbo-error-code-inspector
+#          ../mvnw --batch-mode --no-snapshot-updates -e 
--no-transfer-progress --fail-fast -T 2C package exec:java 
-Ddubbo.eci.report-as-error=${DUBBO_ECI_REPORT_AS_ERROR} -Dmaven.test.skip=true 
-Dmaven.test.skip.exec=true -Ddubbo.eci.path=${{ github.workspace 
}}/dubbo-spi-extensions
+#      - name: "Upload error code inspection result"
+#        # always() should not be used here, since we don't need to handle the 
'canceled' situation.
+#        if: ${{ success() || failure() }}
+#        uses: actions/upload-artifact@v4
+#        with:
+#          name: "error-inspection-result"
+#          path: ${{ github.workspace 
}}/dubbo-test-tools/dubbo-error-code-inspector/error-inspection-result.txt
diff --git a/.github/workflows/build-and-test-scheduled-3.2.yml 
b/.github/workflows/build-and-test-scheduled-3.2.yml
new file mode 100644
index 0000000..73538be
--- /dev/null
+++ b/.github/workflows/build-and-test-scheduled-3.2.yml
@@ -0,0 +1,365 @@
+name: Build and Test For PR
+
+on:
+  schedule:
+    - cron: '0 0/6 * * *'
+  workflow_dispatch:
+
+permissions:
+  contents: read
+
+env:
+  FORK_COUNT: 2
+  FAIL_FAST: 0
+  SHOW_ERROR_DETAIL: 1
+  #multi-version size limit
+  VERSIONS_LIMIT: 4
+  JACOCO_ENABLE: true
+  CANDIDATE_VERSIONS: '
+    spring.version:5.3.24;
+    spring-boot.version:2.7.6;
+    '
+
+jobs:
+  # Check ASF License
+  check-license:
+    name: "Check License"
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+      - name: Check License
+        uses: apache/skywalking-eyes@e1a02359b239bd28de3f6d35fdc870250fa513d5
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+      - name: "Set up JDK 21"
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 21
+      - name: Restore Maven local repository cache
+        uses: actions/cache@v3
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+          restore-keys: |
+            ${{ runner.os }}-maven-
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+      - name: Check Dependencies' License
+        uses: 
apache/skywalking-eyes/dependency@e1a02359b239bd28de3f6d35fdc870250fa513d5
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          config: .licenserc.yaml
+          mode: check
+  # Build dubbo-build-tool
+  build-tools:
+    name: "Build-tools"
+    needs: check-license
+    runs-on: ubuntu-latest
+    outputs:
+      cache-key: ${{ steps.dubbo-build-tools.cache }}
+    steps:
+      - uses: actions/checkout@v4
+        name: build tools
+        with:
+          repository: 'apache/dubbo'
+          ref: '3.2'
+          path: dubbo
+      - name: "Set up JDK 21"
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 21
+      - uses: actions/cache@v3
+        name: "Cache local Maven repository"
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+          restore-keys: |
+            ${{ runner.os }}-maven-
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+      - name: "Build tools"
+        run: |
+          cd ./dubbo
+          ./mvnw --batch-mode -U -e --no-transfer-progress install -pl 
dubbo-build-tools -am -DskipTests=true
+  # Build from source code
+  build-source:
+    name: "Build Dubbo-SPI-Extensions"
+    needs: [check-license, build-tools]
+    runs-on: ubuntu-latest
+    # output dubbo-spi-extensions version to others jobs
+    outputs:
+      version: ${{ steps.dubbo-spi-extensions-version.outputs.version }}
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          ref: "3.2.0"
+          path: dubbo-spi-extensions
+      - uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 8
+      - uses: actions/cache@v3
+        name: "Cache local Maven repository"
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}-${{ 
github.run_id }}
+          restore-keys: |
+            ${{ runner.os }}-maven-
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+      - name: "Compile Dubbo-SPI-Extensions (Linux)"
+        run: |
+          cd ./dubbo-spi-extensions
+          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast -T 2C clean compile -DskipTests=true -DskipIntegrationTests=true 
-Dcheckstyle.skip=true -Dcheckstyle_unix.skip=true -Drat.skip=true 
-Dmaven.javadoc.skip=true
+      - name: "Build Dubbo-SPI-Extensions with Maven"
+        run: |
+          cd ./dubbo-spi-extensions
+          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast clean source:jar install -Pjacoco,checkstyle 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Dmaven.wagon.http.retryHandler.count=5 -Dmaven.test.skip=true 
-Dmaven.test.skip.exec=true -DembeddedZookeeperPath=${{ github.workspace 
}}/.tmp/zookeeper
+      - name: "Pack class result"
+        run: |
+          shopt -s globstar
+          zip ${{ github.workspace }}/class.zip **/target/classes/* -r
+      - name: "Upload class result"
+        uses: actions/upload-artifact@v4
+        with:
+          name: "class-file"
+          path: ${{ github.workspace }}/class.zip
+      - name: "Pack checkstyle file if failure"
+        if: failure()
+        run: zip ${{ github.workspace }}/checkstyle.zip *checkstyle* -r
+      - name: "Upload checkstyle file if failure"
+        if: failure()
+        uses: actions/upload-artifact@v4
+        with:
+          name: "checkstyle-file"
+          path: ${{ github.workspace }}/checkstyle.zip
+      - name: "Upload coverage to Codecov"
+        uses: codecov/codecov-action@v4
+      - name: "Calculate Dubbo-SPI-Extensions Version"
+        id: dubbo-spi-extensions-version
+        run: |
+          REVISION=`awk 
'/<revision>[^<]+<\/revision>/{gsub(/<revision>|<\/revision>/,"",$1);print 
$1;exit;}' ./dubbo-spi-extensions/pom.xml`
+          echo "version=$REVISION" >> $GITHUB_OUTPUT
+          echo "dubbo-spi-extensions version: $REVISION"
+  # Download dependencies Prepare for unit test
+  unit-test-prepare:
+    name: "Preparation for Unit Test"
+    needs: [check-license, build-source]
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+    env:
+      ZOOKEEPER_VERSION: 3.6.3
+    steps:
+      - uses: actions/cache@v3
+        name: "Cache zookeeper binary archive"
+        id: "cache-zookeeper"
+        with:
+          path: ${{ github.workspace }}/.tmp/zookeeper
+          key: zookeeper-${{ runner.os }}-${{ env.ZOOKEEPER_VERSION }}
+          restore-keys: |
+            zookeeper-${{ runner.os }}-${{ env.ZOOKEEPER_VERSION }}
+      - name: "Set up msys2 if necessary"
+        if: ${{ startsWith( matrix.os, 'windows') && 
steps.cache-zookeeper.outputs.cache-hit != 'true' }}
+        uses: msys2/setup-msys2@v2
+        with:
+          release: false  # support cache, see 
https://github.com/msys2/setup-msys2#context
+      - name: "Download zookeeper binary archive in Linux OS"
+        run: |
+          mkdir -p ${{ github.workspace }}/.tmp/zookeeper
+          wget -c https://archive.apache.org/dist/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c https://apache.website-solution.net/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c http://apache.stu.edu.tw/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c http://ftp.jaist.ac.jp/pub/apache/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c http://apache.mirror.cdnetworks.com/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c http://mirror.apache-kr.org/apache/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz
+          echo "list the downloaded zookeeper binary archive"
+          ls -al ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz
+      - uses: actions/cache@v3
+        name: "Cache secret key"
+        id: "cache-secret-cert"
+        with:
+          path: ${{ github.workspace }}/.tmp/rsa
+          key: secret-rsa-${{ runner.os }}-${{ github.run_id }}
+      - name: "Create Secret"
+        run: |
+          mkdir -p ${{ github.workspace }}/.tmp/rsa
+          cd ${{ github.workspace }}/.tmp/rsa
+          openssl genrsa -out rsa_private.pem 1024
+          openssl rsa -in rsa_private.pem -pubout -out rsa_public.pem
+          echo "Current workflow run id: ${{ github.run_id }}"
+          echo "Start Print Rsa Public Key ---"
+          cat rsa_public.pem
+          echo "--- End Print Rsa Public Key"
+  # Start unit test
+  unit-test-jdk8:
+    needs: [check-license, build-source, unit-test-prepare]
+    name: "Unit Test On ubuntu-latest with JDK8"
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+    env:
+      DISABLE_FILE_SYSTEM_TEST: true
+      CURRENT_ROLE: ${{ matrix.case-role }}
+      DUBBO_DEFAULT_SERIALIZATION: fastjson2
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+      - name: "Set up JDK ${{ matrix.jdk }}"
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 8
+      - uses: actions/cache@v3
+        name: "Cache local Maven repository"
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}-${{ 
github.run_id }}
+          restore-keys: |
+            ${{ runner.os }}-maven-
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+      - uses: actions/cache@v3
+        name: "Cache zookeeper binary archive"
+        id: "cache-zookeeper"
+        with:
+          path: ${{ github.workspace }}/.tmp/zookeeper
+          key: zookeeper-${{ runner.os }}-${{ env.ZOOKEEPER_VERSION }}
+          restore-keys: |
+            zookeeper-${{ runner.os }}-
+      - uses: actions/cache@v3
+        name: "Cache secret key"
+        id: "cache-secret-cert"
+        with:
+          path: ${{ github.workspace }}/.tmp/rsa
+          key: secret-rsa-${{ runner.os }}-${{ github.run_id }}
+      #      - name: "Get sonarcloud token"
+      #        if: ${{ github.repository == 'apache/dubbo-spi-extensions' }}
+      #        run: |
+      #          curl "http://dubbo-vm.apache.org:8000/token?workflow_id=${{ 
github.run_id }}" -o ${{ github.workspace }}/.tmp/encrypted-sonarcloud-token
+      #          openssl rsautl -decrypt -in ${{ github.workspace 
}}/.tmp/encrypted-sonarcloud-token -out ${{ github.workspace 
}}/.tmp/decrypted-sonarcloud-token -inkey ${{ github.workspace 
}}/.tmp/rsa/rsa_private.pem
+      #      - name: "Test with Maven with SonarCloud Scan"
+      #        if: ${{ github.repository == 'apache/dubbo-spi-extensions' }}
+      #        timeout-minutes: 70
+      #        env:
+      #          # Needed to get some information about the pull request, if 
any
+      #          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+      #        run: |
+      #          source ${{ github.workspace }}/.tmp/decrypted-sonarcloud-token
+      #          ./mvnw --batch-mode --no-snapshot-updates -e 
--no-transfer-progress --fail-fast clean test verify 
org.sonarsource.scanner.maven:sonar-maven-plugin:sonar 
-Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 
-Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=apache 
-Dsonar.projectKey=apache_dubbo -DtrimStackTrace=false 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false 
-DskipIntegrationTests=false -Dcheckstyle.skip [...]
+      - name: "Test with Maven without SonarCloud Scan"
+        timeout-minutes: 70
+        run: |
+          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast clean test verify 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 -DtrimStackTrace=false 
-Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false 
-DskipIntegrationTests=false -Dcheckstyle.skip=false 
-Dcheckstyle_unix.skip=false -Drat.skip=false -Dmaven.javadoc.skip=true 
-DembeddedZookeeperPath=${{ github.workspace }}/.tmp/zookeeper
+      - name: "Upload coverage result"
+        uses: actions/upload-artifact@v4
+        with:
+          name: coverage-result-jdk8
+          path: "**/target/site/**/jacoco.xml"
+  unit-test-jdk11:
+    needs: [ check-license, build-source, unit-test-prepare ]
+    name: "Unit Test On ubuntu-latest with JDK11"
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+    env:
+      DISABLE_FILE_SYSTEM_TEST: true
+      CURRENT_ROLE: ${{ matrix.case-role }}
+      DUBBO_DEFAULT_SERIALIZATION: fastjson2
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+      - name: "Set up JDK ${{ matrix.jdk }}"
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 11
+      - uses: actions/cache@v3
+        name: "Cache local Maven repository"
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}-${{ 
github.run_id }}
+          restore-keys: |
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+            ${{ runner.os }}-maven-
+      - uses: actions/cache@v3
+        name: "Cache zookeeper binary archive"
+        id: "cache-zookeeper"
+        with:
+          path: ${{ github.workspace }}/.tmp/zookeeper
+          key: zookeeper-${{ runner.os }}-${{ env.ZOOKEEPER_VERSION }}
+          restore-keys: |
+            zookeeper-${{ runner.os }}-
+      - uses: actions/cache@v3
+        name: "Cache secret key"
+        id: "cache-secret-cert"
+        with:
+          path: ${{ github.workspace }}/.tmp/rsa
+          key: secret-rsa-${{ runner.os }}-${{ github.run_id }}
+      #      - name: "Get sonarcloud token"
+      #        if: ${{ github.repository == 'apache/dubbo-spi-extensions' }}
+      #        run: |
+      #          curl "http://dubbo-vm.apache.org:8000/token?workflow_id=${{ 
github.run_id }}" -o ${{ github.workspace }}/.tmp/encrypted-sonarcloud-token
+      #          openssl rsautl -decrypt -in ${{ github.workspace 
}}/.tmp/encrypted-sonarcloud-token -out ${{ github.workspace 
}}/.tmp/decrypted-sonarcloud-token -inkey ${{ github.workspace 
}}/.tmp/rsa/rsa_private.pem
+      #      - name: "Test with Maven with SonarCloud Scan"
+      #        if: ${{ github.repository == 'apache/dubbo-spi-extensions' }}
+      #        timeout-minutes: 70
+      #        env:
+      #          # Needed to get some information about the pull request, if 
any
+      #          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+      #        run: |
+      #          source ${{ github.workspace }}/.tmp/decrypted-sonarcloud-token
+      #          ./mvnw --batch-mode --no-snapshot-updates -e 
--no-transfer-progress --fail-fast clean test verify 
org.sonarsource.scanner.maven:sonar-maven-plugin:sonar 
-Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 
-Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=apache 
-Dsonar.projectKey=apache_dubbo -DtrimStackTrace=false 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false 
-DskipIntegrationTests=false -Dcheckstyle.skip [...]
+      - name: "Test with Maven without SonarCloud Scan"
+        timeout-minutes: 70
+        run: |
+          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast clean test verify 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 -DtrimStackTrace=false 
-Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false 
-DskipIntegrationTests=false -Dcheckstyle.skip=false 
-Dcheckstyle_unix.skip=false -Drat.skip=false -Dmaven.javadoc.skip=true 
-DembeddedZookeeperPath=${{ github.workspace }}/.tmp/zookeeper
+      - name: "Upload coverage result"
+        uses: actions/upload-artifact@v4
+        with:
+          name: coverage-result-jdk11
+          path: "**/target/site/**/jacoco.xml"
+
+#  error-code-inspecting:
+#    needs: [check-license, build-tools]
+#    runs-on: ubuntu-latest
+#    steps:
+#      - uses: actions/checkout@v4
+#        with:
+#          path: "./dubbo-spi-extensions"
+#      - uses: actions/checkout@v4
+#        with:
+#          repository: 'apache/dubbo-test-tools'
+#          ref: main
+#          path: "./dubbo-test-tools"
+#      - name: "Set up JDK 21"
+#        uses: actions/setup-java@v4
+#        with:
+#          distribution: 'zulu'
+#          java-version: 21
+#      - name: Restore Maven local repository cache
+#        uses: actions/cache@v3
+#        with:
+#          path: ~/.m2/repository
+#          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+#          restore-keys: |
+#            ${{ runner.os }}-maven-
+#            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+#      - name: "Compile Dubbo-SPI-Extensions (Linux)"
+#        run: |
+#          cd ${{ github.workspace }}/dubbo-spi-extensions
+#          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast -T 2C clean install -DskipTests=true -DskipIntegrationTests=true 
-Dcheckstyle.skip=true -Dcheckstyle_unix.skip=true -Drat.skip=true 
-Dmaven.javadoc.skip=true
+#      - name: "Run Error Code Inspecting"
+#        env:
+#          DUBBO_ECI_REPORT_AS_ERROR: true
+#        run: |
+#          cd ${{ github.workspace 
}}/dubbo-test-tools/dubbo-error-code-inspector
+#          ../mvnw --batch-mode --no-snapshot-updates -e 
--no-transfer-progress --fail-fast -T 2C package exec:java 
-Ddubbo.eci.report-as-error=${DUBBO_ECI_REPORT_AS_ERROR} -Dmaven.test.skip=true 
-Dmaven.test.skip.exec=true -Ddubbo.eci.path=${{ github.workspace 
}}/dubbo-spi-extensions
+#      - name: "Upload error code inspection result"
+#        # always() should not be used here, since we don't need to handle the 
'canceled' situation.
+#        if: ${{ success() || failure() }}
+#        uses: actions/upload-artifact@v4
+#        with:
+#          name: "error-inspection-result"
+#          path: ${{ github.workspace 
}}/dubbo-test-tools/dubbo-error-code-inspector/error-inspection-result.txt
diff --git a/.github/workflows/build-and-test-scheduled-main.yml 
b/.github/workflows/build-and-test-scheduled-main.yml
new file mode 100644
index 0000000..a3fb199
--- /dev/null
+++ b/.github/workflows/build-and-test-scheduled-main.yml
@@ -0,0 +1,365 @@
+name: Build and Test For PR
+
+on:
+  schedule:
+    - cron: '0 0/6 * * *'
+  workflow_dispatch:
+
+permissions:
+  contents: read
+
+env:
+  FORK_COUNT: 2
+  FAIL_FAST: 0
+  SHOW_ERROR_DETAIL: 1
+  #multi-version size limit
+  VERSIONS_LIMIT: 4
+  JACOCO_ENABLE: true
+  CANDIDATE_VERSIONS: '
+    spring.version:5.3.24;
+    spring-boot.version:2.7.6;
+    '
+
+jobs:
+  # Check ASF License
+  check-license:
+    name: "Check License"
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+      - name: Check License
+        uses: apache/skywalking-eyes@e1a02359b239bd28de3f6d35fdc870250fa513d5
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+      - name: "Set up JDK 21"
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 21
+      - name: Restore Maven local repository cache
+        uses: actions/cache@v3
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+          restore-keys: |
+            ${{ runner.os }}-maven-
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+      - name: Check Dependencies' License
+        uses: 
apache/skywalking-eyes/dependency@e1a02359b239bd28de3f6d35fdc870250fa513d5
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          config: .licenserc.yaml
+          mode: check
+  # Build dubbo-build-tool
+  build-tools:
+    name: "Build-tools"
+    needs: check-license
+    runs-on: ubuntu-latest
+    outputs:
+      cache-key: ${{ steps.dubbo-build-tools.cache }}
+    steps:
+      - uses: actions/checkout@v4
+        name: build tools
+        with:
+          repository: 'apache/dubbo'
+          ref: '3.2'
+          path: dubbo
+      - name: "Set up JDK 21"
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 21
+      - uses: actions/cache@v3
+        name: "Cache local Maven repository"
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+          restore-keys: |
+            ${{ runner.os }}-maven-
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+      - name: "Build tools"
+        run: |
+          cd ./dubbo
+          ./mvnw --batch-mode -U -e --no-transfer-progress install -pl 
dubbo-build-tools -am -DskipTests=true
+  # Build from source code
+  build-source:
+    name: "Build Dubbo-SPI-Extensions"
+    needs: [check-license, build-tools]
+    runs-on: ubuntu-latest
+    # output dubbo-spi-extensions version to others jobs
+    outputs:
+      version: ${{ steps.dubbo-spi-extensions-version.outputs.version }}
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          ref: "master"
+          path: dubbo-spi-extensions
+      - uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 8
+      - uses: actions/cache@v3
+        name: "Cache local Maven repository"
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}-${{ 
github.run_id }}
+          restore-keys: |
+            ${{ runner.os }}-maven-
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+      - name: "Compile Dubbo-SPI-Extensions (Linux)"
+        run: |
+          cd ./dubbo-spi-extensions
+          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast -T 2C clean compile -DskipTests=true -DskipIntegrationTests=true 
-Dcheckstyle.skip=true -Dcheckstyle_unix.skip=true -Drat.skip=true 
-Dmaven.javadoc.skip=true
+      - name: "Build Dubbo-SPI-Extensions with Maven"
+        run: |
+          cd ./dubbo-spi-extensions
+          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast clean source:jar install -Pjacoco,checkstyle 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Dmaven.wagon.http.retryHandler.count=5 -Dmaven.test.skip=true 
-Dmaven.test.skip.exec=true -DembeddedZookeeperPath=${{ github.workspace 
}}/.tmp/zookeeper
+      - name: "Pack class result"
+        run: |
+          shopt -s globstar
+          zip ${{ github.workspace }}/class.zip **/target/classes/* -r
+      - name: "Upload class result"
+        uses: actions/upload-artifact@v4
+        with:
+          name: "class-file"
+          path: ${{ github.workspace }}/class.zip
+      - name: "Pack checkstyle file if failure"
+        if: failure()
+        run: zip ${{ github.workspace }}/checkstyle.zip *checkstyle* -r
+      - name: "Upload checkstyle file if failure"
+        if: failure()
+        uses: actions/upload-artifact@v4
+        with:
+          name: "checkstyle-file"
+          path: ${{ github.workspace }}/checkstyle.zip
+      - name: "Upload coverage to Codecov"
+        uses: codecov/codecov-action@v4
+      - name: "Calculate Dubbo-SPI-Extensions Version"
+        id: dubbo-spi-extensions-version
+        run: |
+          REVISION=`awk 
'/<revision>[^<]+<\/revision>/{gsub(/<revision>|<\/revision>/,"",$1);print 
$1;exit;}' ./dubbo-spi-extensions/pom.xml`
+          echo "version=$REVISION" >> $GITHUB_OUTPUT
+          echo "dubbo-spi-extensions version: $REVISION"
+  # Download dependencies Prepare for unit test
+  unit-test-prepare:
+    name: "Preparation for Unit Test"
+    needs: [check-license, build-source]
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+    env:
+      ZOOKEEPER_VERSION: 3.6.3
+    steps:
+      - uses: actions/cache@v3
+        name: "Cache zookeeper binary archive"
+        id: "cache-zookeeper"
+        with:
+          path: ${{ github.workspace }}/.tmp/zookeeper
+          key: zookeeper-${{ runner.os }}-${{ env.ZOOKEEPER_VERSION }}
+          restore-keys: |
+            zookeeper-${{ runner.os }}-${{ env.ZOOKEEPER_VERSION }}
+      - name: "Set up msys2 if necessary"
+        if: ${{ startsWith( matrix.os, 'windows') && 
steps.cache-zookeeper.outputs.cache-hit != 'true' }}
+        uses: msys2/setup-msys2@v2
+        with:
+          release: false  # support cache, see 
https://github.com/msys2/setup-msys2#context
+      - name: "Download zookeeper binary archive in Linux OS"
+        run: |
+          mkdir -p ${{ github.workspace }}/.tmp/zookeeper
+          wget -c https://archive.apache.org/dist/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c https://apache.website-solution.net/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c http://apache.stu.edu.tw/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c http://ftp.jaist.ac.jp/pub/apache/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c http://apache.mirror.cdnetworks.com/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c http://mirror.apache-kr.org/apache/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz
+          echo "list the downloaded zookeeper binary archive"
+          ls -al ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz
+      - uses: actions/cache@v3
+        name: "Cache secret key"
+        id: "cache-secret-cert"
+        with:
+          path: ${{ github.workspace }}/.tmp/rsa
+          key: secret-rsa-${{ runner.os }}-${{ github.run_id }}
+      - name: "Create Secret"
+        run: |
+          mkdir -p ${{ github.workspace }}/.tmp/rsa
+          cd ${{ github.workspace }}/.tmp/rsa
+          openssl genrsa -out rsa_private.pem 1024
+          openssl rsa -in rsa_private.pem -pubout -out rsa_public.pem
+          echo "Current workflow run id: ${{ github.run_id }}"
+          echo "Start Print Rsa Public Key ---"
+          cat rsa_public.pem
+          echo "--- End Print Rsa Public Key"
+  # Start unit test
+  unit-test-jdk8:
+    needs: [check-license, build-source, unit-test-prepare]
+    name: "Unit Test On ubuntu-latest with JDK8"
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+    env:
+      DISABLE_FILE_SYSTEM_TEST: true
+      CURRENT_ROLE: ${{ matrix.case-role }}
+      DUBBO_DEFAULT_SERIALIZATION: fastjson2
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+      - name: "Set up JDK ${{ matrix.jdk }}"
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 8
+      - uses: actions/cache@v3
+        name: "Cache local Maven repository"
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}-${{ 
github.run_id }}
+          restore-keys: |
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+            ${{ runner.os }}-maven-
+      - uses: actions/cache@v3
+        name: "Cache zookeeper binary archive"
+        id: "cache-zookeeper"
+        with:
+          path: ${{ github.workspace }}/.tmp/zookeeper
+          key: zookeeper-${{ runner.os }}-${{ env.ZOOKEEPER_VERSION }}
+          restore-keys: |
+            zookeeper-${{ runner.os }}-
+      - uses: actions/cache@v3
+        name: "Cache secret key"
+        id: "cache-secret-cert"
+        with:
+          path: ${{ github.workspace }}/.tmp/rsa
+          key: secret-rsa-${{ runner.os }}-${{ github.run_id }}
+      #      - name: "Get sonarcloud token"
+      #        if: ${{ github.repository == 'apache/dubbo-spi-extensions' }}
+      #        run: |
+      #          curl "http://dubbo-vm.apache.org:8000/token?workflow_id=${{ 
github.run_id }}" -o ${{ github.workspace }}/.tmp/encrypted-sonarcloud-token
+      #          openssl rsautl -decrypt -in ${{ github.workspace 
}}/.tmp/encrypted-sonarcloud-token -out ${{ github.workspace 
}}/.tmp/decrypted-sonarcloud-token -inkey ${{ github.workspace 
}}/.tmp/rsa/rsa_private.pem
+      #      - name: "Test with Maven with SonarCloud Scan"
+      #        if: ${{ github.repository == 'apache/dubbo-spi-extensions' }}
+      #        timeout-minutes: 70
+      #        env:
+      #          # Needed to get some information about the pull request, if 
any
+      #          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+      #        run: |
+      #          source ${{ github.workspace }}/.tmp/decrypted-sonarcloud-token
+      #          ./mvnw --batch-mode --no-snapshot-updates -e 
--no-transfer-progress --fail-fast clean test verify 
org.sonarsource.scanner.maven:sonar-maven-plugin:sonar 
-Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 
-Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=apache 
-Dsonar.projectKey=apache_dubbo -DtrimStackTrace=false 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false 
-DskipIntegrationTests=false -Dcheckstyle.skip [...]
+      - name: "Test with Maven without SonarCloud Scan"
+        timeout-minutes: 70
+        run: |
+          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast clean test verify 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 -DtrimStackTrace=false 
-Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false 
-DskipIntegrationTests=false -Dcheckstyle.skip=false 
-Dcheckstyle_unix.skip=false -Drat.skip=false -Dmaven.javadoc.skip=true 
-DembeddedZookeeperPath=${{ github.workspace }}/.tmp/zookeeper
+      - name: "Upload coverage result"
+        uses: actions/upload-artifact@v4
+        with:
+          name: coverage-result-jdk8
+          path: "**/target/site/**/jacoco.xml"
+  unit-test-jdk11:
+    needs: [ check-license, build-source, unit-test-prepare ]
+    name: "Unit Test On ubuntu-latest with JDK11"
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+    env:
+      DISABLE_FILE_SYSTEM_TEST: true
+      CURRENT_ROLE: ${{ matrix.case-role }}
+      DUBBO_DEFAULT_SERIALIZATION: fastjson2
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+      - name: "Set up JDK ${{ matrix.jdk }}"
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 11
+      - uses: actions/cache@v3
+        name: "Cache local Maven repository"
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}-${{ 
github.run_id }}
+          restore-keys: |
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+            ${{ runner.os }}-maven-
+      - uses: actions/cache@v3
+        name: "Cache zookeeper binary archive"
+        id: "cache-zookeeper"
+        with:
+          path: ${{ github.workspace }}/.tmp/zookeeper
+          key: zookeeper-${{ runner.os }}-${{ env.ZOOKEEPER_VERSION }}
+          restore-keys: |
+            zookeeper-${{ runner.os }}-
+      - uses: actions/cache@v3
+        name: "Cache secret key"
+        id: "cache-secret-cert"
+        with:
+          path: ${{ github.workspace }}/.tmp/rsa
+          key: secret-rsa-${{ runner.os }}-${{ github.run_id }}
+      #      - name: "Get sonarcloud token"
+      #        if: ${{ github.repository == 'apache/dubbo-spi-extensions' }}
+      #        run: |
+      #          curl "http://dubbo-vm.apache.org:8000/token?workflow_id=${{ 
github.run_id }}" -o ${{ github.workspace }}/.tmp/encrypted-sonarcloud-token
+      #          openssl rsautl -decrypt -in ${{ github.workspace 
}}/.tmp/encrypted-sonarcloud-token -out ${{ github.workspace 
}}/.tmp/decrypted-sonarcloud-token -inkey ${{ github.workspace 
}}/.tmp/rsa/rsa_private.pem
+      #      - name: "Test with Maven with SonarCloud Scan"
+      #        if: ${{ github.repository == 'apache/dubbo-spi-extensions' }}
+      #        timeout-minutes: 70
+      #        env:
+      #          # Needed to get some information about the pull request, if 
any
+      #          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+      #        run: |
+      #          source ${{ github.workspace }}/.tmp/decrypted-sonarcloud-token
+      #          ./mvnw --batch-mode --no-snapshot-updates -e 
--no-transfer-progress --fail-fast clean test verify 
org.sonarsource.scanner.maven:sonar-maven-plugin:sonar 
-Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 
-Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=apache 
-Dsonar.projectKey=apache_dubbo -DtrimStackTrace=false 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false 
-DskipIntegrationTests=false -Dcheckstyle.skip [...]
+      - name: "Test with Maven without SonarCloud Scan"
+        timeout-minutes: 70
+        run: |
+          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast clean test verify 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 -DtrimStackTrace=false 
-Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false 
-DskipIntegrationTests=false -Dcheckstyle.skip=false 
-Dcheckstyle_unix.skip=false -Drat.skip=false -Dmaven.javadoc.skip=true 
-DembeddedZookeeperPath=${{ github.workspace }}/.tmp/zookeeper
+      - name: "Upload coverage result"
+        uses: actions/upload-artifact@v4
+        with:
+          name: coverage-result-jdk11
+          path: "**/target/site/**/jacoco.xml"
+
+#  error-code-inspecting:
+#    needs: [check-license, build-tools]
+#    runs-on: ubuntu-latest
+#    steps:
+#      - uses: actions/checkout@v4
+#        with:
+#          path: "./dubbo-spi-extensions"
+#      - uses: actions/checkout@v4
+#        with:
+#          repository: 'apache/dubbo-test-tools'
+#          ref: main
+#          path: "./dubbo-test-tools"
+#      - name: "Set up JDK 21"
+#        uses: actions/setup-java@v4
+#        with:
+#          distribution: 'zulu'
+#          java-version: 21
+#      - name: Restore Maven local repository cache
+#        uses: actions/cache@v3
+#        with:
+#          path: ~/.m2/repository
+#          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+#          restore-keys: |
+#            ${{ runner.os }}-maven-
+#            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+#      - name: "Compile Dubbo-SPI-Extensions (Linux)"
+#        run: |
+#          cd ${{ github.workspace }}/dubbo-spi-extensions
+#          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast -T 2C clean install -DskipTests=true -DskipIntegrationTests=true 
-Dcheckstyle.skip=true -Dcheckstyle_unix.skip=true -Drat.skip=true 
-Dmaven.javadoc.skip=true
+#      - name: "Run Error Code Inspecting"
+#        env:
+#          DUBBO_ECI_REPORT_AS_ERROR: true
+#        run: |
+#          cd ${{ github.workspace 
}}/dubbo-test-tools/dubbo-error-code-inspector
+#          ../mvnw --batch-mode --no-snapshot-updates -e 
--no-transfer-progress --fail-fast -T 2C package exec:java 
-Ddubbo.eci.report-as-error=${DUBBO_ECI_REPORT_AS_ERROR} -Dmaven.test.skip=true 
-Dmaven.test.skip.exec=true -Ddubbo.eci.path=${{ github.workspace 
}}/dubbo-spi-extensions
+#      - name: "Upload error code inspection result"
+#        # always() should not be used here, since we don't need to handle the 
'canceled' situation.
+#        if: ${{ success() || failure() }}
+#        uses: actions/upload-artifact@v4
+#        with:
+#          name: "error-inspection-result"
+#          path: ${{ github.workspace 
}}/dubbo-test-tools/dubbo-error-code-inspector/error-inspection-result.txt
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
deleted file mode 100644
index 5270c23..0000000
--- a/.github/workflows/ci.yml
+++ /dev/null
@@ -1,68 +0,0 @@
-name: CI
-
-on: [ push, pull_request ]
-
-jobs:
-  build:
-    runs-on: ${{ matrix.os }}
-    strategy:
-      fail-fast: false
-      matrix:
-        os: [ ubuntu-latest]
-        jdk: [ 8, 11 ]
-    steps:
-      - uses: actions/checkout@v2
-        with:
-          path: dubbo-spi-extensions
-      - uses: actions/checkout@v2
-        with:
-          repository: 'apache/dubbo'
-          ref: '3.0'
-          path: dubbo
-      - name: "Set up JDK ${{ matrix.jdk }}"
-        uses: actions/setup-java@v1
-        with:
-          java-version: ${{ matrix.jdk }}
-      - uses: actions/cache@v2
-        name: "Cache local Maven repository"
-        with:
-          path: ~/.m2/repository
-          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
-          restore-keys: |
-            ${{ runner.os }}-maven-
-      - name: "Build tools"
-        run: |
-          cd ./dubbo
-          ./mvnw --batch-mode -U -e --no-transfer-progress install -pl 
dubbo-build-tools -am -DskipTests=true
-      - name: "Test with Maven"
-        timeout-minutes: 40
-        if: ${{ startsWith( matrix.os, 'ubuntu') }}
-        run: |
-          cd ./dubbo-spi-extensions
-          ./mvnw --batch-mode -U -e --no-transfer-progress clean test verify 
-Pjacoco -Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false 
-DskipIntegrationTests=false -Dcheckstyle.skip=false 
-Dcheckstyle_unix.skip=false -Drat.skip=false -Dmaven.javadoc.skip=true
-      - name: "Test with Maven"
-        timeout-minutes: 50
-        if: ${{ startsWith( matrix.os, 'windows') }}
-        run: |
-          cd ./dubbo-spi-extensions
-          ./mvnw --batch-mode -U -e --no-transfer-progress clean test verify 
-Pjacoco -D"http.keepAlive=false" -D"maven.wagon.http.pool=false" 
-D"maven.wagon.httpconnectionManager.ttlSeconds=120" 
-D"maven.wagon.http.retryHandler.count=5" -DskipTests=false 
-DskipIntegrationTests=true -D"checkstyle.skip=false" 
-D"checkstyle_unix.skip=true" -D"rat.skip=false" -D"maven.javadoc.skip=true"
-      - name: "Pack rat file if failure"
-        if: failure()
-        run: 7z a ${{ github.workspace }}/rat.zip *rat.txt -r
-      - name: "Upload rat file if failure"
-        if: failure()
-        uses: actions/upload-artifact@v2
-        with:
-          name: "rat-file"
-          path: ${{ github.workspace }}/rat.zip
-      - name: "Pack checkstyle file if failure"
-        if: failure()
-        run: 7z a ${{ github.workspace }}/checkstyle.zip *checkstyle* -r
-      - name: "Upload checkstyle file if failure"
-        if: failure()
-        uses: actions/upload-artifact@v2
-        with:
-          name: "checkstyle-file"
-          path: ${{ github.workspace }}/checkstyle.zip
-      - name: "Upload coverage to Codecov"
-        uses: codecov/codecov-action@v1
diff --git a/.github/workflows/release-test.yml 
b/.github/workflows/release-test.yml
new file mode 100644
index 0000000..1880a58
--- /dev/null
+++ b/.github/workflows/release-test.yml
@@ -0,0 +1,365 @@
+name: Build and Test For PR
+
+on:
+  push:
+    branches:
+      - '**-release'
+  workflow_dispatch:
+
+permissions:
+  contents: read
+
+env:
+  FORK_COUNT: 2
+  FAIL_FAST: 0
+  SHOW_ERROR_DETAIL: 1
+  #multi-version size limit
+  VERSIONS_LIMIT: 4
+  JACOCO_ENABLE: true
+  CANDIDATE_VERSIONS: '
+    spring.version:5.3.24;
+    spring-boot.version:2.7.6;
+    '
+
+jobs:
+  # Check ASF License
+  check-license:
+    name: "Check License"
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+      - name: Check License
+        uses: apache/skywalking-eyes@e1a02359b239bd28de3f6d35fdc870250fa513d5
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+      - name: "Set up JDK 21"
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 21
+      - name: Restore Maven local repository cache
+        uses: actions/cache@v3
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+          restore-keys: |
+            ${{ runner.os }}-maven-
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+      - name: Check Dependencies' License
+        uses: 
apache/skywalking-eyes/dependency@e1a02359b239bd28de3f6d35fdc870250fa513d5
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          config: .licenserc.yaml
+          mode: check
+  # Build dubbo-build-tool
+  build-tools:
+    name: "Build-tools"
+    needs: check-license
+    runs-on: ubuntu-latest
+    outputs:
+      cache-key: ${{ steps.dubbo-build-tools.cache }}
+    steps:
+      - uses: actions/checkout@v4
+        name: build tools
+        with:
+          repository: 'apache/dubbo'
+          ref: '3.2'
+          path: dubbo
+      - name: "Set up JDK 21"
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 21
+      - uses: actions/cache@v3
+        name: "Cache local Maven repository"
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+          restore-keys: |
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+            ${{ runner.os }}-maven-
+      - name: "Build tools"
+        run: |
+          cd ./dubbo
+          ./mvnw --batch-mode -U -e --no-transfer-progress install -pl 
dubbo-build-tools -am -DskipTests=true
+  # Build from source code
+  build-source:
+    name: "Build Dubbo-SPI-Extensions"
+    needs: [check-license, build-tools]
+    runs-on: ubuntu-latest
+    # output dubbo-spi-extensions version to others jobs
+    outputs:
+      version: ${{ steps.dubbo-spi-extensions-version.outputs.version }}
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          path: dubbo-spi-extensions
+      - uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 8
+      - uses: actions/cache@v3
+        name: "Cache local Maven repository"
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}-${{ 
github.run_id }}
+          restore-keys: |
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+            ${{ runner.os }}-maven-
+      - name: "Compile Dubbo-SPI-Extensions (Linux)"
+        run: |
+          cd ./dubbo-spi-extensions
+          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast -T 2C clean compile -DskipTests=true -DskipIntegrationTests=true 
-Dcheckstyle.skip=true -Dcheckstyle_unix.skip=true -Drat.skip=true 
-Dmaven.javadoc.skip=true
+      - name: "Build Dubbo-SPI-Extensions with Maven"
+        run: |
+          cd ./dubbo-spi-extensions
+          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast clean source:jar install -Pjacoco,checkstyle 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Dmaven.wagon.http.retryHandler.count=5 -Dmaven.test.skip=true 
-Dmaven.test.skip.exec=true -DembeddedZookeeperPath=${{ github.workspace 
}}/.tmp/zookeeper
+      - name: "Pack class result"
+        run: |
+          shopt -s globstar
+          zip ${{ github.workspace }}/class.zip **/target/classes/* -r
+      - name: "Upload class result"
+        uses: actions/upload-artifact@v4
+        with:
+          name: "class-file"
+          path: ${{ github.workspace }}/class.zip
+      - name: "Pack checkstyle file if failure"
+        if: failure()
+        run: zip ${{ github.workspace }}/checkstyle.zip *checkstyle* -r
+      - name: "Upload checkstyle file if failure"
+        if: failure()
+        uses: actions/upload-artifact@v4
+        with:
+          name: "checkstyle-file"
+          path: ${{ github.workspace }}/checkstyle.zip
+      - name: "Upload coverage to Codecov"
+        uses: codecov/codecov-action@v4
+      - name: "Calculate Dubbo-SPI-Extensions Version"
+        id: dubbo-spi-extensions-version
+        run: |
+          REVISION=`awk 
'/<revision>[^<]+<\/revision>/{gsub(/<revision>|<\/revision>/,"",$1);print 
$1;exit;}' ./dubbo-spi-extensions/pom.xml`
+          echo "version=$REVISION" >> $GITHUB_OUTPUT
+          echo "dubbo-spi-extensions version: $REVISION"
+  # Download dependencies Prepare for unit test
+  unit-test-prepare:
+    name: "Preparation for Unit Test"
+    needs: [check-license, build-source]
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+    env:
+      ZOOKEEPER_VERSION: 3.6.3
+    steps:
+      - uses: actions/cache@v3
+        name: "Cache zookeeper binary archive"
+        id: "cache-zookeeper"
+        with:
+          path: ${{ github.workspace }}/.tmp/zookeeper
+          key: zookeeper-${{ runner.os }}-${{ env.ZOOKEEPER_VERSION }}
+          restore-keys: |
+            zookeeper-${{ runner.os }}-${{ env.ZOOKEEPER_VERSION }}
+      - name: "Set up msys2 if necessary"
+        if: ${{ startsWith( matrix.os, 'windows') && 
steps.cache-zookeeper.outputs.cache-hit != 'true' }}
+        uses: msys2/setup-msys2@v2
+        with:
+          release: false  # support cache, see 
https://github.com/msys2/setup-msys2#context
+      - name: "Download zookeeper binary archive in Linux OS"
+        run: |
+          mkdir -p ${{ github.workspace }}/.tmp/zookeeper
+          wget -c https://archive.apache.org/dist/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c https://apache.website-solution.net/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c http://apache.stu.edu.tw/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c http://ftp.jaist.ac.jp/pub/apache/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c http://apache.mirror.cdnetworks.com/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz ||
+          wget -c http://mirror.apache-kr.org/apache/zookeeper/zookeeper-${{ 
env.ZOOKEEPER_VERSION }}/apache-zookeeper-${{ env.ZOOKEEPER_VERSION 
}}-bin.tar.gz -O ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz
+          echo "list the downloaded zookeeper binary archive"
+          ls -al ${{ github.workspace 
}}/.tmp/zookeeper/apache-zookeeper-bin.tar.gz
+      - uses: actions/cache@v3
+        name: "Cache secret key"
+        id: "cache-secret-cert"
+        with:
+          path: ${{ github.workspace }}/.tmp/rsa
+          key: secret-rsa-${{ runner.os }}-${{ github.run_id }}
+      - name: "Create Secret"
+        run: |
+          mkdir -p ${{ github.workspace }}/.tmp/rsa
+          cd ${{ github.workspace }}/.tmp/rsa
+          openssl genrsa -out rsa_private.pem 1024
+          openssl rsa -in rsa_private.pem -pubout -out rsa_public.pem
+          echo "Current workflow run id: ${{ github.run_id }}"
+          echo "Start Print Rsa Public Key ---"
+          cat rsa_public.pem
+          echo "--- End Print Rsa Public Key"
+  # Start unit test
+  unit-test-jdk8:
+    needs: [check-license, build-source, unit-test-prepare]
+    name: "Unit Test On ubuntu-latest with JDK8"
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+    env:
+      DISABLE_FILE_SYSTEM_TEST: true
+      CURRENT_ROLE: ${{ matrix.case-role }}
+      DUBBO_DEFAULT_SERIALIZATION: fastjson2
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+      - name: "Set up JDK ${{ matrix.jdk }}"
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 8
+      - uses: actions/cache@v3
+        name: "Cache local Maven repository"
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}-${{ 
github.run_id }}
+          restore-keys: |
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+            ${{ runner.os }}-maven-
+      - uses: actions/cache@v3
+        name: "Cache zookeeper binary archive"
+        id: "cache-zookeeper"
+        with:
+          path: ${{ github.workspace }}/.tmp/zookeeper
+          key: zookeeper-${{ runner.os }}-${{ env.ZOOKEEPER_VERSION }}
+          restore-keys: |
+            zookeeper-${{ runner.os }}-
+      - uses: actions/cache@v3
+        name: "Cache secret key"
+        id: "cache-secret-cert"
+        with:
+          path: ${{ github.workspace }}/.tmp/rsa
+          key: secret-rsa-${{ runner.os }}-${{ github.run_id }}
+      #      - name: "Get sonarcloud token"
+      #        if: ${{ github.repository == 'apache/dubbo-spi-extensions' }}
+      #        run: |
+      #          curl "http://dubbo-vm.apache.org:8000/token?workflow_id=${{ 
github.run_id }}" -o ${{ github.workspace }}/.tmp/encrypted-sonarcloud-token
+      #          openssl rsautl -decrypt -in ${{ github.workspace 
}}/.tmp/encrypted-sonarcloud-token -out ${{ github.workspace 
}}/.tmp/decrypted-sonarcloud-token -inkey ${{ github.workspace 
}}/.tmp/rsa/rsa_private.pem
+      #      - name: "Test with Maven with SonarCloud Scan"
+      #        if: ${{ github.repository == 'apache/dubbo-spi-extensions' }}
+      #        timeout-minutes: 70
+      #        env:
+      #          # Needed to get some information about the pull request, if 
any
+      #          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+      #        run: |
+      #          source ${{ github.workspace }}/.tmp/decrypted-sonarcloud-token
+      #          ./mvnw --batch-mode --no-snapshot-updates -e 
--no-transfer-progress --fail-fast clean test verify 
org.sonarsource.scanner.maven:sonar-maven-plugin:sonar 
-Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 
-Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=apache 
-Dsonar.projectKey=apache_dubbo -DtrimStackTrace=false 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false 
-DskipIntegrationTests=false -Dcheckstyle.skip [...]
+      - name: "Test with Maven without SonarCloud Scan"
+        timeout-minutes: 70
+        run: |
+          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast clean test verify 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 -DtrimStackTrace=false 
-Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false 
-DskipIntegrationTests=false -Dcheckstyle.skip=false 
-Dcheckstyle_unix.skip=false -Drat.skip=false -Dmaven.javadoc.skip=true 
-DembeddedZookeeperPath=${{ github.workspace }}/.tmp/zookeeper
+      - name: "Upload coverage result"
+        uses: actions/upload-artifact@v4
+        with:
+          name: coverage-result-jdk8
+          path: "**/target/site/**/jacoco.xml"
+  unit-test-jdk11:
+    needs: [ check-license, build-source, unit-test-prepare ]
+    name: "Unit Test On ubuntu-latest with JDK11"
+    runs-on: ubuntu-latest
+    strategy:
+      fail-fast: false
+    env:
+      DISABLE_FILE_SYSTEM_TEST: true
+      CURRENT_ROLE: ${{ matrix.case-role }}
+      DUBBO_DEFAULT_SERIALIZATION: fastjson2
+    steps:
+      - uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+      - name: "Set up JDK ${{ matrix.jdk }}"
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: 11
+      - uses: actions/cache@v3
+        name: "Cache local Maven repository"
+        with:
+          path: ~/.m2/repository
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}-${{ 
github.run_id }}
+          restore-keys: |
+            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+            ${{ runner.os }}-maven-
+      - uses: actions/cache@v3
+        name: "Cache zookeeper binary archive"
+        id: "cache-zookeeper"
+        with:
+          path: ${{ github.workspace }}/.tmp/zookeeper
+          key: zookeeper-${{ runner.os }}-${{ env.ZOOKEEPER_VERSION }}
+          restore-keys: |
+            zookeeper-${{ runner.os }}-
+      - uses: actions/cache@v3
+        name: "Cache secret key"
+        id: "cache-secret-cert"
+        with:
+          path: ${{ github.workspace }}/.tmp/rsa
+          key: secret-rsa-${{ runner.os }}-${{ github.run_id }}
+      #      - name: "Get sonarcloud token"
+      #        if: ${{ github.repository == 'apache/dubbo-spi-extensions' }}
+      #        run: |
+      #          curl "http://dubbo-vm.apache.org:8000/token?workflow_id=${{ 
github.run_id }}" -o ${{ github.workspace }}/.tmp/encrypted-sonarcloud-token
+      #          openssl rsautl -decrypt -in ${{ github.workspace 
}}/.tmp/encrypted-sonarcloud-token -out ${{ github.workspace 
}}/.tmp/decrypted-sonarcloud-token -inkey ${{ github.workspace 
}}/.tmp/rsa/rsa_private.pem
+      #      - name: "Test with Maven with SonarCloud Scan"
+      #        if: ${{ github.repository == 'apache/dubbo-spi-extensions' }}
+      #        timeout-minutes: 70
+      #        env:
+      #          # Needed to get some information about the pull request, if 
any
+      #          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+      #        run: |
+      #          source ${{ github.workspace }}/.tmp/decrypted-sonarcloud-token
+      #          ./mvnw --batch-mode --no-snapshot-updates -e 
--no-transfer-progress --fail-fast clean test verify 
org.sonarsource.scanner.maven:sonar-maven-plugin:sonar 
-Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 
-Dsonar.host.url=https://sonarcloud.io -Dsonar.organization=apache 
-Dsonar.projectKey=apache_dubbo -DtrimStackTrace=false 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false 
-DskipIntegrationTests=false -Dcheckstyle.skip [...]
+      - name: "Test with Maven without SonarCloud Scan"
+        timeout-minutes: 70
+        run: |
+          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast clean test verify 
-Dmaven.wagon.httpconnectionManager.ttlSeconds=120 
-Pjacoco,jdk15ge-simple,'!jdk15ge',jacoco089 -DtrimStackTrace=false 
-Dmaven.wagon.http.retryHandler.count=5 -DskipTests=false 
-DskipIntegrationTests=false -Dcheckstyle.skip=false 
-Dcheckstyle_unix.skip=false -Drat.skip=false -Dmaven.javadoc.skip=true 
-DembeddedZookeeperPath=${{ github.workspace }}/.tmp/zookeeper
+      - name: "Upload coverage result"
+        uses: actions/upload-artifact@v4
+        with:
+          name: coverage-result-jdk11
+          path: "**/target/site/**/jacoco.xml"
+
+#  error-code-inspecting:
+#    needs: [check-license, build-tools]
+#    runs-on: ubuntu-latest
+#    steps:
+#      - uses: actions/checkout@v4
+#        with:
+#          path: "./dubbo-spi-extensions"
+#      - uses: actions/checkout@v4
+#        with:
+#          repository: 'apache/dubbo-test-tools'
+#          ref: main
+#          path: "./dubbo-test-tools"
+#      - name: "Set up JDK 21"
+#        uses: actions/setup-java@v4
+#        with:
+#          distribution: 'zulu'
+#          java-version: 21
+#      - name: Restore Maven local repository cache
+#        uses: actions/cache@v3
+#        with:
+#          path: ~/.m2/repository
+#          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+#          restore-keys: |
+#            ${{ runner.os }}-maven-
+#            ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+#      - name: "Compile Dubbo-SPI-Extensions (Linux)"
+#        run: |
+#          cd ${{ github.workspace }}/dubbo-spi-extensions
+#          ./mvnw --batch-mode --no-snapshot-updates -e --no-transfer-progress 
--fail-fast -T 2C clean install -DskipTests=true -DskipIntegrationTests=true 
-Dcheckstyle.skip=true -Dcheckstyle_unix.skip=true -Drat.skip=true 
-Dmaven.javadoc.skip=true
+#      - name: "Run Error Code Inspecting"
+#        env:
+#          DUBBO_ECI_REPORT_AS_ERROR: true
+#        run: |
+#          cd ${{ github.workspace 
}}/dubbo-test-tools/dubbo-error-code-inspector
+#          ../mvnw --batch-mode --no-snapshot-updates -e 
--no-transfer-progress --fail-fast -T 2C package exec:java 
-Ddubbo.eci.report-as-error=${DUBBO_ECI_REPORT_AS_ERROR} -Dmaven.test.skip=true 
-Dmaven.test.skip.exec=true -Ddubbo.eci.path=${{ github.workspace 
}}/dubbo-spi-extensions
+#      - name: "Upload error code inspection result"
+#        # always() should not be used here, since we don't need to handle the 
'canceled' situation.
+#        if: ${{ success() || failure() }}
+#        uses: actions/upload-artifact@v4
+#        with:
+#          name: "error-inspection-result"
+#          path: ${{ github.workspace 
}}/dubbo-test-tools/dubbo-error-code-inspector/error-inspection-result.txt
diff --git a/.licenserc.yaml b/.licenserc.yaml
new file mode 100644
index 0000000..87bad49
--- /dev/null
+++ b/.licenserc.yaml
@@ -0,0 +1,213 @@
+header:
+  license:
+    spdx-id: Apache-2.0
+    content: |
+      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.
+
+  paths-ignore:
+    - '**/*.versionsBackup'
+    - '**/.idea/'
+    - '**/*.iml'
+    - '**/.settings/*'
+    - '**/.classpath'
+    - '**/.project'
+    - '**/target/**'
+    - '**/generated/**'
+    - '**/*.log'
+    - '**/codestyle/*'
+    - '**/resources/META-INF/**'
+    - '**/resources/mockito-extensions/**'
+    - '**/*.proto'
+    - '**/*.cache'
+    - '**/*.txt'
+    - '**/*.load'
+    - '**/*.flex'
+    - '**/*.fc'
+    - '**/*.javascript'
+    - '**/*.properties'
+    - '**/*.sh'
+    - '**/*.bat'
+    - '**/*.md'
+    - '**/*.svg'
+    - '**/*.png'
+    - '**/*.json'
+    - '**/*.conf'
+    - '**/*.ftl'
+    - '**/*.tpl'
+    - '**/*.factories'
+    - '**/*.handlers'
+    - '**/*.schemas'
+    - '**/*.nojekyll'
+    - '.git/'
+    - '.github/**'
+    - '**/.gitignore'
+    - '**/.helmignore'
+    - '.repository/'
+    - 'compiler/**'
+    - '.gitmodules'
+    - '.mvn'
+    - 'mvnw'
+    - 'mvnw.cmd'
+    - 'LICENSE'
+    - 'NOTICE'
+    - 'CNAME'
+    - 'Jenkinsfile'
+    - '**/vendor/**'
+    - '**/src/test/resources/certs/**'
+    - '**/src/test/resources/definition/**'
+    # Generate class
+    - 
'dubbo-rpc-extensions/dubbo-rpc-native-thrift/src/test/java/org/apache/dubbo/rpc/protocol/nativethrift/DemoService.java'
+    - 
'dubbo-rpc-extensions/dubbo-rpc-native-thrift/src/test/java/org/apache/dubbo/rpc/protocol/nativethrift/UserService.java'
+    # other license
+    - 
'test/scenarios/scenarios-dubbo-serialization/dubbo-serialization-avro-test/src/main/java/org/apache/dubbo/test/serialization/avro/EmbeddedZooKeeper.java'
+    - 
'test/scenarios/scenarios-dubbo-serialization/dubbo-serialization-fastjson-test/src/main/java/org/apache/dubbo/test/serialization/fastjson/EmbeddedZooKeeper.java'
+    - 
'test/scenarios/scenarios-dubbo-serialization/dubbo-serialization-fst-test/src/main/java/org/apache/dubbo/test/serialization/fst/EmbeddedZooKeeper.java'
+    - 
'test/scenarios/scenarios-dubbo-serialization/dubbo-serialization-gson-test/src/main/java/org/apache/dubbo/test/serialization/gson/EmbeddedZooKeeper.java'
+    - 
'test/scenarios/scenarios-dubbo-serialization/dubbo-serialization-kryo-test/src/main/java/org/apache/dubbo/test/serialization/kryo/EmbeddedZooKeeper.java'
+    - 
'test/scenarios/scenarios-dubbo-serialization/dubbo-serialization-protostuff-test/src/main/java/org/apache/dubbo/test/serialization/protostuff/EmbeddedZooKeeper.java'
+
+  comment: on-failure
+
+  license-location-threshold: 130
+
+dependency:
+  files:
+    - pom.xml
+    - dubbo-extensions-dependencies-bom/pom.xml
+  licenses:
+    - name: com.alibaba.spring:spring-context-support
+      license: Apache-2.0
+    - name: com.fasterxml.jackson.core:jackson-annotations
+      license: Apache-2.0
+    - name: com.fasterxml.jackson.core:jackson-core
+      license: Apache-2.0
+    - name: com.fasterxml.jackson.core:jackson-databind
+      license: Apache-2.0
+    - name: com.fasterxml.jackson.dataformat:jackson-dataformat-yaml
+      license: Apache-2.0
+    - name: com.fasterxml.jackson.datatype:jackson-datatype-jsr310
+      license: Apache-2.0
+    - name: com.google.code.gson:gson
+      license: Apache-2.0
+    - name: com.google.guava:listenablefuture
+      license: Apache-2.0
+    - name: com.salesforce.servicelibs:grpc-contrib
+      license: BSD 3-clause
+    - name: com.squareup.okhttp3:logging-interceptor
+      license: Apache-2.0
+    - name: com.squareup.okhttp3:okhttp
+      license: Apache-2.0
+    - name: com.squareup.okio:okio
+      license: Apache-2.0
+    - name: com.sun.xml.fastinfoset:FastInfoset
+      license: Apache-2.0
+    - name: io.envoyproxy.controlplane:api
+      license: Apache-2.0
+    - name: io.swagger:swagger-annotations
+      license: Apache-2.0
+    - name: io.swagger:swagger-models
+      license: Apache-2.0
+    - name: org.springframework.boot:spring-boot
+      license: Apache-2.0
+    - name: org.springframework.boot:spring-boot-actuator
+      license: Apache-2.0
+    - name: org.springframework.boot:spring-boot-autoconfigure
+      license: Apache-2.0
+    - name: org.springframework.boot:spring-boot-configuration-processor
+      license: Apache-2.0
+    - name: org.springframework.boot:spring-boot-starter
+      license: Apache-2.0
+    - name: org.springframework.boot:spring-boot-starter-actuator
+      license: Apache-2.0
+    - name: org.springframework.boot:spring-boot-starter-logging
+      license: Apache-2.0
+    - name: org.springframework.boot:spring-boot-starter-tomcat
+      license: Apache-2.0
+    - name: org.springframework.boot:spring-boot-starter-web
+      license: Apache-2.0
+    - name: org.slf4j:slf4j-api
+      license: MIT
+    - name: org.slf4j:slf4j-log4j12
+      license: MIT
+    - name: org.jboss.resteasy:resteasy-jaxrs
+      license: Apache-2.0
+    - name: org.jboss.resteasy:resteasy-client
+      license: Apache-2.0
+    - name: org.jboss.resteasy:resteasy-netty4
+      license: Apache-2.0
+    - name: org.jboss.resteasy:resteasy-jdk-http
+      license: Apache-2.0
+    - name: org.jboss.resteasy:resteasy-jackson-provider
+      license: Apache-2.0
+    - name: org.jboss.resteasy:resteasy-jaxb-provider
+      license: Apache-2.0
+    - name: net.jcip:jcip-annotations
+      license: Apache-2.0
+    - name: org.apache.zookeeper:zookeeper
+      license: Apache-2.0
+    - name: org.apache.zookeeper:zookeeper-jute
+      license: Apache-2.0
+    - name: net.bytebuddy:byte-buddy
+      license: Apache-2.0
+    - name: javax.enterprise:cdi-api
+      license: Apache-2.0
+    - name: org.codehaus.plexus:plexus-component-annotations
+      license: Apache-2.0
+    - name: org.slf4j:jcl-over-slf4j
+      license: Apache-2.0
+    - name: org.slf4j:jul-to-slf4j
+      license: Apache-2.0
+    - name: org.codehaus.plexus:plexus-interpolation
+      license: Apache-2.0
+    - name: org.sonatype.plexus:plexus-sec-dispatcher
+      license: Apache-2.0
+    - name: org.sonatype.plexus:plexus-cipher
+      license: Apache-2.0
+    - name: com.google.protobuf:protobuf-java
+      license: BSD 3-clause
+    - name: com.google.protobuf:protobuf-java-util
+      license: BSD 3-clause
+    # multi license
+    - name: org.javassist:javassist
+      license: Apache-2.0
+    - name: javax.annotation:javax.annotation-api
+      license: CDDL-1.0
+    - name: com.salesforce.servicelibs:jprotoc
+      license: CDDL-1.0
+    - name: org.checkerframework:checker-compat-qual
+      license: MIT
+    - name: ch.qos.logback:logback-classic
+      license: EPL-1.0
+    - name: ch.qos.logback:logback-core
+      license: EPL-1.0
+    - name: javax.servlet:javax.servlet-api
+      license: CDDL-1.1
+    - name: com.sun.activation:javax.activation
+      license: CDDL-1.1
+    - name: javax.activation:activation
+      license: CDDL-1.1
+    - name: jakarta.annotation:jakarta.annotation-api
+      license: EPL-2.0
+    - name: org.glassfish:jakarta.el
+      license: EPL-2.0
+    - name: org.jboss.spec.javax.annotation:jboss-annotations-api_1.2_spec
+      license: CDDL-1.1
+    - name: org.jboss.spec.javax.ws.rs:jboss-jaxrs-api_2.1_spec
+      license: EPL-2.0
+    - name: org.jboss.spec.javax.annotation:jboss-annotations-api_1.3_spec
+      license: EPL-2.0
+  excludes:
+    - name: javax.xml.bind:jsr173_api
diff --git 
a/dubbo-cluster-extensions/dubbo-cluster-loadbalance-peakewma/src/test/java/org/apache/dubbo/rpc/cluster/loadbalance/LoadBalanceBaseTest.java
 
b/dubbo-cluster-extensions/dubbo-cluster-loadbalance-peakewma/src/test/java/org/apache/dubbo/rpc/cluster/loadbalance/LoadBalanceBaseTest.java
index a7fcdac..bbfea6f 100644
--- 
a/dubbo-cluster-extensions/dubbo-cluster-loadbalance-peakewma/src/test/java/org/apache/dubbo/rpc/cluster/loadbalance/LoadBalanceBaseTest.java
+++ 
b/dubbo-cluster-extensions/dubbo-cluster-loadbalance-peakewma/src/test/java/org/apache/dubbo/rpc/cluster/loadbalance/LoadBalanceBaseTest.java
@@ -3,7 +3,7 @@
  * 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 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
diff --git 
a/dubbo-cluster-extensions/dubbo-cluster-loadbalance-peakewma/src/test/java/org/apache/dubbo/rpc/cluster/loadbalance/PeakEwmaLoadBalanceTest.java
 
b/dubbo-cluster-extensions/dubbo-cluster-loadbalance-peakewma/src/test/java/org/apache/dubbo/rpc/cluster/loadbalance/PeakEwmaLoadBalanceTest.java
index f461660..ae58f79 100644
--- 
a/dubbo-cluster-extensions/dubbo-cluster-loadbalance-peakewma/src/test/java/org/apache/dubbo/rpc/cluster/loadbalance/PeakEwmaLoadBalanceTest.java
+++ 
b/dubbo-cluster-extensions/dubbo-cluster-loadbalance-peakewma/src/test/java/org/apache/dubbo/rpc/cluster/loadbalance/PeakEwmaLoadBalanceTest.java
@@ -3,7 +3,7 @@
  * 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 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
diff --git 
a/dubbo-remoting-extensions/dubbo-remoting-mina/src/test/resources/security/serialize.allowlist
 
b/dubbo-remoting-extensions/dubbo-remoting-mina/src/test/resources/security/serialize.allowlist
index 8f81635..cca5734 100644
--- 
a/dubbo-remoting-extensions/dubbo-remoting-mina/src/test/resources/security/serialize.allowlist
+++ 
b/dubbo-remoting-extensions/dubbo-remoting-mina/src/test/resources/security/serialize.allowlist
@@ -1,2 +1,21 @@
+#
+#
+#   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.
+#
+#
+
 org.apache.remoting.transport.mina.World
 org.apache.remoting.transport.mina.Hello

Reply via email to