You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2021/12/27 05:18:27 UTC

[dubbo] branch 3.0 updated: JDK17 Support for Dubbo (#9062)

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

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


The following commit(s) were added to refs/heads/3.0 by this push:
     new f33398f  JDK17 Support for Dubbo (#9062)
f33398f is described below

commit f33398f857b5dc63ab60798adb68fef4024fb657
Author: Albumen Kevin <jh...@gmail.com>
AuthorDate: Mon Dec 27 13:18:15 2021 +0800

    JDK17 Support for Dubbo (#9062)
    
    * Add JDK17 Support for Javaassist
    
    * compact javaassist
    
    * compact javaassist
    
    * opt code
    
    * fix compile
    
    * fix classpath
    
    * add ant
    
    * tmp fix
    
    * fix ut
    
    * change name
    
    * Refactor get class
    
    * remove reflect get stackTrace
    
    * Fix support jdk 17
    
    * Add jdk 17 to ut
    
    * Add jdk 17 to ut
    
    * update mockito version
    
    * update jacoco
    
    * ignore java compile
    
    * add open
    
    * fix ut
    
    * fix ut
    
    * fix jupiter api
    
    * fix pom
    
    * disable zk 3.4
    
    * disable script router in jdk 17
    
    * remove curator5
    
    * fix ut
    
    * fix ut
    
    * fix ut
    
    * fix ut
    
    * fix ut
    
    * fix ut
    
    * fix ut
    
    * fix ut
    
    * fix zk
    
    * remove test scope
    
    * fix ut
    
    * add open
    
    * fix ut
    
    * add curator
    
    * fix pom
    
    * fix pom
    
    * enable debug
    
    * remove add open
    
    * add open profile
    
    * auto activate open
    
    * disable test in zk
    
    * refactor zk dependency
    
    * remove curator test
    
    * add zookeeper dependency
    
    * fix compile
    
    * change zk default wait time
    
    * change zk default wait time
    
    * fix ut
    
    * set throwable message by constructor
    
    * Add unit prepare jdk 17 support
    
    * fix zk dependency
    
    * remove jackson-databind
---
 .github/workflows/build-and-test-3.yml             |   4 +-
 .../router/script/ScriptStateRouterTest.java       |  37 ++--
 .../dubbo/common/bytecode/ClassGenerator.java      |  25 ++-
 .../common/bytecode/DubboLoaderClassPath.java      |  48 +++++
 .../org/apache/dubbo/common/bytecode/Mixin.java    |   7 +-
 .../org/apache/dubbo/common/bytecode/Proxy.java    | 197 ++++++++-------------
 .../org/apache/dubbo/common/bytecode/Wrapper.java  |  16 +-
 .../org/apache/dubbo/common/compiler/Compiler.java |  19 +-
 .../common/compiler/support/AbstractCompiler.java  |   6 +-
 .../common/compiler/support/AdaptiveCompiler.java  |   4 +-
 .../common/compiler/support/CtClassBuilder.java    |   3 +
 .../common/compiler/support/JavassistCompiler.java |  23 ++-
 .../dubbo/common/compiler/support/JdkCompiler.java |   2 +-
 .../dubbo/common/extension/ExtensionLoader.java    |   2 +-
 .../org/apache/dubbo/common/utils/PojoUtils.java   |  85 ++++-----
 .../apache/dubbo/config/ConfigCenterConfig.java    |   4 +-
 .../dubbo/common/bytecode/ClassGeneratorTest.java  |   4 +-
 .../apache/dubbo/common/bytecode/MixinTest.java    |  10 +-
 .../apache/dubbo/common/bytecode/ProxyTest.java    |   3 +
 .../compiler/support/AdaptiveCompilerTest.java     |   3 +-
 .../common/compiler/support/JavaCodeTest.java      |   9 +
 .../compiler/support/JavassistCompilerTest.java    |  25 ++-
 .../common/compiler/support/JdkCompilerTest.java   |  12 +-
 dubbo-config/dubbo-config-api/pom.xml              |  16 ++
 .../apache/dubbo/config/AbstractConfigTest.java    |   1 +
 .../dubbo/config/ConfigCenterConfigTest.java       |   3 +-
 .../apache/dubbo/config/ReferenceConfigTest.java   |   4 +
 dubbo-config/dubbo-config-spring/pom.xml           |   5 -
 .../ReferenceAnnotationBeanPostProcessorTest.java  |  10 +-
 .../consumer/PropertyConfigurerTest.java           |   5 +-
 .../consumer2/PropertySourcesConfigurerTest.java   |   5 +-
 .../consumer3/PropertySourcesInJavaConfigTest.java |   6 +-
 .../javaconfig/JavaConfigReferenceBeanTest.java    |  27 +--
 .../spring/reference/localcall/LocalCallTest.java  |   5 +-
 .../spring/reference/localcall/LocalCallTest2.java |   5 +-
 .../LocalCallReferenceAnnotationTest.java          |   5 +-
 .../LocalCallMultipleReferenceAnnotationsTest.java |   6 +-
 .../localcallmix/LocalCallReferenceMixTest.java    |   5 +-
 .../dubbo-configcenter-zookeeper/pom.xml           |  21 +++
 .../zookeeper/ZookeeperDynamicConfiguration.java   |   8 +-
 .../ZookeeperDynamicConfigurationTest.java         |   2 +-
 dubbo-dependencies-bom/pom.xml                     |   6 +-
 .../dubbo-dependencies-zookeeper/pom.xml           |  59 ++++++
 .../definition/ServiceDefinitionBuilderTest.java   |  14 +-
 .../annotation/processing/util/TypeUtils.java      |   7 +-
 .../processing/util/MethodUtilsTest.java           |   3 +-
 .../dubbo-metadata-report-zookeeper/pom.xml        |  21 +++
 .../zookeeper/ZookeeperMetadataReportTest.java     |  14 +-
 .../support/CacheableFailbackRegistry.java         |   4 +-
 dubbo-registry/dubbo-registry-kubernetes/pom.xml   |  16 +-
 dubbo-registry/dubbo-registry-multiple/pom.xml     |  21 +++
 .../multiple/MultipleRegistry2S2RTest.java         |   4 +-
 .../ZookeeperServiceDiscoveryFactoryTest.java      |   4 +
 .../zookeeper/ZookeeperServiceDiscoveryTest.java   |   3 +
 .../zookeeper/AbstractZookeeperClient.java         |   3 +-
 .../dubbo-remoting-zookeeper-curator5/pom.xml      |   5 -
 dubbo-remoting/dubbo-remoting-zookeeper/pom.xml    |  14 ++
 .../curator/CuratorZookeeperClientTest.java        |   9 +-
 .../curator/CuratorZookeeperTransporterTest.java   |   3 +
 .../support/AbstractZookeeperTransporterTest.java  |  10 +-
 .../java/org/apache/dubbo/rpc/AppResponse.java     |   4 +-
 .../dubbo/rpc/proxy/InvokerInvocationHandler.java  |  12 --
 .../rpc/protocol/dubbo/ArgumentCallbackTest.java   |   1 +
 .../dubbo/status/ServerStatusCheckerTest.java      |   9 +-
 .../rpc/protocol/injvm/InjvmDeepCopyTest.java      |   2 +-
 ...bstractRegistryCenterTestExecutionListener.java |   1 +
 dubbo-test/dubbo-test-spring/pom.xml               |  22 +++
 dubbo-test/dubbo-test-spring3.2/pom.xml            |  16 ++
 dubbo-test/dubbo-test-spring4.1/pom.xml            |  15 ++
 dubbo-test/dubbo-test-spring4.2/pom.xml            |  15 ++
 pom.xml                                            |  39 +++-
 71 files changed, 695 insertions(+), 348 deletions(-)

diff --git a/.github/workflows/build-and-test-3.yml b/.github/workflows/build-and-test-3.yml
index 4f7b526..d3ebd7b 100644
--- a/.github/workflows/build-and-test-3.yml
+++ b/.github/workflows/build-and-test-3.yml
@@ -72,7 +72,7 @@ jobs:
       fail-fast: false
       matrix:
         os: [ ubuntu-18.04, windows-2019 ]
-        jdk: [ 8, 11 ]
+        jdk: [ 8, 11, 17 ]
     env:
       DISABLE_FILE_SYSTEM_TEST: true
       ZOOKEEPER_VERSION: 3.6.3
@@ -124,7 +124,7 @@ jobs:
       fail-fast: false
       matrix:
         os: [ ubuntu-18.04, windows-2019 ]
-        jdk: [ 8, 11 ]
+        jdk: [ 8, 11, 17 ]
     env:
       DISABLE_FILE_SYSTEM_TEST: true
     steps:
diff --git a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/script/ScriptStateRouterTest.java b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/script/ScriptStateRouterTest.java
index ba4a302..4fe6dc5 100644
--- a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/script/ScriptStateRouterTest.java
+++ b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/router/script/ScriptStateRouterTest.java
@@ -28,12 +28,15 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.DisabledForJreRange;
+import org.junit.jupiter.api.condition.JRE;
 
 import java.util.ArrayList;
 import java.util.List;
 
 import static org.apache.dubbo.rpc.cluster.Constants.RULE_KEY;
 
+@DisabledForJreRange(min = JRE.JAVA_16)
 public class ScriptStateRouterTest {
 
     private URL SCRIPT_URL = URL.valueOf("script://javascript?type=javascript");
@@ -66,12 +69,12 @@ public class ScriptStateRouterTest {
     @Test
     public void testRoutePickInvokers() {
         String rule = "var result = new java.util.ArrayList(invokers.size());" +
-                "for (i=0;i<invokers.size(); i++){ " +
-                "if (invokers.get(i).isAvailable()) {" +
-                "result.add(invokers.get(i)) ;" +
-                "}" +
-                "} ; " +
-                "return result;";
+            "for (i=0;i<invokers.size(); i++){ " +
+            "if (invokers.get(i).isAvailable()) {" +
+            "result.add(invokers.get(i)) ;" +
+            "}" +
+            "} ; " +
+            "return result;";
         String script = "function route(invokers,invocation,context){" + rule + "} route(invokers,invocation,context)";
         StateRouter router = new ScriptStateRouterFactory().getRouter(String.class, getRouteUrl(script));
 
@@ -102,17 +105,17 @@ public class ScriptStateRouterTest {
         BitList<Invoker<String>> invokers = new BitList<>(originInvokers);
 
         String script = "function route(invokers, invocation, context){ " +
-                "    var result = new java.util.ArrayList(invokers.size()); " +
-                "    var targetHost = new java.util.ArrayList(); " +
-                "    targetHost.add(\"10.134.108.2\"); " +
-                "    for (var i = 0; i < invokers.length; i++) { " +
-                "        if(targetHost.contains(invokers[i].getUrl().getHost())){ " +
-                "            result.add(invokers[i]); " +
-                "        } " +
-                "    } " +
-                "    return result; " +
-                "} " +
-                "route(invokers, invocation, context) ";
+            "    var result = new java.util.ArrayList(invokers.size()); " +
+            "    var targetHost = new java.util.ArrayList(); " +
+            "    targetHost.add(\"10.134.108.2\"); " +
+            "    for (var i = 0; i < invokers.length; i++) { " +
+            "        if(targetHost.contains(invokers[i].getUrl().getHost())){ " +
+            "            result.add(invokers[i]); " +
+            "        } " +
+            "    } " +
+            "    return result; " +
+            "} " +
+            "route(invokers, invocation, context) ";
 
         StateRouter router = new ScriptStateRouterFactory().getRouter(String.class, getRouteUrl(script));
         List<Invoker<String>> routeResult = router.route(invokers, invokers.get(0).getUrl(), new RpcInvocation(), false).getResult();
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/ClassGenerator.java b/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/ClassGenerator.java
index 67cc002..aa8b742 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/ClassGenerator.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/ClassGenerator.java
@@ -94,7 +94,7 @@ public final class ClassGenerator {
         if (pool == null) {
             pool = new ClassPool(true);
             pool.insertClassPath(new LoaderClassPath(loader));
-            pool.insertClassPath(new LoaderClassPath(ClassGenerator.class.getClassLoader()));
+            pool.insertClassPath(new DubboLoaderClassPath());
             POOL_MAP.put(loader, pool);
         }
         return pool;
@@ -284,12 +284,17 @@ public final class ClassGenerator {
         return mPool;
     }
 
-    public Class<?> toClass() {
-        return toClass(mClassLoader,
-                getClass().getProtectionDomain());
+    /**
+     * @param neighbor    A class belonging to the same package that this
+     *                    class belongs to.  It is used to load the class.
+     */
+    public Class<?> toClass(Class<?> neighbor) {
+        return toClass(neighbor,
+            mClassLoader,
+            getClass().getProtectionDomain());
     }
 
-    public Class<?> toClass(ClassLoader loader, ProtectionDomain pd) {
+    public Class<?> toClass(Class<?> neighborClass, ClassLoader loader, ProtectionDomain pd) {
         if (mCtc != null) {
             mCtc.detach();
         }
@@ -340,7 +345,15 @@ public final class ClassGenerator {
                     }
                 }
             }
-            return mCtc.toClass(loader, pd);
+
+            try {
+                return mPool.toClass(mCtc, neighborClass, loader, pd);
+            } catch (Throwable t) {
+                if (!(t instanceof CannotCompileException)) {
+                    return mPool.toClass(mCtc, loader, pd);
+                }
+                throw t;
+            }
         } catch (RuntimeException e) {
             throw e;
         } catch (NotFoundException | CannotCompileException e) {
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/DubboLoaderClassPath.java b/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/DubboLoaderClassPath.java
new file mode 100644
index 0000000..1e47997
--- /dev/null
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/DubboLoaderClassPath.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.common.bytecode;
+
+import javassist.LoaderClassPath;
+import javassist.NotFoundException;
+
+import java.io.InputStream;
+import java.net.URL;
+
+/**
+ * Ensure javassist will load Dubbo's class from Dubbo's classLoader
+ */
+public class DubboLoaderClassPath extends LoaderClassPath {
+    public DubboLoaderClassPath() {
+        super(DubboLoaderClassPath.class.getClassLoader());
+    }
+
+    @Override
+    public InputStream openClassfile(String classname) throws NotFoundException {
+        if (!classname.startsWith("org.apache.dubbo")) {
+            return null;
+        }
+        return super.openClassfile(classname);
+    }
+
+    @Override
+    public URL find(String classname) {
+        if (!classname.startsWith("org.apache.dubbo")) {
+            return null;
+        }
+        return super.find(classname);
+    }
+}
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Mixin.java b/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Mixin.java
index f8a7e1f..88f23be 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Mixin.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Mixin.java
@@ -113,6 +113,7 @@ public abstract class Mixin {
             }
             ccp.addConstructor(Modifier.PUBLIC, new Class<?>[]{Object[].class}, code.toString());
 
+            Class<?> neighbor = null;
             // impl methods.
             Set<String> worked = new HashSet<String>();
             for (int i = 0; i < ics.length; i++) {
@@ -120,6 +121,7 @@ public abstract class Mixin {
                     String npkg = ics[i].getPackage().getName();
                     if (pkg == null) {
                         pkg = npkg;
+                        neighbor = ics[i];
                     } else {
                         if (!pkg.equals(npkg)) {
                             throw new IllegalArgumentException("non-public delegate class from different packages");
@@ -159,12 +161,13 @@ public abstract class Mixin {
 
             if (pkg == null) {
                 pkg = PACKAGE_NAME;
+                neighbor = Mixin.class;
             }
 
             // create MixinInstance class.
             String micn = pkg + ".mixin" + id;
             ccp.setClassName(micn);
-            ccp.toClass();
+            ccp.toClass(neighbor);
 
             // create Mixin class.
             String fcn = Mixin.class.getName() + id;
@@ -173,7 +176,7 @@ public abstract class Mixin {
             ccm.addDefaultConstructor();
             ccm.setSuperClass(Mixin.class.getName());
             ccm.addMethod("public Object newInstance(Object[] delegates){ return new " + micn + "($1); }");
-            Class<?> mixin = ccm.toClass();
+            Class<?> mixin = ccm.toClass(Mixin.class);
             return (Mixin) mixin.getDeclaredConstructor().newInstance();
         } catch (RuntimeException e) {
             throw e;
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Proxy.java b/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Proxy.java
index 2d9b5ca..30617a2 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Proxy.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Proxy.java
@@ -18,19 +18,18 @@ package org.apache.dubbo.common.bytecode;
 
 import org.apache.dubbo.common.utils.ReflectUtils;
 
-import java.lang.ref.Reference;
-import java.lang.ref.SoftReference;
+import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.security.ProtectionDomain;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicLong;
 
 import static org.apache.dubbo.common.constants.CommonConstants.MAX_PROXY_COUNT;
@@ -39,29 +38,26 @@ import static org.apache.dubbo.common.constants.CommonConstants.MAX_PROXY_COUNT;
  * Proxy.
  */
 
-public abstract class Proxy {
-    public static final InvocationHandler RETURN_NULL_INVOKER = (proxy, method, args) -> null;
+public class Proxy {
     public static final InvocationHandler THROW_UNSUPPORTED_INVOKER = new InvocationHandler() {
         @Override
         public Object invoke(Object proxy, Method method, Object[] args) {
             throw new UnsupportedOperationException("Method [" + ReflectUtils.getName(method) + "] unimplemented.");
         }
     };
+
     private static final AtomicLong PROXY_CLASS_COUNTER = new AtomicLong(0);
-    private static final String PACKAGE_NAME = Proxy.class.getPackage().getName();
-    private static final Map<ClassLoader, Map<String, Object>> PROXY_CACHE_MAP = new WeakHashMap<ClassLoader, Map<String, Object>>();
-    // cache class, avoid PermGen OOM.
-    private static final Map<ClassLoader, Map<String, Object>> PROXY_CLASS_MAP = new WeakHashMap<ClassLoader, Map<String, Object>>();
+    private static final Map<ClassLoader, Map<String, Proxy>> PROXY_CACHE_MAP = new WeakHashMap<>();
 
-    private static final Object PENDING_GENERATION_MARKER = new Object();
+    private final Class<?> classToCreate;
 
-    protected Proxy() {
+    protected Proxy(Class<?> classToCreate) {
+        this.classToCreate = classToCreate;
     }
 
     /**
      * Get proxy.
      *
-     * @param cl  class loader.
      * @param ics interface class array.
      * @return Proxy instance.
      */
@@ -72,112 +68,76 @@ public abstract class Proxy {
 
         // ClassLoader from App Interface should support load some class from Dubbo
         ClassLoader cl = ics[0].getClassLoader();
-        ClassLoader appClassLoader = ics[0].getClassLoader();
         ProtectionDomain domain = ics[0].getProtectionDomain();
 
+        // use interface class name list as key.
+        String key = buildInterfacesKey(cl, ics);
+
+        // get cache by class loader.
+        final Map<String, Proxy> cache;
+        synchronized (PROXY_CACHE_MAP) {
+            cache = PROXY_CACHE_MAP.computeIfAbsent(cl, k -> new ConcurrentHashMap<>());
+        }
+
+        Proxy proxy = cache.get(key);
+        if (proxy == null) {
+            synchronized (ics[0]) {
+                proxy = cache.get(key);
+                if (proxy == null) {
+                    // create Proxy class.
+                    proxy = new Proxy(buildProxyClass(cl, ics, domain));
+                    cache.put(key, proxy);
+                }
+            }
+        }
+        return proxy;
+    }
+
+    private static String buildInterfacesKey(ClassLoader cl, Class<?>[] ics) {
         StringBuilder sb = new StringBuilder();
-        for (int i = 0; i < ics.length; i++) {
-            String itf = ics[i].getName();
-            if (!ics[i].isInterface()) {
+        for (Class<?> ic : ics) {
+            String itf = ic.getName();
+            if (!ic.isInterface()) {
                 throw new RuntimeException(itf + " is not a interface.");
             }
 
             Class<?> tmp = null;
             try {
                 tmp = Class.forName(itf, false, cl);
-            } catch (ClassNotFoundException e) {
+            } catch (ClassNotFoundException ignore) {
             }
 
-            if (tmp != ics[i]) {
-                throw new IllegalArgumentException(ics[i] + " is not visible from class loader");
+            if (tmp != ic) {
+                throw new IllegalArgumentException(ic + " is not visible from class loader");
             }
 
             sb.append(itf).append(';');
         }
+        return sb.toString();
+    }
 
-        // use interface class name list as key.
-        String key = sb.toString();
-
-        // get cache by class loader.
-        final Map<String, Object> cache;
-        // cache class
-        final Map<String, Object> classCache;
-        synchronized (PROXY_CACHE_MAP) {
-            cache = PROXY_CACHE_MAP.computeIfAbsent(cl, k -> new HashMap<>());
-            classCache = PROXY_CLASS_MAP.computeIfAbsent(cl, k -> new HashMap<>());
-        }
-
-        Proxy proxy = null;
-        synchronized (cache) {
-            do {
-                Object value = cache.get(key);
-                if (value instanceof Reference<?>) {
-                    proxy = (Proxy) ((Reference<?>) value).get();
-                    if (proxy != null) {
-                        return proxy;
-                    }
-                }
-
-                // get Class by key.
-                Object clazzObj = classCache.get(key);
-                if (null == clazzObj || clazzObj instanceof Reference<?>) {
-                    Class<?> clazz = null;
-                    if (clazzObj instanceof Reference<?>) {
-                        clazz = (Class<?>) ((Reference<?>) clazzObj).get();
-                    }
-
-                    if (null == clazz) {
-                        if (value == PENDING_GENERATION_MARKER) {
-                            try {
-                                cache.wait();
-                            } catch (InterruptedException e) {
-                            }
-                        } else {
-                            cache.put(key, PENDING_GENERATION_MARKER);
-                            break;
-                        }
-                    } else {
-                        try {
-                            proxy = (Proxy) clazz.newInstance();
-                            return proxy;
-                        } catch (InstantiationException | IllegalAccessException e) {
-                            throw new RuntimeException(e);
-                        } finally {
-                            if (null == proxy) {
-                                cache.remove(key);
-                            } else {
-                                cache.put(key, new SoftReference<>(proxy));
-                            }
-                        }
-                    }
-                }
-            }
-            while (true);
-        }
-
-        long id = PROXY_CLASS_COUNTER.getAndIncrement();
-        String pkg = null;
-        ClassGenerator ccp = null, ccm = null;
+    private static Class<?> buildProxyClass(ClassLoader cl, Class<?>[] ics, ProtectionDomain domain) {
+        ClassGenerator ccp = null;
         try {
             ccp = ClassGenerator.newInstance(cl);
 
             Set<String> worked = new HashSet<>();
             List<Method> methods = new ArrayList<>();
 
-            for (int i = 0; i < ics.length; i++) {
-                if (!Modifier.isPublic(ics[i].getModifiers())) {
-                    String npkg = ics[i].getPackage().getName();
-                    if (pkg == null) {
-                        pkg = npkg;
-                    } else {
-                        if (!pkg.equals(npkg)) {
-                            throw new IllegalArgumentException("non-public interfaces from different packages");
-                        }
+            String pkg = ics[0].getPackage().getName();
+            Class<?> neighbor = ics[0];
+
+            for (Class<?> ic : ics) {
+                String npkg = ic.getPackage().getName();
+                if (!Modifier.isPublic(ic.getModifiers())) {
+                    if (!pkg.equals(npkg)) {
+                        throw new IllegalArgumentException("non-public interfaces from different packages");
                     }
                 }
-                ccp.addInterface(ics[i]);
 
-                for (Method method : ics[i].getMethods()) {
+                ccp.addInterface(ic);
+
+                for (Method method : ic.getMethods()) {
                     String desc = ReflectUtils.getDesc(method);
                     if (worked.contains(desc) || Modifier.isStatic(method.getModifiers())) {
                         continue;
@@ -202,33 +162,16 @@ public abstract class Proxy {
                 }
             }
 
-            if (pkg == null) {
-                pkg = PACKAGE_NAME;
-            }
-
             // create ProxyInstance class.
-            String pcn = pkg + ".proxy" + id;
+            String pcn = neighbor.getName() + "DubboProxy" + PROXY_CLASS_COUNTER.getAndIncrement();
             ccp.setClassName(pcn);
             ccp.addField("public static java.lang.reflect.Method[] methods;");
             ccp.addField("private " + InvocationHandler.class.getName() + " handler;");
-            ccp.addConstructor(Modifier.PUBLIC, new Class<?>[] {InvocationHandler.class}, new Class<?>[0], "handler=$1;");
+            ccp.addConstructor(Modifier.PUBLIC, new Class<?>[]{InvocationHandler.class}, new Class<?>[0], "handler=$1;");
             ccp.addDefaultConstructor();
-            Class<?> clazz = ccp.toClass(appClassLoader, domain);
+            Class<?> clazz = ccp.toClass(neighbor, cl, domain);
             clazz.getField("methods").set(null, methods.toArray(new Method[0]));
-
-            // create Proxy class.
-            String fcn = Proxy.class.getName() + id;
-            ccm = ClassGenerator.newInstance(cl);
-            ccm.setClassName(fcn);
-            ccm.addDefaultConstructor();
-            ccm.setSuperClass(Proxy.class);
-            ccm.addMethod("public Object newInstance(" + InvocationHandler.class.getName() + " h){ return new " + pcn + "($1); }");
-            Class<?> pc = ccm.toClass(appClassLoader, domain);
-            proxy = (Proxy) pc.newInstance();
-
-            synchronized (classCache) {
-                classCache.put(key, new SoftReference<Class<?>>(pc));
-            }
+            return clazz;
         } catch (RuntimeException e) {
             throw e;
         } catch (Exception e) {
@@ -238,19 +181,7 @@ public abstract class Proxy {
             if (ccp != null) {
                 ccp.release();
             }
-            if (ccm != null) {
-                ccm.release();
-            }
-            synchronized (cache) {
-                if (proxy == null) {
-                    cache.remove(key);
-                } else {
-                    cache.put(key, new SoftReference<Proxy>(proxy));
-                }
-                cache.notifyAll();
-            }
         }
-        return proxy;
     }
 
     private static String asArgument(Class<?> cl, String name) {
@@ -298,5 +229,17 @@ public abstract class Proxy {
      *
      * @return instance.
      */
-    abstract public Object newInstance(InvocationHandler handler);
+    public Object newInstance(InvocationHandler handler) {
+        Constructor<?> constructor;
+        try {
+            constructor = classToCreate.getDeclaredConstructor(InvocationHandler.class);
+            return constructor.newInstance(handler);
+        } catch (ReflectiveOperationException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public Class<?> getClassToCreate() {
+        return classToCreate;
+    }
 }
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Wrapper.java b/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Wrapper.java
index e5040e4..64373fc 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Wrapper.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/bytecode/Wrapper.java
@@ -151,14 +151,14 @@ public abstract class Wrapper {
                 continue;
             }
 
-            c1.append(" if( $2.equals(\"").append(fn).append("\") ){ ((" + f.getDeclaringClass().getName() + ")w).").append(fn).append('=').append(arg(ft, "$3")).append("; return; }");
-            c2.append(" if( $2.equals(\"").append(fn).append("\") ){ return ($w)((" + f.getDeclaringClass().getName() + ")w).").append(fn).append("; }");
+            c1.append(" if( $2.equals(\"").append(fn).append("\") ){ ((").append(f.getDeclaringClass().getName()).append(")w).").append(fn).append('=').append(arg(ft, "$3")).append("; return; }");
+            c2.append(" if( $2.equals(\"").append(fn).append("\") ){ return ($w)((").append(f.getDeclaringClass().getName()).append(")w).").append(fn).append("; }");
             pts.put(fn, ft);
         }
 
         final ClassPool classPool = new ClassPool(ClassPool.getDefault());
         classPool.insertClassPath(new LoaderClassPath(cl));
-        classPool.insertClassPath(new LoaderClassPath(ClassGenerator.class.getClassLoader()));
+        classPool.insertClassPath(new DubboLoaderClassPath());
 
         List<String> allMethod = new ArrayList<>();
         try {
@@ -226,7 +226,7 @@ public abstract class Wrapper {
             c3.append(" }");
         }
 
-        c3.append(" throw new " + NoSuchMethodException.class.getName() + "(\"Not found method \\\"\"+$2+\"\\\" in class " + c.getName() + ".\"); }");
+        c3.append(" throw new ").append(NoSuchMethodException.class.getName()).append("(\"Not found method \\\"\"+$2+\"\\\" in class ").append(c.getName()).append(".\"); }");
 
         // deal with get/set method.
         Matcher matcher;
@@ -248,13 +248,13 @@ public abstract class Wrapper {
                 pts.put(pn, pt);
             }
         }
-        c1.append(" throw new " + NoSuchPropertyException.class.getName() + "(\"Not found property \\\"\"+$2+\"\\\" field or setter method in class " + c.getName() + ".\"); }");
-        c2.append(" throw new " + NoSuchPropertyException.class.getName() + "(\"Not found property \\\"\"+$2+\"\\\" field or getter method in class " + c.getName() + ".\"); }");
+        c1.append(" throw new ").append(NoSuchPropertyException.class.getName()).append("(\"Not found property \\\"\"+$2+\"\\\" field or setter method in class ").append(c.getName()).append(".\"); }");
+        c2.append(" throw new ").append(NoSuchPropertyException.class.getName()).append("(\"Not found property \\\"\"+$2+\"\\\" field or getter method in class ").append(c.getName()).append(".\"); }");
 
         // make class
         long id = WRAPPER_CLASS_COUNTER.getAndIncrement();
         ClassGenerator cc = ClassGenerator.newInstance(cl);
-        cc.setClassName((Modifier.isPublic(c.getModifiers()) ? Wrapper.class.getName() : c.getName() + "$sw") + id);
+        cc.setClassName(c.getName() + "DubboWrap" + id);
         cc.setSuperClass(Wrapper.class);
 
         cc.addDefaultConstructor();
@@ -276,7 +276,7 @@ public abstract class Wrapper {
         cc.addMethod(c3.toString());
 
         try {
-            Class<?> wc = cc.toClass();
+            Class<?> wc = cc.toClass(c);
             // setup static field.
             wc.getField("pts").set(null, pts);
             wc.getField("pns").set(null, pts.keySet().toArray(new String[0]));
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/Compiler.java b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/Compiler.java
index ecf6f14..dca8ec5 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/Compiler.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/Compiler.java
@@ -31,7 +31,24 @@ public interface Compiler {
      * @param code        Java source code
      * @param classLoader classloader
      * @return Compiled class
+     * @deprecated use {@link Compiler#compile(Class, String, ClassLoader)} to support JDK 16
      */
-    Class<?> compile(String code, ClassLoader classLoader);
+    @Deprecated
+    default Class<?> compile(String code, ClassLoader classLoader) {
+        return compile(null, code, classLoader);
+    }
+
+    /**
+     * Compile java source code.
+     *
+     * @param neighbor    A class belonging to the same package that this
+     *                    class belongs to.  It is used to load the class. (For JDK 16 and above)
+     * @param code        Java source code
+     * @param classLoader classloader
+     * @return Compiled class
+     */
+    default Class<?> compile(Class<?> neighbor, String code, ClassLoader classLoader) {
+        return compile(code, classLoader);
+    }
 
 }
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/AbstractCompiler.java b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/AbstractCompiler.java
index 053ee1f..69f59ec 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/AbstractCompiler.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/AbstractCompiler.java
@@ -37,7 +37,7 @@ public abstract class AbstractCompiler implements Compiler {
     private static final Map<String, Lock> CLASS_IN_CREATION_MAP = new ConcurrentHashMap<>();
 
     @Override
-    public Class<?> compile(String code, ClassLoader classLoader) {
+    public Class<?> compile(Class<?> neighbor, String code, ClassLoader classLoader) {
         code = code.trim();
         Matcher matcher = PACKAGE_PATTERN.matcher(code);
         String pkg;
@@ -67,7 +67,7 @@ public abstract class AbstractCompiler implements Compiler {
                 throw new IllegalStateException("The java code not endsWith \"}\", code: \n" + code + "\n");
             }
             try {
-                return doCompile(classLoader, className, code);
+                return doCompile(neighbor, classLoader, className, code);
             } catch (RuntimeException t) {
                 throw t;
             } catch (Throwable t) {
@@ -78,6 +78,6 @@ public abstract class AbstractCompiler implements Compiler {
         }
     }
 
-    protected abstract Class<?> doCompile(ClassLoader classLoader, String name, String source) throws Throwable;
+    protected abstract Class<?> doCompile(Class<?> neighbor,ClassLoader classLoader, String name, String source) throws Throwable;
 
 }
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/AdaptiveCompiler.java b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/AdaptiveCompiler.java
index 9e6771d..2518c22 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/AdaptiveCompiler.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/AdaptiveCompiler.java
@@ -41,7 +41,7 @@ public class AdaptiveCompiler implements Compiler, ScopeModelAware {
     }
 
     @Override
-    public Class<?> compile(String code, ClassLoader classLoader) {
+    public Class<?> compile(Class<?> neighbor, String code, ClassLoader classLoader) {
         Compiler compiler;
         ExtensionLoader<Compiler> loader = frameworkModel.getExtensionLoader(Compiler.class);
         String name = DEFAULT_COMPILER; // copy reference
@@ -50,7 +50,7 @@ public class AdaptiveCompiler implements Compiler, ScopeModelAware {
         } else {
             compiler = loader.getDefaultExtension();
         }
-        return compiler.compile(code, classLoader);
+        return compiler.compile(neighbor, code, classLoader);
     }
 
 }
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/CtClassBuilder.java b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/CtClassBuilder.java
index 2ebe8b5..9029d6d 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/CtClassBuilder.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/CtClassBuilder.java
@@ -16,6 +16,8 @@
  */
 package org.apache.dubbo.common.compiler.support;
 
+import org.apache.dubbo.common.bytecode.DubboLoaderClassPath;
+
 import javassist.CannotCompileException;
 import javassist.ClassPool;
 import javassist.CtClass;
@@ -141,6 +143,7 @@ public class CtClassBuilder {
     public CtClass build(ClassLoader classLoader) throws NotFoundException, CannotCompileException {
         ClassPool pool = new ClassPool(true);
         pool.insertClassPath(new LoaderClassPath(classLoader));
+        pool.insertClassPath(new DubboLoaderClassPath());
         
         // create class
         CtClass ctClass = pool.makeClass(className, pool.get(superClassName));
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistCompiler.java b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistCompiler.java
index 2f52ec9..177a766 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistCompiler.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JavassistCompiler.java
@@ -16,8 +16,12 @@
  */
 package org.apache.dubbo.common.compiler.support;
 
+import org.apache.dubbo.common.bytecode.DubboLoaderClassPath;
 
+import javassist.CannotCompileException;
+import javassist.ClassPool;
 import javassist.CtClass;
+import javassist.LoaderClassPath;
 
 import java.util.Arrays;
 import java.util.regex.Matcher;
@@ -39,7 +43,7 @@ public class JavassistCompiler extends AbstractCompiler {
     private static final Pattern FIELD_PATTERN = Pattern.compile("[^\n]+=[^\n]+;");
 
     @Override
-    public Class<?> doCompile(ClassLoader classLoader, String name, String source) throws Throwable {
+    public Class<?> doCompile(Class<?> neighbor, ClassLoader classLoader, String name, String source) throws Throwable {
         CtClassBuilder builder = new CtClassBuilder();
         builder.setClassName(name);
 
@@ -78,7 +82,22 @@ public class JavassistCompiler extends AbstractCompiler {
 
         // compile
         CtClass cls = builder.build(classLoader);
-        return cls.toClass(classLoader, JavassistCompiler.class.getProtectionDomain());
+
+        ClassPool cp = cls.getClassPool();
+        if (classLoader == null) {
+            classLoader = cp.getClassLoader();
+        }
+        cp.insertClassPath(new LoaderClassPath(classLoader));
+        cp.insertClassPath(new DubboLoaderClassPath());
+
+        try {
+            return cp.toClass(cls, neighbor, classLoader, JavassistCompiler.class.getProtectionDomain());
+        } catch (Throwable t) {
+            if (!(t instanceof CannotCompileException)) {
+                return cp.toClass(cls, classLoader, JavassistCompiler.class.getProtectionDomain());
+            }
+            throw t;
+        }
     }
 
 }
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JdkCompiler.java b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JdkCompiler.java
index 443690b..d5e5766 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JdkCompiler.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/compiler/support/JdkCompiler.java
@@ -110,7 +110,7 @@ public class JdkCompiler extends AbstractCompiler {
     }
 
     @Override
-    public Class<?> doCompile(ClassLoader ignored, String name, String sourceCode) throws Throwable {
+    public Class<?> doCompile(Class<?> neighbor, ClassLoader ignored, String name, String sourceCode) throws Throwable {
         int i = name.lastIndexOf('.');
         String packageName = i < 0 ? "" : name.substring(0, i);
         String className = i < 0 ? name : name.substring(i + 1);
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
index b6ada68..245a35e 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/extension/ExtensionLoader.java
@@ -1244,7 +1244,7 @@ public class ExtensionLoader<T> {
         String code = new AdaptiveClassCodeGenerator(type, cachedDefaultName).generate();
         org.apache.dubbo.common.compiler.Compiler compiler = extensionDirector.getExtensionLoader(
             org.apache.dubbo.common.compiler.Compiler.class).getAdaptiveExtension();
-        return compiler.compile(code, classLoader);
+        return compiler.compile(type, code, classLoader);
     }
 
     private Environment getEnvironment() {
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java
index cd30737..d3d9a85 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/PojoUtils.java
@@ -26,7 +26,6 @@ import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.GenericArrayType;
 import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.lang.reflect.ParameterizedType;
@@ -38,6 +37,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Hashtable;
@@ -478,7 +478,18 @@ public class PojoUtils {
                 history.put(pojo, dest);
                 return dest;
             } else {
-                Object dest = newInstance(type);
+                Object dest;
+                if (Throwable.class.isAssignableFrom(type)) {
+                    Object message = map.get("message");
+                    if (message instanceof String) {
+                        dest = newThrowableInstance(type, (String) message);
+                    } else {
+                        dest = newInstance(type);
+                    }
+                } else {
+                    dest = newInstance(type);
+                }
+
                 history.put(pojo, dest);
                 for (Map.Entry<Object, Object> entry : map.entrySet()) {
                     Object key = entry.getKey();
@@ -513,19 +524,6 @@ public class PojoUtils {
                         }
                     }
                 }
-                if (dest instanceof Throwable) {
-                    Object message = map.get("message");
-                    if (message instanceof String) {
-                        try {
-                            Field field = Throwable.class.getDeclaredField("detailMessage");
-                            if (!field.isAccessible()) {
-                                field.setAccessible(true);
-                            }
-                            field.set(dest, message);
-                        } catch (Exception e) {
-                        }
-                    }
-                }
                 return dest;
             }
         }
@@ -572,39 +570,42 @@ public class PojoUtils {
         return clazz;
     }
 
+    private static Object newThrowableInstance(Class<?> cls, String message) {
+        try {
+            Constructor<?> messagedConstructor = cls.getDeclaredConstructor(String.class);
+            return messagedConstructor.newInstance(message);
+        } catch (Throwable t) {
+            return newInstance(cls);
+        }
+    }
+
     private static Object newInstance(Class<?> cls) {
         try {
             return cls.newInstance();
         } catch (Throwable t) {
-            try {
-                Constructor<?>[] constructors = cls.getDeclaredConstructors();
-                /**
-                 * From Javadoc java.lang.Class#getDeclaredConstructors
-                 * This method returns an array of Constructor objects reflecting all the constructors
-                 * declared by the class represented by this Class object.
-                 * This method returns an array of length 0,
-                 * if this Class object represents an interface, a primitive type, an array class, or void.
-                 */
-                if (constructors.length == 0) {
-                    throw new RuntimeException("Illegal constructor: " + cls.getName());
-                }
-                Constructor<?> constructor = constructors[0];
-                if (constructor.getParameterTypes().length > 0) {
-                    for (Constructor<?> c : constructors) {
-                        if (c.getParameterTypes().length < constructor.getParameterTypes().length) {
-                            constructor = c;
-                            if (constructor.getParameterTypes().length == 0) {
-                                break;
-                            }
-                        }
-                    }
+            Constructor<?>[] constructors = cls.getDeclaredConstructors();
+            /*
+              From Javadoc java.lang.Class#getDeclaredConstructors
+              This method returns an array of Constructor objects reflecting all the constructors
+              declared by the class represented by this Class object.
+              This method returns an array of length 0,
+              if this Class object represents an interface, a primitive type, an array class, or void.
+             */
+            if (constructors.length == 0) {
+                throw new RuntimeException("Illegal constructor: " + cls.getName());
+            }
+            Throwable lastError = null;
+            Arrays.sort(constructors, Comparator.comparingInt(a -> a.getParameterTypes().length));
+            for (Constructor<?> constructor : constructors) {
+                try {
+                    constructor.setAccessible(true);
+                    Object[] parameters = Arrays.stream(constructor.getParameterTypes()).map(PojoUtils::getDefaultValue).toArray();
+                    return constructor.newInstance(parameters);
+                } catch (Throwable e) {
+                    lastError = e;
                 }
-                constructor.setAccessible(true);
-                Object[] parameters = Arrays.stream(constructor.getParameterTypes()).map(PojoUtils::getDefaultValue).toArray();
-                return constructor.newInstance(parameters);
-            } catch (InstantiationException | InvocationTargetException | IllegalAccessException e) {
-                throw new RuntimeException(e.getMessage(), e);
             }
+            throw new RuntimeException(lastError.getMessage(), lastError);
         }
     }
 
diff --git a/dubbo-common/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java b/dubbo-common/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java
index d5634ee..d3cac74 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/config/ConfigCenterConfig.java
@@ -70,7 +70,7 @@ public class ConfigCenterConfig extends AbstractConfig {
     private String password;
 
     /**
-     * The default value is 3000L;
+     * The default value is 30000L;
      */
     private Long timeout;
 
@@ -130,7 +130,7 @@ public class ConfigCenterConfig extends AbstractConfig {
             group = CommonConstants.DUBBO;
         }
         if (timeout == null) {
-            timeout = 3000L;
+            timeout = 30000L;
         }
 //        if (highestPriority == null) {
 //            highestPriority = true;
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/bytecode/ClassGeneratorTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/bytecode/ClassGeneratorTest.java
index dc1cbdf..605ce83 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/bytecode/ClassGeneratorTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/bytecode/ClassGeneratorTest.java
@@ -50,7 +50,7 @@ public class ClassGeneratorTest {
         cg.addMethod("public void setName(" + Bean.class.getName() + " o, Object name){ FNAME.set($1, $2); }");
 
         cg.addDefaultConstructor();
-        Class<?> cl = cg.toClass();
+        Class<?> cl = cg.toClass(Bean.class);
         cl.getField("FNAME").set(null, fname);
 
         System.out.println(cl.getName());
@@ -80,7 +80,7 @@ public class ClassGeneratorTest {
         cg.addMethod("public void setName(" + Bean.class.getName() + " o, Object name){ FNAME.set($1, $2); }");
 
         cg.addDefaultConstructor();
-        Class<?> cl = cg.toClass();
+        Class<?> cl = cg.toClass(Bean.class);
         cl.getField("FNAME").set(null, fname);
 
         System.out.println(cl.getName());
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/bytecode/MixinTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/bytecode/MixinTest.java
index fa96d2e..b6a825e 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/bytecode/MixinTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/bytecode/MixinTest.java
@@ -34,19 +34,19 @@ public class MixinTest {
         ((I3) o).m3();
     }
 
-    interface I1 {
+    public interface I1 {
         void m1();
     }
 
-    interface I2 {
+    public interface I2 {
         void m2();
     }
 
-    interface I3 {
+    public interface I3 {
         void m3();
     }
 
-    class C1 implements Mixin.MixinAware {
+    public class C1 implements Mixin.MixinAware {
         public void m1() {
             System.out.println("c1.m1();");
         }
@@ -60,7 +60,7 @@ public class MixinTest {
         }
     }
 
-    class C2 implements Mixin.MixinAware {
+    public class C2 implements Mixin.MixinAware {
         public void m3() {
             System.out.println("c2.m3();");
         }
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/bytecode/ProxyTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/bytecode/ProxyTest.java
index 423260a..f607f69 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/bytecode/ProxyTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/bytecode/ProxyTest.java
@@ -20,10 +20,13 @@ import net.sf.cglib.proxy.Enhancer;
 import net.sf.cglib.proxy.MethodInterceptor;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.DisabledForJreRange;
+import org.junit.jupiter.api.condition.JRE;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNull;
 
+@DisabledForJreRange(min = JRE.JAVA_16)
 public class ProxyTest {
 
     @Test
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/AdaptiveCompilerTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/AdaptiveCompilerTest.java
index 4192c36..7e2110c 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/AdaptiveCompilerTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/AdaptiveCompilerTest.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.common.compiler.support;
 
 import org.apache.dubbo.rpc.model.FrameworkModel;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
@@ -27,7 +28,7 @@ public class AdaptiveCompilerTest extends JavaCodeTest {
         AdaptiveCompiler.setDefaultCompiler("jdk");
         AdaptiveCompiler compiler = new AdaptiveCompiler();
         compiler.setFrameworkModel(FrameworkModel.defaultModel());
-        Class<?> clazz = compiler.compile(getSimpleCode(), AdaptiveCompiler.class.getClassLoader());
+        Class<?> clazz = compiler.compile(JavaCodeTest.class, getSimpleCode(), AdaptiveCompiler.class.getClassLoader());
         HelloService helloService = (HelloService) clazz.newInstance();
         Assertions.assertEquals("Hello world!", helloService.sayHello());
     }
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/JavaCodeTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/JavaCodeTest.java
index 3caa38e..a812a2b 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/JavaCodeTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/JavaCodeTest.java
@@ -22,6 +22,15 @@ public class JavaCodeTest {
 
     public final static AtomicInteger SUBFIX = new AtomicInteger(8);
 
+    boolean shouldIgnoreWithoutPackage() {
+        String jdkVersion = System.getProperty("java.specification.version");
+        try {
+            return Integer.parseInt(jdkVersion) > 15;
+        } catch (Throwable t) {
+            return false;
+        }
+    }
+
     String getSimpleCode() {
         StringBuilder code = new StringBuilder();
         code.append("package org.apache.dubbo.common.compiler.support;");
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/JavassistCompilerTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/JavassistCompilerTest.java
index adbfbb8..66b2e00 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/JavassistCompilerTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/JavassistCompilerTest.java
@@ -18,6 +18,8 @@ package org.apache.dubbo.common.compiler.support;
 
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.DisabledForJreRange;
+import org.junit.jupiter.api.condition.JRE;
 
 import java.lang.reflect.Method;
 
@@ -25,7 +27,7 @@ public class JavassistCompilerTest extends JavaCodeTest {
     @Test
     public void testCompileJavaClass() throws Exception {
         JavassistCompiler compiler = new JavassistCompiler();
-        Class<?> clazz = compiler.compile(getSimpleCode(), JavassistCompiler.class.getClassLoader());
+        Class<?> clazz = compiler.compile(JavaCodeTest.class, getSimpleCode(), JavassistCompiler.class.getClassLoader());
 
         // Because javassist compiles using the caller class loader, we should't use HelloService directly
         Object instance = clazz.newInstance();
@@ -37,19 +39,26 @@ public class JavassistCompilerTest extends JavaCodeTest {
      * javassist compile will find HelloService in classpath
      */
     @Test
+    @DisabledForJreRange(min = JRE.JAVA_16)
     public void testCompileJavaClass0() throws Exception {
+        boolean ignoreWithoutPackage = shouldIgnoreWithoutPackage();
         JavassistCompiler compiler = new JavassistCompiler();
-        Class<?> clazz = compiler.compile(getSimpleCodeWithoutPackage(), JavassistCompiler.class.getClassLoader());
-        Object instance = clazz.newInstance();
-        Method sayHello = instance.getClass().getMethod("sayHello");
-        Assertions.assertEquals("Hello world!", sayHello.invoke(instance));
+
+        if (ignoreWithoutPackage) {
+            Assertions.assertThrows(RuntimeException.class, () -> compiler.compile(null, getSimpleCodeWithoutPackage(), JavassistCompiler.class.getClassLoader()));
+        } else {
+            Class<?> clazz = compiler.compile(null, getSimpleCodeWithoutPackage(), JavassistCompiler.class.getClassLoader());
+            Object instance = clazz.newInstance();
+            Method sayHello = instance.getClass().getMethod("sayHello");
+            Assertions.assertEquals("Hello world!", sayHello.invoke(instance));
+        }
     }
 
     @Test
     public void testCompileJavaClass1() throws Exception {
         Assertions.assertThrows(IllegalStateException.class, () -> {
             JavassistCompiler compiler = new JavassistCompiler();
-            Class<?> clazz = compiler.compile(getSimpleCodeWithSyntax0(), JavassistCompiler.class.getClassLoader());
+            Class<?> clazz = compiler.compile(JavaCodeTest.class, getSimpleCodeWithSyntax0(), JavassistCompiler.class.getClassLoader());
             Object instance = clazz.newInstance();
             Method sayHello = instance.getClass().getMethod("sayHello");
             Assertions.assertEquals("Hello world!", sayHello.invoke(instance));
@@ -59,7 +68,7 @@ public class JavassistCompilerTest extends JavaCodeTest {
     @Test
     public void testCompileJavaClassWithImport() throws Exception {
         JavassistCompiler compiler = new JavassistCompiler();
-        Class<?> clazz = compiler.compile(getSimpleCodeWithImports(), JavassistCompiler.class.getClassLoader());
+        Class<?> clazz = compiler.compile(JavaCodeTest.class, getSimpleCodeWithImports(), JavassistCompiler.class.getClassLoader());
         Object instance = clazz.newInstance();
         Method sayHello = instance.getClass().getMethod("sayHello");
         Assertions.assertEquals("Hello world!", sayHello.invoke(instance));
@@ -68,7 +77,7 @@ public class JavassistCompilerTest extends JavaCodeTest {
     @Test
     public void testCompileJavaClassWithExtends() throws Exception {
         JavassistCompiler compiler = new JavassistCompiler();
-        Class<?> clazz = compiler.compile(getSimpleCodeWithWithExtends(), JavassistCompiler.class.getClassLoader());
+        Class<?> clazz = compiler.compile(JavaCodeTest.class, getSimpleCodeWithWithExtends(), JavassistCompiler.class.getClassLoader());
         Object instance = clazz.newInstance();
         Method sayHello = instance.getClass().getMethod("sayHello");
         Assertions.assertEquals("Hello world3!", sayHello.invoke(instance));
diff --git a/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/JdkCompilerTest.java b/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/JdkCompilerTest.java
index e0bc3a9..baa63b2 100644
--- a/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/JdkCompilerTest.java
+++ b/dubbo-common/src/test/java/org/apache/dubbo/common/compiler/support/JdkCompilerTest.java
@@ -26,7 +26,7 @@ public class JdkCompilerTest extends JavaCodeTest {
     @Test
     public void test_compileJavaClass() throws Exception {
         JdkCompiler compiler = new JdkCompiler();
-        Class<?> clazz = compiler.compile(getSimpleCode(), JdkCompiler.class.getClassLoader());
+        Class<?> clazz = compiler.compile(JavaCodeTest.class, getSimpleCode(), JdkCompiler.class.getClassLoader());
         Object instance = clazz.newInstance();
         Method sayHello = instance.getClass().getMethod("sayHello");
         Assertions.assertEquals("Hello world!", sayHello.invoke(instance));
@@ -36,7 +36,7 @@ public class JdkCompilerTest extends JavaCodeTest {
     public void test_compileJavaClass0() throws Exception {
         Assertions.assertThrows(IllegalStateException.class, () -> {
             JdkCompiler compiler = new JdkCompiler();
-            Class<?> clazz = compiler.compile(getSimpleCodeWithoutPackage(), JdkCompiler.class.getClassLoader());
+            Class<?> clazz = compiler.compile(JavaCodeTest.class, getSimpleCodeWithoutPackage(), JdkCompiler.class.getClassLoader());
             Object instance = clazz.newInstance();
             Method sayHello = instance.getClass().getMethod("sayHello");
             Assertions.assertEquals("Hello world!", sayHello.invoke(instance));
@@ -47,7 +47,7 @@ public class JdkCompilerTest extends JavaCodeTest {
     public void test_compileJavaClass1() throws Exception {
         Assertions.assertThrows(IllegalStateException.class, () -> {
             JdkCompiler compiler = new JdkCompiler();
-            Class<?> clazz = compiler.compile(getSimpleCodeWithSyntax(), JdkCompiler.class.getClassLoader());
+            Class<?> clazz = compiler.compile(JavaCodeTest.class, getSimpleCodeWithSyntax(), JdkCompiler.class.getClassLoader());
             Object instance = clazz.newInstance();
             Method sayHello = instance.getClass().getMethod("sayHello");
             Assertions.assertEquals("Hello world!", sayHello.invoke(instance));
@@ -57,7 +57,7 @@ public class JdkCompilerTest extends JavaCodeTest {
     @Test
     public void test_compileJavaClass_java8() throws Exception {
         JdkCompiler compiler = new JdkCompiler("1.8");
-        Class<?> clazz = compiler.compile(getSimpleCode(), JdkCompiler.class.getClassLoader());
+        Class<?> clazz = compiler.compile(JavaCodeTest.class, getSimpleCode(), JdkCompiler.class.getClassLoader());
         Object instance = clazz.newInstance();
         Method sayHello = instance.getClass().getMethod("sayHello");
         Assertions.assertEquals("Hello world!", sayHello.invoke(instance));
@@ -67,7 +67,7 @@ public class JdkCompilerTest extends JavaCodeTest {
     public void test_compileJavaClass0_java8() throws Exception {
         Assertions.assertThrows(IllegalStateException.class, () -> {
             JdkCompiler compiler = new JdkCompiler("1.8");
-            Class<?> clazz = compiler.compile(getSimpleCodeWithoutPackage(), JdkCompiler.class.getClassLoader());
+            Class<?> clazz = compiler.compile(JavaCodeTest.class, getSimpleCodeWithoutPackage(), JdkCompiler.class.getClassLoader());
             Object instance = clazz.newInstance();
             Method sayHello = instance.getClass().getMethod("sayHello");
             Assertions.assertEquals("Hello world!", sayHello.invoke(instance));
@@ -78,7 +78,7 @@ public class JdkCompilerTest extends JavaCodeTest {
     public void test_compileJavaClass1_java8() throws Exception {
         Assertions.assertThrows(IllegalStateException.class, () -> {
             JdkCompiler compiler = new JdkCompiler("1.8");
-            Class<?> clazz = compiler.compile(getSimpleCodeWithSyntax(), JdkCompiler.class.getClassLoader());
+            Class<?> clazz = compiler.compile(JavaCodeTest.class, getSimpleCodeWithSyntax(), JdkCompiler.class.getClassLoader());
             Object instance = clazz.newInstance();
             Method sayHello = instance.getClass().getMethod("sayHello");
             Assertions.assertEquals("Hello world!", sayHello.invoke(instance));
diff --git a/dubbo-config/dubbo-config-api/pom.xml b/dubbo-config/dubbo-config-api/pom.xml
index b77dd5d..45de7cb 100644
--- a/dubbo-config/dubbo-config-api/pom.xml
+++ b/dubbo-config/dubbo-config-api/pom.xml
@@ -111,6 +111,22 @@
         </dependency>
 
         <dependency>
+            <groupId>org.apache.curator</groupId>
+            <artifactId>curator-framework</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.curator</groupId>
+            <artifactId>curator-recipes</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.zookeeper</groupId>
+            <artifactId>zookeeper</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
             <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo-registry-nacos</artifactId>
             <version>${project.parent.version}</version>
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java
index 483be84..f9e8766 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/AbstractConfigTest.java
@@ -23,6 +23,7 @@ import org.apache.dubbo.config.support.Nested;
 import org.apache.dubbo.config.support.Parameter;
 import org.apache.dubbo.config.utils.ConfigValidationUtils;
 import org.apache.dubbo.rpc.model.ApplicationModel;
+
 import org.hamcrest.Matchers;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ConfigCenterConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ConfigCenterConfigTest.java
index f36ecb3..b83d68f 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ConfigCenterConfigTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ConfigCenterConfigTest.java
@@ -22,6 +22,7 @@ import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.test.check.registrycenter.config.ZookeeperRegistryCenterConfig;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
@@ -67,7 +68,7 @@ public class ConfigCenterConfigTest {
 
         Assertions.assertEquals(ZookeeperRegistryCenterConfig.getConnectionAddress()+"/ConfigCenterConfig?check=true&" +
                         "config-file=dubbo.properties&group=group&" +
-                        "namespace=namespace&timeout=3000",
+                        "namespace=namespace&timeout=30000",
                 config.toUrl().toFullString()
         );
     }
diff --git a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
index c279eee..29e1352 100644
--- a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
+++ b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/ReferenceConfigTest.java
@@ -58,6 +58,8 @@ import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.DisabledForJreRange;
+import org.junit.jupiter.api.condition.JRE;
 import org.mockito.Mockito;
 
 import java.io.File;
@@ -1017,6 +1019,7 @@ public class ReferenceConfigTest {
     }
 
     @Test
+    @DisabledForJreRange(min = JRE.JAVA_16)
     public void testDifferentClassLoaderRequest() throws Exception {
         String basePath = DemoService.class.getProtectionDomain().getCodeSource().getLocation().getFile();
         basePath = java.net.URLDecoder.decode(basePath, "UTF-8");
@@ -1083,6 +1086,7 @@ public class ReferenceConfigTest {
         builder.setClassName(MultiClassLoaderServiceRequest.class.getName() + "A");
         builder.setSuperClassName(MultiClassLoaderServiceRequest.class.getName());
         CtClass cls = builder.build(classLoader);
+        // FIXME support JDK 17
         return cls.toClass(classLoader, JavassistCompiler.class.getProtectionDomain());
     }
 
diff --git a/dubbo-config/dubbo-config-spring/pom.xml b/dubbo-config/dubbo-config-spring/pom.xml
index 1baf323..4c7656a 100644
--- a/dubbo-config/dubbo-config-spring/pom.xml
+++ b/dubbo-config/dubbo-config-spring/pom.xml
@@ -30,8 +30,6 @@
         <spring-boot.version>2.3.1.RELEASE</spring-boot.version>
         <!-- Uncomment spring_version property to check Spring 4.x compatibility -->
         <!-- <spring_version>4.3.30.RELEASE</spring_version> -->
-        <curator5_version>5.1.0</curator5_version>
-        <zookeeper_version>3.6.0</zookeeper_version>
     </properties>
 
     <dependencies>
@@ -200,19 +198,16 @@
         <dependency>
             <groupId>org.apache.curator</groupId>
             <artifactId>curator-recipes</artifactId>
-            <version>${curator5_version}</version>
             <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.curator</groupId>
             <artifactId>curator-x-discovery</artifactId>
-            <version>${curator5_version}</version>
             <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.zookeeper</groupId>
             <artifactId>zookeeper</artifactId>
-            <version>${zookeeper_version}</version>
             <scope>test</scope>
         </dependency>
 
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessorTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessorTest.java
index 8a040af..cde4e2a 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessorTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/beans/factory/annotation/ReferenceAnnotationBeanPostProcessorTest.java
@@ -23,12 +23,13 @@ import org.apache.dubbo.config.annotation.Method;
 import org.apache.dubbo.config.annotation.Reference;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.spring.ReferenceBean;
-import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
-import org.apache.dubbo.config.spring.reference.ReferenceBeanManager;
 import org.apache.dubbo.config.spring.api.DemoService;
 import org.apache.dubbo.config.spring.api.HelloService;
+import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
+import org.apache.dubbo.config.spring.reference.ReferenceBeanManager;
 import org.apache.dubbo.config.spring.util.DubboBeanUtils;
 import org.apache.dubbo.rpc.RpcContext;
+
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.annotation.Around;
 import org.aspectj.lang.annotation.Aspect;
@@ -50,6 +51,7 @@ import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.TestPropertySource;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
+import java.net.InetSocketAddress;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
@@ -147,8 +149,8 @@ public class ReferenceAnnotationBeanPostProcessorTest {
         Assertions.assertNotNull(context.getBean("demoService"));
         Assertions.assertNotNull(context.getBean("demoServiceFromParent"));
 
-        String callSuffix = AOP_SUFFIX + " from "+ NetUtils.getLocalHost() +":12345";
-        String localCallSuffix = AOP_SUFFIX + " from 127.0.0.1:0";
+        String callSuffix = AOP_SUFFIX + " from "+ InetSocketAddress.createUnresolved(NetUtils.getLocalHost(), 12345);
+        String localCallSuffix = AOP_SUFFIX + " from " + InetSocketAddress.createUnresolved("127.0.0.1", 0);
         String directInvokeSuffix = AOP_SUFFIX + " from null";
 
         String defaultHelloServiceResult = "Greeting, Mercy";
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer/PropertyConfigurerTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer/PropertyConfigurerTest.java
index 4191be8..a104355 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer/PropertyConfigurerTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer/PropertyConfigurerTest.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.config.spring.propertyconfigurer.consumer;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.spring.api.HelloService;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
@@ -30,6 +31,8 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.ImportResource;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 
+import java.net.InetSocketAddress;
+
 public class PropertyConfigurerTest {
 
     @BeforeAll
@@ -56,7 +59,7 @@ public class PropertyConfigurerTest {
             HelloService service = (HelloService) context.getBean("demoService");
             String result = service.sayHello("world");
             System.out.println("result: " + result);
-            Assertions.assertEquals("Hello world, response from provider: 127.0.0.1:0", result);
+            Assertions.assertEquals("Hello world, response from provider: " + InetSocketAddress.createUnresolved("127.0.0.1", 0), result);
 
             context.close();
 
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer2/PropertySourcesConfigurerTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer2/PropertySourcesConfigurerTest.java
index a75d319..89e56a7 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer2/PropertySourcesConfigurerTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer2/PropertySourcesConfigurerTest.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.spring.api.HelloService;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.apache.dubbo.config.spring.propertyconfigurer.consumer.DemoBeanFactoryPostProcessor;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
@@ -31,6 +32,8 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.ImportResource;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 
+import java.net.InetSocketAddress;
+
 public class PropertySourcesConfigurerTest {
 
     @BeforeAll
@@ -58,7 +61,7 @@ public class PropertySourcesConfigurerTest {
                 HelloService service = (HelloService) context.getBean("demoService");
                 String result = service.sayHello("world");
                 System.out.println("result: " + result);
-                Assertions.assertEquals("Hello world, response from provider: 127.0.0.1:0", result);
+                Assertions.assertEquals("Hello world, response from provider: " + InetSocketAddress.createUnresolved("127.0.0.1", 0), result);
             } finally {
                 context.close();
             }
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer3/PropertySourcesInJavaConfigTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer3/PropertySourcesInJavaConfigTest.java
index f209fdd..776d731 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer3/PropertySourcesInJavaConfigTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/propertyconfigurer/consumer3/PropertySourcesInJavaConfigTest.java
@@ -20,6 +20,7 @@ import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.spring.api.HelloService;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.apache.dubbo.config.spring.propertyconfigurer.consumer.DemoBeanFactoryPostProcessor;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
@@ -35,6 +36,7 @@ import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
 import org.springframework.core.io.ClassPathResource;
 
 import java.io.IOException;
+import java.net.InetSocketAddress;
 
 public class PropertySourcesInJavaConfigTest {
 
@@ -75,7 +77,7 @@ public class PropertySourcesInJavaConfigTest {
                 HelloService service = (HelloService) context.getBean("demoService");
                 String result = service.sayHello("world");
                 System.out.println("result: " + result);
-                Assertions.assertEquals("Hello world, response from provider: 127.0.0.1:0", result);
+                Assertions.assertEquals("Hello world, response from provider: " + InetSocketAddress.createUnresolved("127.0.0.1", 0), result);
             } finally {
                 context.close();
             }
@@ -103,7 +105,7 @@ public class PropertySourcesInJavaConfigTest {
                 HelloService service = (HelloService) context.getBean("demoService");
                 String result = service.sayHello("world");
                 System.out.println("result: " + result);
-                Assertions.assertEquals("Hello world, response from provider: 127.0.0.1:0", result);
+                Assertions.assertEquals("Hello world, response from provider: " + InetSocketAddress.createUnresolved("127.0.0.1", 0), result);
             } finally {
                 context.close();
             }
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/javaconfig/JavaConfigReferenceBeanTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/javaconfig/JavaConfigReferenceBeanTest.java
index 494fdc3..474fad6 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/javaconfig/JavaConfigReferenceBeanTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/javaconfig/JavaConfigReferenceBeanTest.java
@@ -16,7 +16,6 @@
  */
 package org.apache.dubbo.config.spring.reference.javaconfig;
 
-import com.sun.management.HotSpotDiagnosticMXBean;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.apache.dubbo.config.annotation.Reference;
@@ -29,10 +28,9 @@ import org.apache.dubbo.config.spring.impl.HelloServiceImpl;
 import org.apache.dubbo.config.spring.reference.ReferenceBeanBuilder;
 import org.apache.dubbo.rpc.service.GenericException;
 import org.apache.dubbo.rpc.service.GenericService;
-import org.junit.jupiter.api.AfterAll;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
@@ -41,37 +39,14 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.PropertySource;
 
-import javax.management.MBeanServer;
 import java.io.PrintWriter;
 import java.io.StringWriter;
-import java.lang.management.ManagementFactory;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
 public class JavaConfigReferenceBeanTest {
 
-    public static void dumpHeap(String dirpath, boolean live) throws Exception {
-
-        java.lang.management.RuntimeMXBean runtime =
-            java.lang.management.ManagementFactory.getRuntimeMXBean();
-        java.lang.reflect.Field jvm = runtime.getClass().getDeclaredField("jvm");
-        jvm.setAccessible(true);
-        sun.management.VMManagement mgmt =
-            (sun.management.VMManagement) jvm.get(runtime);
-        java.lang.reflect.Method pid_method =
-            mgmt.getClass().getDeclaredMethod("getProcessId");
-        pid_method.setAccessible(true);
-        int pid = (Integer) pid_method.invoke(mgmt);
-
-        MBeanServer server = ManagementFactory.getPlatformMBeanServer();
-        HotSpotDiagnosticMXBean mxBean = ManagementFactory.newPlatformMXBeanProxy(
-            server, "com.sun.management:type=HotSpotDiagnostic", HotSpotDiagnosticMXBean.class);
-        String filepath = dirpath + pid + ".hprof";
-        mxBean.dumpHeap(filepath, live);
-        System.out.println("Dump heap to file: " + filepath);
-    }
-
     @BeforeEach
     public void setUp() {
         DubboBootstrap.reset();
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcall/LocalCallTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcall/LocalCallTest.java
index 8283a97..eb5a8e5 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcall/LocalCallTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcall/LocalCallTest.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.config.spring.reference.localcall;
 
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.spring.api.HelloService;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
@@ -28,6 +29,8 @@ import org.springframework.test.annotation.DirtiesContext;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
+import java.net.InetSocketAddress;
+
 import static org.springframework.test.annotation.DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD;
 
 @ExtendWith(SpringExtension.class)
@@ -58,7 +61,7 @@ public class LocalCallTest {
         // see also: org.apache.dubbo.rpc.protocol.injvm.InjvmInvoker.doInvoke
         // InjvmInvoker set remote address to 127.0.0.1:0
         String result = helloService.sayHello("world");
-        Assertions.assertEquals("Hello world, response from provider: 127.0.0.1:0", result);
+        Assertions.assertEquals("Hello world, response from provider: " + InetSocketAddress.createUnresolved("127.0.0.1", 0), result);
 
         // direct call local service, the remote address is null
         String originResult = localHelloService.sayHello("world");
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcall/LocalCallTest2.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcall/LocalCallTest2.java
index a443519..4b76ad6 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcall/LocalCallTest2.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcall/LocalCallTest2.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.config.spring.reference.localcall;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.spring.api.HelloService;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
@@ -30,6 +31,8 @@ import org.springframework.test.annotation.DirtiesContext;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
+import java.net.InetSocketAddress;
+
 import static org.springframework.test.annotation.DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD;
 
 @ExtendWith(SpringExtension.class)
@@ -58,7 +61,7 @@ public class LocalCallTest2 {
         // see also: org.apache.dubbo.rpc.protocol.injvm.InjvmInvoker.doInvoke
         // InjvmInvoker set remote address to 127.0.0.1:0
         String result = helloService.sayHello("world");
-        Assertions.assertEquals("Hello world, response from provider: 127.0.0.1:0", result);
+        Assertions.assertEquals("Hello world, response from provider: " + InetSocketAddress.createUnresolved("127.0.0.1", 0), result);
     }
 
 }
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcalla/LocalCallReferenceAnnotationTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcalla/LocalCallReferenceAnnotationTest.java
index cf3e41a..a4e9466 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcalla/LocalCallReferenceAnnotationTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcalla/LocalCallReferenceAnnotationTest.java
@@ -22,6 +22,7 @@ import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.spring.api.HelloService;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.apache.dubbo.rpc.RpcContext;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
@@ -35,6 +36,8 @@ import org.springframework.test.annotation.DirtiesContext;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
+import java.net.InetSocketAddress;
+
 import static org.springframework.test.annotation.DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD;
 
 @EnableDubbo
@@ -65,7 +68,7 @@ public class LocalCallReferenceAnnotationTest {
         // see also: org.apache.dubbo.rpc.protocol.injvm.InjvmInvoker.doInvoke
         // InjvmInvoker set remote address to 127.0.0.1:0
         String result = helloService.sayHello("world");
-        Assertions.assertEquals("Hello world, response from provider: 127.0.0.1:0", result);
+        Assertions.assertEquals("Hello world, response from provider: " + InetSocketAddress.createUnresolved("127.0.0.1", 0), result);
     }
 
     @Configuration
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcallam/LocalCallMultipleReferenceAnnotationsTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcallam/LocalCallMultipleReferenceAnnotationsTest.java
index 763251a..718b751 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcallam/LocalCallMultipleReferenceAnnotationsTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcallam/LocalCallMultipleReferenceAnnotationsTest.java
@@ -23,6 +23,7 @@ import org.apache.dubbo.config.spring.ReferenceBean;
 import org.apache.dubbo.config.spring.api.HelloService;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.apache.dubbo.rpc.RpcContext;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
@@ -35,6 +36,7 @@ import org.springframework.test.annotation.DirtiesContext;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
+import java.net.InetSocketAddress;
 import java.util.Map;
 
 import static org.springframework.test.annotation.DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD;
@@ -65,10 +67,10 @@ public class LocalCallMultipleReferenceAnnotationsTest {
         // see also: org.apache.dubbo.rpc.protocol.injvm.InjvmInvoker.doInvoke
         // InjvmInvoker set remote address to 127.0.0.1:0
         String result = helloService.sayHello("world");
-        Assertions.assertEquals("Hello world, response from provider: 127.0.0.1:0", result);
+        Assertions.assertEquals("Hello world, response from provider: " + InetSocketAddress.createUnresolved("127.0.0.1", 0), result);
 
         String demoResult = demoHelloService.sayHello("world");
-        Assertions.assertEquals("Hello world, response from provider: 127.0.0.1:0", demoResult);
+        Assertions.assertEquals("Hello world, response from provider: " + InetSocketAddress.createUnresolved("127.0.0.1", 0), demoResult);
 
         Map<String, ReferenceBean> referenceBeanMap = applicationContext.getBeansOfType(ReferenceBean.class);
         Assertions.assertEquals(2, referenceBeanMap.size());
diff --git a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcallmix/LocalCallReferenceMixTest.java b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcallmix/LocalCallReferenceMixTest.java
index 155eb58..be3b274 100644
--- a/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcallmix/LocalCallReferenceMixTest.java
+++ b/dubbo-config/dubbo-config-spring/src/test/java/org/apache/dubbo/config/spring/reference/localcallmix/LocalCallReferenceMixTest.java
@@ -22,6 +22,7 @@ import org.apache.dubbo.config.bootstrap.DubboBootstrap;
 import org.apache.dubbo.config.spring.api.HelloService;
 import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
 import org.apache.dubbo.rpc.RpcContext;
+
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
@@ -36,6 +37,8 @@ import org.springframework.test.annotation.DirtiesContext;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
+import java.net.InetSocketAddress;
+
 import static org.springframework.test.annotation.DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD;
 
 @EnableDubbo
@@ -67,7 +70,7 @@ public class LocalCallReferenceMixTest {
         // see also: org.apache.dubbo.rpc.protocol.injvm.InjvmInvoker.doInvoke
         // InjvmInvoker set remote address to 127.0.0.1:0
         String result = helloService.sayHello("world");
-        Assertions.assertEquals("Hello world, response from provider: 127.0.0.1:0", result);
+        Assertions.assertEquals("Hello world, response from provider: " + InetSocketAddress.createUnresolved("127.0.0.1", 0), result);
     }
 
     @Configuration
diff --git a/dubbo-configcenter/dubbo-configcenter-zookeeper/pom.xml b/dubbo-configcenter/dubbo-configcenter-zookeeper/pom.xml
index 8e51bba..d826309 100644
--- a/dubbo-configcenter/dubbo-configcenter-zookeeper/pom.xml
+++ b/dubbo-configcenter/dubbo-configcenter-zookeeper/pom.xml
@@ -43,5 +43,26 @@
             <artifactId>dubbo-remoting-zookeeper-curator5</artifactId>
             <version>${project.parent.version}</version>
         </dependency>
+
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-test-common</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.curator</groupId>
+            <artifactId>curator-framework</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.curator</groupId>
+            <artifactId>curator-recipes</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.zookeeper</groupId>
+            <artifactId>zookeeper</artifactId>
+        </dependency>
     </dependencies>
 </project>
diff --git a/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java b/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java
index f2370e1..cb867d7 100644
--- a/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java
+++ b/dubbo-configcenter/dubbo-configcenter-zookeeper/src/main/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfiguration.java
@@ -54,10 +54,10 @@ public class ZookeeperDynamicConfiguration extends TreePathDynamicConfiguration
 
         final String threadName = this.getClass().getSimpleName();
         this.executor = new ThreadPoolExecutor(DEFAULT_ZK_EXECUTOR_THREADS_NUM, DEFAULT_ZK_EXECUTOR_THREADS_NUM,
-                THREAD_KEEP_ALIVE_TIME, TimeUnit.MILLISECONDS,
-                new LinkedBlockingQueue<>(DEFAULT_QUEUE),
-                new NamedThreadFactory(threadName, true),
-                new AbortPolicyWithReport(threadName, url));
+            THREAD_KEEP_ALIVE_TIME, TimeUnit.MILLISECONDS,
+            new LinkedBlockingQueue<>(DEFAULT_QUEUE),
+            new NamedThreadFactory(threadName, true),
+            new AbortPolicyWithReport(threadName, url));
 
         zkClient = zookeeperTransporter.connect(url);
         boolean isConnected = zkClient.isConnected();
diff --git a/dubbo-configcenter/dubbo-configcenter-zookeeper/src/test/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfigurationTest.java b/dubbo-configcenter/dubbo-configcenter-zookeeper/src/test/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfigurationTest.java
index 2275e46..23c5ca4 100644
--- a/dubbo-configcenter/dubbo-configcenter-zookeeper/src/test/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfigurationTest.java
+++ b/dubbo-configcenter/dubbo-configcenter-zookeeper/src/test/java/org/apache/dubbo/configcenter/support/zookeeper/ZookeeperDynamicConfigurationTest.java
@@ -62,7 +62,7 @@ public class ZookeeperDynamicConfigurationTest {
         zookeeperServerPort1 = Integer.parseInt(zookeeperConnectionAddress1.substring(zookeeperConnectionAddress1.lastIndexOf(":") + 1));
 
         client = CuratorFrameworkFactory.newClient("127.0.0.1:" + zookeeperServerPort1, 60 * 1000, 60 * 1000,
-                new ExponentialBackoffRetry(1000, 3));
+            new ExponentialBackoffRetry(1000, 3));
         client.start();
 
         try {
diff --git a/dubbo-dependencies-bom/pom.xml b/dubbo-dependencies-bom/pom.xml
index a8c4d52..f5ed76d 100644
--- a/dubbo-dependencies-bom/pom.xml
+++ b/dubbo-dependencies-bom/pom.xml
@@ -91,7 +91,7 @@
         <!-- Common libs -->
         <!-- <spring_version>4.3.30.RELEASE</spring_version> -->
         <spring_version>5.2.8.RELEASE</spring_version>
-        <javassist_version>3.23.1-GA</javassist_version>
+        <javassist_version>3.28.0-GA</javassist_version>
         <netty_version>3.2.5.Final</netty_version>
         <netty4_version>4.1.56.Final</netty4_version>
         <mina_version>1.1.7</mina_version>
@@ -99,8 +99,8 @@
         <httpclient_version>4.5.13</httpclient_version>
         <httpcore_version>4.4.6</httpcore_version>
         <fastjson_version>1.2.70</fastjson_version>
-        <zookeeper_version>3.4.13</zookeeper_version>
-        <curator_version>4.2.0</curator_version>
+        <zookeeper_version>3.7.0</zookeeper_version>
+        <curator_version>5.1.0</curator_version>
         <curator_test_version>2.12.0</curator_test_version>
         <jedis_version>3.6.0</jedis_version>
         <consul_version>1.4.2</consul_version>
diff --git a/dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml b/dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml
index afa6b81..eea6d0e 100644
--- a/dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml
+++ b/dubbo-dependencies/dubbo-dependencies-zookeeper/pom.xml
@@ -34,6 +34,7 @@
     <properties>
         <revision>3.0.6-SNAPSHOT</revision>
         <maven_flatten_version>1.1.0</maven_flatten_version>
+        <zookeeper_version>3.7.0</zookeeper_version>
     </properties>
 
     <dependencyManagement>
@@ -45,6 +46,13 @@
                 <type>pom</type>
                 <scope>import</scope>
             </dependency>
+            <dependency>
+                <groupId>org.apache.zookeeper</groupId>
+                <artifactId>parent</artifactId>
+                <version>${zookeeper_version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 
@@ -56,6 +64,57 @@
         <dependency>
             <groupId>org.apache.zookeeper</groupId>
             <artifactId>zookeeper</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>io.netty</groupId>
+                    <artifactId>netty-handler</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>io.netty</groupId>
+                    <artifactId>netty-transport-native-epoll</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.spotbugs</groupId>
+            <artifactId>spotbugs-annotations</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-cli</groupId>
+            <artifactId>commons-cli</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-server</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-servlet</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-client</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>jline</groupId>
+            <artifactId>jline</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>io.dropwizard.metrics</groupId>
+            <artifactId>metrics-core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.xerial.snappy</groupId>
+            <artifactId>snappy-java</artifactId>
         </dependency>
     </dependencies>
 
diff --git a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/ServiceDefinitionBuilderTest.java b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/ServiceDefinitionBuilderTest.java
index 91d65bf..afdead8 100644
--- a/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/ServiceDefinitionBuilderTest.java
+++ b/dubbo-metadata/dubbo-metadata-api/src/test/java/org/apache/dubbo/metadata/definition/ServiceDefinitionBuilderTest.java
@@ -21,6 +21,7 @@ import org.apache.dubbo.metadata.definition.model.MethodDefinition;
 import org.apache.dubbo.metadata.definition.model.TypeDefinition;
 import org.apache.dubbo.metadata.definition.service.ComplexObject;
 import org.apache.dubbo.metadata.definition.service.DemoService;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
@@ -40,8 +41,9 @@ public class ServiceDefinitionBuilderTest {
 
 
     void checkComplexObjectAsParam(FullServiceDefinition fullServiceDefinition) {
-        Assertions.assertEquals(fullServiceDefinition.getAnnotations(),
-            Arrays.asList("@org.apache.dubbo.metadata.definition.service.annotation.MockTypeAnnotation(value=666)"));
+        Assertions.assertTrue(fullServiceDefinition.getAnnotations().contains("@org.apache.dubbo.metadata.definition.service.annotation.MockTypeAnnotation(value=666)")
+            // JDK 17 style
+            || fullServiceDefinition.getAnnotations().contains("@org.apache.dubbo.metadata.definition.service.annotation.MockTypeAnnotation(666)"));
 
         List<MethodDefinition> methodDefinitions = fullServiceDefinition.getMethods();
         MethodDefinition complexCompute = null;
@@ -63,9 +65,13 @@ public class ServiceDefinitionBuilderTest {
             String[].class.getCanonicalName(), "java.util.List<java.lang.Integer>", ComplexObject.TestEnum.class.getCanonicalName()}));
         Assertions.assertEquals(findComplexObject.getReturnType(), ComplexObject.class.getCanonicalName());
 
-        Assertions.assertEquals(testAnnotation.getAnnotations(), Arrays.asList(
+        Assertions.assertTrue(testAnnotation.getAnnotations().equals(Arrays.asList(
             "@org.apache.dubbo.metadata.definition.service.annotation.MockMethodAnnotation(value=777)",
-            "@org.apache.dubbo.metadata.definition.service.annotation.MockMethodAnnotation2(value=888)"));
+            "@org.apache.dubbo.metadata.definition.service.annotation.MockMethodAnnotation2(value=888)"))
+            // JDK 17 style
+            || testAnnotation.getAnnotations().equals(Arrays.asList(
+            "@org.apache.dubbo.metadata.definition.service.annotation.MockMethodAnnotation(777)",
+            "@org.apache.dubbo.metadata.definition.service.annotation.MockMethodAnnotation2(888)")));
         Assertions.assertEquals(testAnnotation.getReturnType(), "void");
 
 
diff --git a/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/util/TypeUtils.java b/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/util/TypeUtils.java
index 25d0bf1..2f877e6 100644
--- a/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/util/TypeUtils.java
+++ b/dubbo-metadata/dubbo-metadata-processor/src/main/java/org/apache/dubbo/metadata/annotation/processing/util/TypeUtils.java
@@ -382,7 +382,12 @@ public interface TypeUtils {
         if (element != null) {
             List<? extends TypeParameterElement> typeParameterElements = element.getTypeParameters();
             if (!typeParameterElements.isEmpty()) {
-                List<TypeMirror> typeMirrors = invokeMethod(type, "getTypeArguments");
+                List<? extends TypeMirror> typeMirrors;
+                if (type instanceof DeclaredType) {
+                    typeMirrors = ((DeclaredType) type).getTypeArguments();
+                } else {
+                    typeMirrors = invokeMethod(type, "getTypeArguments");
+                }
                 StringBuilder typeBuilder = new StringBuilder(element.toString());
                 typeBuilder.append('<');
                 for (int i = 0; i < typeMirrors.size(); i++) {
diff --git a/dubbo-metadata/dubbo-metadata-processor/src/test/java/org/apache/dubbo/metadata/annotation/processing/util/MethodUtilsTest.java b/dubbo-metadata/dubbo-metadata-processor/src/test/java/org/apache/dubbo/metadata/annotation/processing/util/MethodUtilsTest.java
index 2e9c07c..db36f40 100644
--- a/dubbo-metadata/dubbo-metadata-processor/src/test/java/org/apache/dubbo/metadata/annotation/processing/util/MethodUtilsTest.java
+++ b/dubbo-metadata/dubbo-metadata-processor/src/test/java/org/apache/dubbo/metadata/annotation/processing/util/MethodUtilsTest.java
@@ -67,7 +67,8 @@ public class MethodUtilsTest extends AbstractAnnotationProcessingTest {
         assertEquals(12, methods.size());
 
         methods = getAllDeclaredMethods(type);
-        assertEquals(34, methods.size());
+        // registerNatives() no provided in JDK 17
+        assertTrue(methods.size() >= 33);
 
         assertTrue(getAllDeclaredMethods((TypeElement) null).isEmpty());
         assertTrue(getAllDeclaredMethods((TypeMirror) null).isEmpty());
diff --git a/dubbo-metadata/dubbo-metadata-report-zookeeper/pom.xml b/dubbo-metadata/dubbo-metadata-report-zookeeper/pom.xml
index ab146ae..6db2a83 100644
--- a/dubbo-metadata/dubbo-metadata-report-zookeeper/pom.xml
+++ b/dubbo-metadata/dubbo-metadata-report-zookeeper/pom.xml
@@ -37,5 +37,26 @@
             <artifactId>dubbo-configcenter-zookeeper</artifactId>
             <version>${project.parent.version}</version>
         </dependency>
+
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-test-common</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.curator</groupId>
+            <artifactId>curator-framework</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.curator</groupId>
+            <artifactId>curator-recipes</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.zookeeper</groupId>
+            <artifactId>zookeeper</artifactId>
+        </dependency>
     </dependencies>
 </project>
diff --git a/dubbo-metadata/dubbo-metadata-report-zookeeper/src/test/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReportTest.java b/dubbo-metadata/dubbo-metadata-report-zookeeper/src/test/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReportTest.java
index 86732aa..c004cc5 100644
--- a/dubbo-metadata/dubbo-metadata-report-zookeeper/src/test/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReportTest.java
+++ b/dubbo-metadata/dubbo-metadata-report-zookeeper/src/test/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReportTest.java
@@ -137,7 +137,7 @@ public class ZookeeperMetadataReportTest {
         String protocol = "xxx";
         URL url = generateURL(interfaceName, version, group, application);
         ServiceMetadataIdentifier serviceMetadataIdentifier = new ServiceMetadataIdentifier(interfaceName, version,
-                group, "provider", revision, protocol);
+            group, "provider", revision, protocol);
         zookeeperMetadataReport.doSaveMetadata(serviceMetadataIdentifier, url);
 
         String fileContent = zookeeperMetadataReport.zkClient.getContent(zookeeperMetadataReport.getNodePath(serviceMetadataIdentifier));
@@ -156,7 +156,7 @@ public class ZookeeperMetadataReportTest {
         String protocol = "xxx";
         URL url = generateURL(interfaceName, version, group, application);
         ServiceMetadataIdentifier serviceMetadataIdentifier = new ServiceMetadataIdentifier(interfaceName, version,
-                group, "provider", revision, protocol);
+            group, "provider", revision, protocol);
         zookeeperMetadataReport.doSaveMetadata(serviceMetadataIdentifier, url);
         String fileContent = zookeeperMetadataReport.zkClient.getContent(zookeeperMetadataReport.getNodePath(serviceMetadataIdentifier));
 
@@ -179,7 +179,7 @@ public class ZookeeperMetadataReportTest {
         String protocol = "xxx";
         URL url = generateURL(interfaceName, version, group, application);
         ServiceMetadataIdentifier serviceMetadataIdentifier = new ServiceMetadataIdentifier(interfaceName, version,
-                group, "provider", revision, protocol);
+            group, "provider", revision, protocol);
         zookeeperMetadataReport.doSaveMetadata(serviceMetadataIdentifier, url);
 
         List<String> r = zookeeperMetadataReport.doGetExportedURLs(serviceMetadataIdentifier);
@@ -236,7 +236,7 @@ public class ZookeeperMetadataReportTest {
 
     private MetadataIdentifier storePrivider(MetadataReport zookeeperMetadataReport, String interfaceName, String version, String group, String application) throws ClassNotFoundException, InterruptedException {
         URL url = URL.valueOf("xxx://" + NetUtils.getLocalAddress().getHostName() + ":4444/" + interfaceName + "?paramTest=zkTest&version=" + version + "&application="
-                + application + (group == null ? "" : "&group=" + group));
+            + application + (group == null ? "" : "&group=" + group));
 
         MetadataIdentifier providerMetadataIdentifier = new MetadataIdentifier(interfaceName, version, group, PROVIDER_SIDE, application);
         Class interfaceClass = Class.forName(interfaceName);
@@ -249,7 +249,7 @@ public class ZookeeperMetadataReportTest {
 
     private MetadataIdentifier storeConsumer(MetadataReport zookeeperMetadataReport, String interfaceName, String version, String group, String application) throws ClassNotFoundException, InterruptedException {
         URL url = URL.valueOf("xxx://" + NetUtils.getLocalAddress().getHostName() + ":4444/" + interfaceName + "?version=" + version + "&application="
-                + application + (group == null ? "" : "&group=" + group));
+            + application + (group == null ? "" : "&group=" + group));
 
         MetadataIdentifier consumerMetadataIdentifier = new MetadataIdentifier(interfaceName, version, group, CONSUMER_SIDE, application);
         Class interfaceClass = Class.forName(interfaceName);
@@ -272,8 +272,8 @@ public class ZookeeperMetadataReportTest {
 
     private URL generateURL(String interfaceName, String version, String group, String application) {
         URL url = URL.valueOf("xxx://" + NetUtils.getLocalAddress().getHostName() + ":8989/" + interfaceName +
-                "?paramTest=etcdTest&version=" + version + "&application="
-                + application + (group == null ? "" : "&group=" + group));
+            "?paramTest=etcdTest&version=" + version + "&application="
+            + application + (group == null ? "" : "&group=" + group));
         return url;
     }
 
diff --git a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/CacheableFailbackRegistry.java b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/CacheableFailbackRegistry.java
index d4d94b8..936e804 100644
--- a/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/CacheableFailbackRegistry.java
+++ b/dubbo-registry/dubbo-registry-api/src/main/java/org/apache/dubbo/registry/support/CacheableFailbackRegistry.java
@@ -134,7 +134,7 @@ public abstract class CacheableFailbackRegistry extends FailbackRegistry {
         Map<String, ServiceAddressURL> newURLs;
         URL copyOfConsumer = removeParamsFromConsumer(consumer);
         if (oldURLs == null) {
-            newURLs = new HashMap<>();
+            newURLs = new HashMap<>((int) (providers.size() / 0.75f + 1));
             for (String rawProvider : providers) {
                 rawProvider = stripOffVariableKeys(rawProvider);
                 ServiceAddressURL cachedURL = createURL(rawProvider, copyOfConsumer, getExtraParameters());
@@ -145,7 +145,7 @@ public abstract class CacheableFailbackRegistry extends FailbackRegistry {
                 newURLs.put(rawProvider, cachedURL);
             }
         } else {
-            newURLs = new HashMap<>((int) (oldURLs.size() / .75 + 1));
+            newURLs = new HashMap<>((int) (providers.size() / 0.75f + 1));
             // maybe only default , or "env" + default
             for (String rawProvider : providers) {
                 rawProvider = stripOffVariableKeys(rawProvider);
diff --git a/dubbo-registry/dubbo-registry-kubernetes/pom.xml b/dubbo-registry/dubbo-registry-kubernetes/pom.xml
index 799e45e..0add9e4 100644
--- a/dubbo-registry/dubbo-registry-kubernetes/pom.xml
+++ b/dubbo-registry/dubbo-registry-kubernetes/pom.xml
@@ -57,17 +57,17 @@
 
         <dependency>
             <groupId>org.mockito</groupId>
-            <artifactId>mockito-core</artifactId>
-            <version>3.4.6</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.mockito</groupId>
             <artifactId>mockito-junit-jupiter</artifactId>
-            <version>3.4.6</version>
+            <version>${mockito_version}</version>
             <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.junit.jupiter</groupId>
+                    <artifactId>junit-jupiter-api</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
 
     </dependencies>
 
-</project>
\ No newline at end of file
+</project>
diff --git a/dubbo-registry/dubbo-registry-multiple/pom.xml b/dubbo-registry/dubbo-registry-multiple/pom.xml
index c3df6a3..9f727f0 100644
--- a/dubbo-registry/dubbo-registry-multiple/pom.xml
+++ b/dubbo-registry/dubbo-registry-multiple/pom.xml
@@ -46,5 +46,26 @@
             <artifactId>commons-lang3</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-test-common</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.curator</groupId>
+            <artifactId>curator-framework</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.curator</groupId>
+            <artifactId>curator-recipes</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.zookeeper</groupId>
+            <artifactId>zookeeper</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git a/dubbo-registry/dubbo-registry-multiple/src/test/java/org/apache/dubbo/registry/multiple/MultipleRegistry2S2RTest.java b/dubbo-registry/dubbo-registry-multiple/src/test/java/org/apache/dubbo/registry/multiple/MultipleRegistry2S2RTest.java
index f16502e..0f82a29 100644
--- a/dubbo-registry/dubbo-registry-multiple/src/test/java/org/apache/dubbo/registry/multiple/MultipleRegistry2S2RTest.java
+++ b/dubbo-registry/dubbo-registry-multiple/src/test/java/org/apache/dubbo/registry/multiple/MultipleRegistry2S2RTest.java
@@ -95,10 +95,10 @@ public class MultipleRegistry2S2RTest {
         Assertions.assertNotNull(MultipleRegistryTestUtil.getZookeeperRegistry(multipleRegistry.getReferenceRegistries().values()));
 
         Assertions.assertEquals(MultipleRegistryTestUtil.getZookeeperRegistry(multipleRegistry.getServiceRegistries().values()),
-                MultipleRegistryTestUtil.getZookeeperRegistry(multipleRegistry.getReferenceRegistries().values()));
+            MultipleRegistryTestUtil.getZookeeperRegistry(multipleRegistry.getReferenceRegistries().values()));
 
         Assertions.assertEquals(MultipleRegistryTestUtil.getZookeeperRegistry(multipleRegistry.getServiceRegistries().values()),
-                MultipleRegistryTestUtil.getZookeeperRegistry(multipleRegistry.getReferenceRegistries().values()));
+            MultipleRegistryTestUtil.getZookeeperRegistry(multipleRegistry.getReferenceRegistries().values()));
 
         Assertions.assertEquals(multipleRegistry.getApplicationName(), "vic");
 
diff --git a/dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscoveryFactoryTest.java b/dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscoveryFactoryTest.java
index bae8ac7..e66731c 100644
--- a/dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscoveryFactoryTest.java
+++ b/dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscoveryFactoryTest.java
@@ -18,9 +18,13 @@ package org.apache.dubbo.registry.zookeeper;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.registry.client.ServiceDiscovery;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.DisabledForJreRange;
+import org.junit.jupiter.api.condition.JRE;
 
+@DisabledForJreRange(min = JRE.JAVA_16)
 public class ZookeeperServiceDiscoveryFactoryTest {
 
     @Test
diff --git a/dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscoveryTest.java b/dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscoveryTest.java
index aa54bd9..ce84c9e 100644
--- a/dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscoveryTest.java
+++ b/dubbo-registry/dubbo-registry-zookeeper/src/test/java/org/apache/dubbo/registry/zookeeper/ZookeeperServiceDiscoveryTest.java
@@ -30,6 +30,8 @@ import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.DisabledForJreRange;
+import org.junit.jupiter.api.condition.JRE;
 import org.mockito.internal.util.collections.Sets;
 
 import java.util.HashMap;
@@ -49,6 +51,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
  *
  * @since 2.7.5
  */
+@DisabledForJreRange(min = JRE.JAVA_16)
 public class ZookeeperServiceDiscoveryTest {
 
     private static final String SERVICE_NAME = "A";
diff --git a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/zookeeper/AbstractZookeeperClient.java b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/zookeeper/AbstractZookeeperClient.java
index 309a85b..92ee3c8 100644
--- a/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/zookeeper/AbstractZookeeperClient.java
+++ b/dubbo-remoting/dubbo-remoting-api/src/main/java/org/apache/dubbo/remoting/zookeeper/AbstractZookeeperClient.java
@@ -33,7 +33,8 @@ public abstract class AbstractZookeeperClient<TargetDataListener, TargetChildLis
 
     protected static final Logger logger = LoggerFactory.getLogger(AbstractZookeeperClient.class);
 
-    protected int DEFAULT_CONNECTION_TIMEOUT_MS = 5 * 1000;
+    // may hang up to wait name resolution up to 10s
+    protected int DEFAULT_CONNECTION_TIMEOUT_MS = 30 * 1000;
     protected int DEFAULT_SESSION_TIMEOUT_MS = 60 * 1000;
 
     private final URL url;
diff --git a/dubbo-remoting/dubbo-remoting-zookeeper-curator5/pom.xml b/dubbo-remoting/dubbo-remoting-zookeeper-curator5/pom.xml
index 7a246c9..0b8500f 100644
--- a/dubbo-remoting/dubbo-remoting-zookeeper-curator5/pom.xml
+++ b/dubbo-remoting/dubbo-remoting-zookeeper-curator5/pom.xml
@@ -29,8 +29,6 @@
     <description>The zookeeper curator5 remoting module of dubbo project</description>
     <properties>
         <skip_maven_deploy>false</skip_maven_deploy>
-        <curator5_version>5.1.0</curator5_version>
-        <zookeeper_version>3.6.0</zookeeper_version>
     </properties>
 
     <dependencies>
@@ -47,17 +45,14 @@
         <dependency>
             <groupId>org.apache.curator</groupId>
             <artifactId>curator-framework</artifactId>
-            <version>${curator5_version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.curator</groupId>
             <artifactId>curator-recipes</artifactId>
-            <version>${curator5_version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.zookeeper</groupId>
             <artifactId>zookeeper</artifactId>
-            <version>${zookeeper_version}</version>
         </dependency>
     </dependencies>
 </project>
diff --git a/dubbo-remoting/dubbo-remoting-zookeeper/pom.xml b/dubbo-remoting/dubbo-remoting-zookeeper/pom.xml
index 7969719..cc6d9c5 100644
--- a/dubbo-remoting/dubbo-remoting-zookeeper/pom.xml
+++ b/dubbo-remoting/dubbo-remoting-zookeeper/pom.xml
@@ -28,6 +28,8 @@
     <description>The zookeeper remoting module of dubbo project</description>
     <properties>
         <skip_maven_deploy>false</skip_maven_deploy>
+        <zookeeper_version>3.4.13</zookeeper_version>
+        <curator_version>4.2.0</curator_version>
     </properties>
     <dependencies>
         <dependency>
@@ -43,10 +45,22 @@
         <dependency>
             <groupId>org.apache.curator</groupId>
             <artifactId>curator-recipes</artifactId>
+            <version>${curator_version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.curator</groupId>
+            <artifactId>curator-framework</artifactId>
+            <version>${curator_version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.curator</groupId>
+            <artifactId>curator-x-discovery</artifactId>
+            <version>${curator_version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.zookeeper</groupId>
             <artifactId>zookeeper</artifactId>
+            <version>${zookeeper_version}</version>
             <exclusions>
                 <exclusion>
                     <groupId>org.slf4j</groupId>
diff --git a/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/curator/CuratorZookeeperClientTest.java b/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/curator/CuratorZookeeperClientTest.java
index 297602a..c647957 100644
--- a/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/curator/CuratorZookeeperClientTest.java
+++ b/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/curator/CuratorZookeeperClientTest.java
@@ -25,20 +25,25 @@ import org.apache.curator.retry.ExponentialBackoffRetry;
 import org.apache.zookeeper.WatchedEvent;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.DisabledForJreRange;
+import org.junit.jupiter.api.condition.JRE;
+
 import java.io.IOException;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicInteger;
+
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.Is.is;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.mockito.Mockito.mock;
 
+@DisabledForJreRange(min = JRE.JAVA_16)
 public class CuratorZookeeperClientTest {
     private CuratorZookeeperClient curatorClient;
     CuratorFramework client = null;
diff --git a/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/curator/CuratorZookeeperTransporterTest.java b/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/curator/CuratorZookeeperTransporterTest.java
index 0c5986f..6c7bd3d 100644
--- a/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/curator/CuratorZookeeperTransporterTest.java
+++ b/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/curator/CuratorZookeeperTransporterTest.java
@@ -21,11 +21,14 @@ import org.apache.dubbo.remoting.zookeeper.ZookeeperClient;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.DisabledForJreRange;
+import org.junit.jupiter.api.condition.JRE;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.IsNot.not;
 import static org.hamcrest.core.IsNull.nullValue;
 
+@DisabledForJreRange(min = JRE.JAVA_16)
 public class CuratorZookeeperTransporterTest {
     private ZookeeperClient zookeeperClient;
     private CuratorZookeeperTransporter curatorZookeeperTransporter;
diff --git a/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/curator/support/AbstractZookeeperTransporterTest.java b/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/curator/support/AbstractZookeeperTransporterTest.java
index d2bc36e..a23f4ca 100644
--- a/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/curator/support/AbstractZookeeperTransporterTest.java
+++ b/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/curator/support/AbstractZookeeperTransporterTest.java
@@ -20,11 +20,16 @@ import org.apache.dubbo.common.URL;
 import org.apache.dubbo.remoting.zookeeper.AbstractZookeeperTransporter;
 import org.apache.dubbo.remoting.zookeeper.ZookeeperClient;
 import org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperTransporter;
+
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
-import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.DisabledForJreRange;
+import org.junit.jupiter.api.condition.JRE;
+
 import java.util.List;
+
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.IsNot.not;
 import static org.hamcrest.core.IsNull.nullValue;
@@ -32,6 +37,7 @@ import static org.hamcrest.core.IsNull.nullValue;
 /**
  * AbstractZookeeperTransporterTest
  */
+@DisabledForJreRange(min = JRE.JAVA_16)
 public class AbstractZookeeperTransporterTest {
     private ZookeeperClient zookeeperClient;
     private AbstractZookeeperTransporter abstractZookeeperTransporter;
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AppResponse.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AppResponse.java
index 3eb5f17..4f148ee 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AppResponse.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/AppResponse.java
@@ -16,8 +16,6 @@
  */
 package org.apache.dubbo.rpc;
 
-import org.apache.dubbo.rpc.proxy.InvokerInvocationHandler;
-
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
@@ -80,7 +78,7 @@ public class AppResponse implements Result {
         if (exception != null) {
             // fix issue#619
             try {
-                Object stackTrace = InvokerInvocationHandler.stackTraceField.get(exception);
+                Object stackTrace = exception.getStackTrace();
                 if (stackTrace == null) {
                     exception.setStackTrace(new StackTraceElement[0]);
                 }
diff --git a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/InvokerInvocationHandler.java b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/InvokerInvocationHandler.java
index 70e8b83..42125ee 100644
--- a/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/InvokerInvocationHandler.java
+++ b/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/proxy/InvokerInvocationHandler.java
@@ -26,7 +26,6 @@ import org.apache.dubbo.rpc.RpcServiceContext;
 import org.apache.dubbo.rpc.model.ConsumerModel;
 import org.apache.dubbo.rpc.model.ServiceModel;
 
-import java.lang.reflect.Field;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
 
@@ -40,17 +39,6 @@ public class InvokerInvocationHandler implements InvocationHandler {
     private URL url;
     private String protocolServiceKey;
 
-    public static Field stackTraceField;
-
-    static {
-        try {
-            stackTraceField = Throwable.class.getDeclaredField("stackTrace");
-            stackTraceField.setAccessible(true);
-        } catch (NoSuchFieldException e) {
-            // ignore
-        }
-    }
-
     public InvokerInvocationHandler(Invoker<?> handler) {
         this.invoker = handler;
         this.url = invoker.getUrl();
diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/ArgumentCallbackTest.java b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/ArgumentCallbackTest.java
index 7063762..ff7dd83 100644
--- a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/ArgumentCallbackTest.java
+++ b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/ArgumentCallbackTest.java
@@ -26,6 +26,7 @@ import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ConsumerModel;
 import org.apache.dubbo.rpc.model.ModuleServiceRepository;
 import org.apache.dubbo.rpc.protocol.dubbo.support.ProtocolUtils;
+
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
diff --git a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/status/ServerStatusCheckerTest.java b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/status/ServerStatusCheckerTest.java
index 36184a0..c3fb10a 100644
--- a/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/status/ServerStatusCheckerTest.java
+++ b/dubbo-rpc/dubbo-rpc-dubbo/src/test/java/org/apache/dubbo/rpc/protocol/dubbo/status/ServerStatusCheckerTest.java
@@ -21,6 +21,7 @@ import org.apache.dubbo.remoting.RemotingServer;
 import org.apache.dubbo.rpc.ProtocolServer;
 import org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol;
 import org.apache.dubbo.rpc.protocol.dubbo.decode.MockChannel;
+
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 import org.mockito.MockedStatic;
@@ -56,12 +57,16 @@ public class ServerStatusCheckerTest {
             mockDubboProtocol.when(() -> DubboProtocol.getDubboProtocol()).thenReturn(dubboProtocol);
             status = serverStatusChecker.check();
             Assertions.assertEquals(status.getLevel(), Status.Level.OK);
-            Assertions.assertEquals(status.getMessage(), "127.0.0.1:9999(clients:1)");
+            // In JDK 17 : 127.0.0.1/<unresolved>:9999(clients:1)
+            Assertions.assertTrue(status.getMessage().contains("127.0.0.1"));
+            Assertions.assertTrue(status.getMessage().contains("9999(clients:1)"));
 
             Mockito.when(remotingServer.isBound()).thenReturn(false);
             status = serverStatusChecker.check();
             Assertions.assertEquals(status.getLevel(), Status.Level.ERROR);
-            Assertions.assertEquals(status.getMessage(), "127.0.0.1:9999");
+            // In JDK 17 : 127.0.0.1/<unresolved>:9999
+            Assertions.assertTrue(status.getMessage().contains("127.0.0.1"));
+            Assertions.assertTrue(status.getMessage().contains("9999"));
         }
     }
 }
diff --git a/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/InjvmDeepCopyTest.java b/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/InjvmDeepCopyTest.java
index d445712..b8ea63c 100644
--- a/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/InjvmDeepCopyTest.java
+++ b/dubbo-rpc/dubbo-rpc-injvm/src/test/java/org/apache/dubbo/rpc/protocol/injvm/InjvmDeepCopyTest.java
@@ -89,7 +89,7 @@ public class InjvmDeepCopyTest {
         applicationModel.destroy();
     }
 
-    private interface DemoInterface {
+    interface DemoInterface {
         Data call(Data obj);
     }
 
diff --git a/dubbo-test/dubbo-test-check/src/main/java/org/apache/dubbo/test/check/AbstractRegistryCenterTestExecutionListener.java b/dubbo-test/dubbo-test-check/src/main/java/org/apache/dubbo/test/check/AbstractRegistryCenterTestExecutionListener.java
index e692221..c5c607c 100644
--- a/dubbo-test/dubbo-test-check/src/main/java/org/apache/dubbo/test/check/AbstractRegistryCenterTestExecutionListener.java
+++ b/dubbo-test/dubbo-test-check/src/main/java/org/apache/dubbo/test/check/AbstractRegistryCenterTestExecutionListener.java
@@ -21,6 +21,7 @@ import org.junit.platform.engine.support.descriptor.ClassSource;
 import org.junit.platform.launcher.TestExecutionListener;
 import org.junit.platform.launcher.TestIdentifier;
 import org.junit.platform.launcher.TestPlan;
+
 import java.util.HashSet;
 import java.util.Set;
 
diff --git a/dubbo-test/dubbo-test-spring/pom.xml b/dubbo-test/dubbo-test-spring/pom.xml
index 3e417d3..c496d16 100644
--- a/dubbo-test/dubbo-test-spring/pom.xml
+++ b/dubbo-test/dubbo-test-spring/pom.xml
@@ -148,6 +148,12 @@
             <!--<scope>test</scope>-->
         </dependency>
         <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
+            <version>${junit_jupiter_version}</version>
+<!--            <scope>test</scope>-->
+        </dependency>
+        <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-core</artifactId>
             <version>${mockito_version}</version>
@@ -165,6 +171,22 @@
             <version>${cglib_version}</version>
             <!--<scope>test</scope>-->
         </dependency>
+
+        <dependency>
+            <groupId>org.apache.curator</groupId>
+            <artifactId>curator-framework</artifactId>
+<!--            <scope>test</scope>-->
+        </dependency>
+        <dependency>
+            <groupId>org.apache.curator</groupId>
+            <artifactId>curator-recipes</artifactId>
+<!--            <scope>test</scope>-->
+        </dependency>
+        <dependency>
+            <groupId>org.apache.zookeeper</groupId>
+            <artifactId>zookeeper</artifactId>
+<!--            <scope>test</scope>-->
+        </dependency>
     </dependencies>
 
 </project>
diff --git a/dubbo-test/dubbo-test-spring3.2/pom.xml b/dubbo-test/dubbo-test-spring3.2/pom.xml
index c349bdd..991d7e4 100644
--- a/dubbo-test/dubbo-test-spring3.2/pom.xml
+++ b/dubbo-test/dubbo-test-spring3.2/pom.xml
@@ -52,6 +52,22 @@
             <version>${project.parent.version}</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.curator</groupId>
+            <artifactId>curator-framework</artifactId>
+            <!--            <scope>test</scope>-->
+        </dependency>
+        <dependency>
+            <groupId>org.apache.curator</groupId>
+            <artifactId>curator-recipes</artifactId>
+            <!--            <scope>test</scope>-->
+        </dependency>
+        <dependency>
+            <groupId>org.apache.zookeeper</groupId>
+            <artifactId>zookeeper</artifactId>
+            <!--            <scope>test</scope>-->
+        </dependency>
+
     </dependencies>
 
     <build>
diff --git a/dubbo-test/dubbo-test-spring4.1/pom.xml b/dubbo-test/dubbo-test-spring4.1/pom.xml
index 942e055..0198483 100644
--- a/dubbo-test/dubbo-test-spring4.1/pom.xml
+++ b/dubbo-test/dubbo-test-spring4.1/pom.xml
@@ -51,7 +51,22 @@
             <artifactId>dubbo-test-spring</artifactId>
             <version>${project.parent.version}</version>
             <scope>test</scope>
+        </dependency>        <dependency>
+        <groupId>org.apache.curator</groupId>
+        <artifactId>curator-framework</artifactId>
+        <!--            <scope>test</scope>-->
+    </dependency>
+        <dependency>
+            <groupId>org.apache.curator</groupId>
+            <artifactId>curator-recipes</artifactId>
+            <!--            <scope>test</scope>-->
+        </dependency>
+        <dependency>
+            <groupId>org.apache.zookeeper</groupId>
+            <artifactId>zookeeper</artifactId>
+            <!--            <scope>test</scope>-->
         </dependency>
+
     </dependencies>
 
     <build>
diff --git a/dubbo-test/dubbo-test-spring4.2/pom.xml b/dubbo-test/dubbo-test-spring4.2/pom.xml
index e53c596..e9745ce 100644
--- a/dubbo-test/dubbo-test-spring4.2/pom.xml
+++ b/dubbo-test/dubbo-test-spring4.2/pom.xml
@@ -51,7 +51,22 @@
             <artifactId>dubbo-test-spring</artifactId>
             <version>${project.parent.version}</version>
             <scope>test</scope>
+        </dependency>        <dependency>
+        <groupId>org.apache.curator</groupId>
+        <artifactId>curator-framework</artifactId>
+        <!--            <scope>test</scope>-->
+    </dependency>
+        <dependency>
+            <groupId>org.apache.curator</groupId>
+            <artifactId>curator-recipes</artifactId>
+            <!--            <scope>test</scope>-->
+        </dependency>
+        <dependency>
+            <groupId>org.apache.zookeeper</groupId>
+            <artifactId>zookeeper</artifactId>
+            <!--            <scope>test</scope>-->
         </dependency>
+
     </dependencies>
 
     <build>
diff --git a/pom.xml b/pom.xml
index a09f9eb..bd384c2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -88,14 +88,14 @@
 
     <properties>
         <!-- Test libs -->
-        <junit_jupiter_version>5.6.0</junit_jupiter_version>
+        <junit_jupiter_version>5.8.1</junit_jupiter_version>
         <hazelcast_version>3.11.1</hazelcast_version>
         <hamcrest_version>2.2</hamcrest_version>
         <hibernate_validator_version>5.2.4.Final</hibernate_validator_version>
         <el_api_version>2.2.4</el_api_version>
         <jaxb_api_version>2.2.7</jaxb_api_version>
         <cglib_version>2.2</cglib_version>
-        <mockito_version>3.8.0</mockito_version>
+        <mockito_version>3.12.4</mockito_version>
         <!-- Build args -->
         <argline>-server -Xms256m -Xmx512m -Dfile.encoding=UTF-8
             -Djava.net.preferIPv4Stack=true -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m
@@ -120,7 +120,7 @@
         <maven_javadoc_version>3.2.0</maven_javadoc_version>
         <maven_jetty_version>9.4.38.v20210224</maven_jetty_version>
         <maven_checkstyle_version>3.1.2</maven_checkstyle_version>
-        <maven_jacoco_version>0.8.6</maven_jacoco_version>
+        <maven_jacoco_version>0.8.7</maven_jacoco_version>
         <maven_flatten_version>1.2.5</maven_flatten_version>
         <maven_enforce_version>3.0.0-M3</maven_enforce_version>
         <apache-rat-plugin.version>0.13</apache-rat-plugin.version>
@@ -181,6 +181,12 @@
         </dependency>
         <dependency>
             <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-api</artifactId>
+            <version>${junit_jupiter_version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
             <artifactId>junit-jupiter-params</artifactId>
             <version>${junit_jupiter_version}</version>
             <scope>test</scope>
@@ -488,6 +494,33 @@
                 </plugins>
             </build>
         </profile>
+        <profile>
+            <id>jdk15ge</id>
+            <activation>
+                <jdk>[15,</jdk>
+            </activation>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-surefire-plugin</artifactId>
+                        <configuration>
+                            <useSystemClassLoader>true</useSystemClassLoader>
+                            <forkMode>once</forkMode>
+                            <argLine>${argline} ${jacocoArgLine}
+                                --add-opens java.base/java.lang=ALL-UNNAMED
+                                --add-opens java.base/java.util=ALL-UNNAMED
+                            </argLine>
+                            <systemProperties>
+                                <!-- common shared -->
+                            </systemProperties>
+                            <!-- Activate the use of TCP to transmit events to the plugin to fix Corrupted STDOUT issue -->
+                            <forkNode implementation="org.apache.maven.plugin.surefire.extensions.SurefireForkNodeFactory"/>
+                        </configuration>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
     </profiles>
 
     <build>