chore: support java 11 (#83)

* chore: support java 17

* fix: unitest

* fix: server JAX-B API not found warning

* chore: improve code

* fix: hugeconfig test

* chore: resolve conflict

* fix: version unit test

* chore: improve code

* chore: improve impl version

* chore: improve code

* refactor: hugeconfig get

* chore: improve code
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index a09093a..e319c49 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -15,12 +15,17 @@
 jobs:
   build:
     runs-on: ubuntu-20.04
+    strategy:
+      fail-fast: false
+      matrix:
+        JAVA_VERSION: ['8', '11']
+
     steps:
-      - name: Install JDK 8
+      - name: Install JDK ${{ matrix.JAVA_VERSION }}
         uses: actions/setup-java@v2
         with:
-          java-version: '8'
-          distribution: 'adopt'
+          java-version: ${{ matrix.JAVA_VERSION }}
+          distribution: 'zulu'
 
       - name: Cache Maven packages
         uses: actions/cache@v2
diff --git a/hugegraph-common/pom.xml b/hugegraph-common/pom.xml
index 1092890..9fb054b 100644
--- a/hugegraph-common/pom.xml
+++ b/hugegraph-common/pom.xml
@@ -6,7 +6,7 @@
     <parent>
         <groupId>com.baidu.hugegraph</groupId>
         <artifactId>hugegraph-commons</artifactId>
-        <version>2.0.1</version>
+        <version>2.1.0</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
@@ -71,6 +71,11 @@
             <version>${commons.configuration2.version}</version>
         </dependency>
         <dependency>
+            <groupId>commons-beanutils</groupId>
+            <artifactId>commons-beanutils</artifactId>
+            <version>${commons.beanutils.version}</version>
+        </dependency>
+        <dependency>
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>
             <version>${commons.io.version}</version>
@@ -173,6 +178,17 @@
             <artifactId>jersey-hk2</artifactId>
             <version>${jersey.hk2.version}</version>
         </dependency>
+        <dependency>
+            <groupId>jakarta.xml.bind</groupId>
+            <artifactId>jakarta.xml.bind-api</artifactId>
+            <version>${jakarta.xml.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.sun.xml.bind</groupId>
+            <artifactId>jaxb-impl</artifactId>
+            <version>${sun.xml.version}</version>
+            <scope>runtime</scope>
+        </dependency>
     </dependencies>
 
     <build>
@@ -231,7 +247,7 @@
                         <manifestEntries>
                             <!-- Must be on one line, otherwise the automatic
                                  upgrade script cannot replace the version number -->
-                            <Implementation-Version>2.0.1.0</Implementation-Version>
+                            <Implementation-Version>2.1.0.0</Implementation-Version>
                         </manifestEntries>
                     </archive>
                 </configuration>
diff --git a/hugegraph-common/src/main/java/com/baidu/hugegraph/config/ConfigListOption.java b/hugegraph-common/src/main/java/com/baidu/hugegraph/config/ConfigListOption.java
index ef6e324..ff114cc 100644
--- a/hugegraph-common/src/main/java/com/baidu/hugegraph/config/ConfigListOption.java
+++ b/hugegraph-common/src/main/java/com/baidu/hugegraph/config/ConfigListOption.java
@@ -69,10 +69,6 @@
         String str = (String) value;
         if (str.startsWith("[") && str.endsWith("]")) {
             str = str.substring(1, str.length() - 1);
-        } else {
-            throw new ConfigException(
-                      "The list type config option expected " +
-                      "to be wrapped in [], actual '%s'", str);
         }
 
         String[] parts = str.split(",");
diff --git a/hugegraph-common/src/main/java/com/baidu/hugegraph/config/HugeConfig.java b/hugegraph-common/src/main/java/com/baidu/hugegraph/config/HugeConfig.java
index 2593be6..22974f8 100644
--- a/hugegraph-common/src/main/java/com/baidu/hugegraph/config/HugeConfig.java
+++ b/hugegraph-common/src/main/java/com/baidu/hugegraph/config/HugeConfig.java
@@ -21,73 +21,50 @@
 
 import java.io.File;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.commons.configuration.AbstractConfiguration;
-import org.apache.commons.configuration.AbstractFileConfiguration;
-import org.apache.commons.configuration.Configuration;
-import org.apache.commons.configuration.ConfigurationException;
-import org.apache.commons.configuration.PropertiesConfiguration;
-import org.slf4j.Logger;
-
 import com.baidu.hugegraph.util.E;
 import com.baidu.hugegraph.util.Log;
+import org.apache.commons.configuration2.Configuration;
+import org.apache.commons.configuration2.FileBasedConfiguration;
+import org.apache.commons.configuration2.PropertiesConfiguration;
+import org.apache.commons.configuration2.YAMLConfiguration;
+import org.apache.commons.configuration2.builder.FileBasedConfigurationBuilder;
+import org.apache.commons.configuration2.builder.fluent.Configurations;
+import org.apache.commons.configuration2.builder.fluent.Parameters;
+import org.apache.commons.configuration2.ex.ConfigurationException;
+import org.apache.commons.configuration2.io.FileHandler;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+
+import javax.annotation.Nullable;
 
 public class HugeConfig extends PropertiesConfiguration {
 
     private static final Logger LOG = Log.logger(HugeConfig.class);
 
-    public HugeConfig(Configuration config) {
-        if (config == null) {
-            throw new ConfigException("The config object is null");
-        }
-        this.reloadIfNeed(config);
-        this.setLayoutIfNeeded(config);
+    private final String path;
 
-        Iterator<String> keys = config.getKeys();
-        while (keys.hasNext()) {
-            String key = keys.next();
-            this.addProperty(key, config.getProperty(key));
-        }
-        this.checkRequiredOptions();
+    public HugeConfig(Configuration config) {
+        loadConfig(config);
+        this.path = null;
     }
 
     public HugeConfig(String configFile) {
-        this(loadConfigFile(configFile));
+        loadConfig(loadConfigFile(configFile));
+        this.path = configFile;
     }
 
-    private void reloadIfNeed(Configuration conf) {
-        if (!(conf instanceof AbstractFileConfiguration)) {
-            if (conf instanceof AbstractConfiguration) {
-                AbstractConfiguration config = (AbstractConfiguration) conf;
-                config.setDelimiterParsingDisabled(true);
-            }
-            return;
+    private void loadConfig(Configuration config) {
+        if (config == null) {
+            throw new ConfigException("The config object is null");
         }
-        AbstractFileConfiguration fileConfig = (AbstractFileConfiguration) conf;
+        this.setLayoutIfNeeded(config);
 
-        File file = fileConfig.getFile();
-        if (file != null) {
-            // May need to use the original file
-            this.setFile(file);
-        }
-
-        if (!fileConfig.isDelimiterParsingDisabled()) {
-            /*
-             * PropertiesConfiguration will parse the containing comma
-             * config options into list directly, but we want to do
-             * this work by ourselves, so reload it and parse into `String`
-             */
-            fileConfig.setDelimiterParsingDisabled(true);
-            try {
-                fileConfig.refresh();
-            } catch (ConfigurationException e) {
-                throw new ConfigException("Unable to load config file: %s",
-                                          e, file);
-            }
-        }
+        this.append(config);
+        this.checkRequiredOptions();
     }
 
     private void setLayoutIfNeeded(Configuration conf) {
@@ -98,30 +75,22 @@
         this.setLayout(propConf.getLayout());
     }
 
-    private static PropertiesConfiguration loadConfigFile(String path) {
+    private static Configuration loadConfigFile(String path) {
         E.checkNotNull(path, "config path");
         E.checkArgument(!path.isEmpty(),
                         "The config path can't be empty");
 
         File file = new File(path);
-        E.checkArgument(file.exists() && file.isFile() && file.canRead(),
-                        "Need to specify a readable config, but got: %s",
-                        file.toString());
-
-        PropertiesConfiguration config = new PropertiesConfiguration();
-        config.setDelimiterParsingDisabled(true);
-        try {
-            config.load(file);
-        } catch (ConfigurationException e) {
-            throw new ConfigException("Unable to load config: %s", e, path);
-        }
-        return config;
+        return loadConfigFile(file);
     }
 
     @SuppressWarnings("unchecked")
     public <T, R> R get(TypedOption<T, R> option) {
         Object value = this.getProperty(option.name());
-        return value != null ? (R) value : option.defaultValue();
+        if (value == null) {
+            return option.defaultValue();
+        }
+        return (R) value;
     }
 
     public Map<String, String> getMap(ConfigListOption<String> option) {
@@ -138,26 +107,99 @@
     }
 
     @Override
-    public void addProperty(String key, Object value) {
-        if (!OptionSpace.containKey(key)) {
+    public void addPropertyDirect(String key, Object value) {
+        TypedOption<?, ?> option = OptionSpace.get(key);
+        if (option == null) {
             LOG.warn("The config option '{}' is redundant, " +
                      "please ensure it has been registered", key);
         } else {
             // The input value is String(parsed by PropertiesConfiguration)
             value = this.validateOption(key, value);
         }
-        super.addPropertyDirect(key, value);
+        if (this.containsKey(key) && value instanceof List) {
+            for (Object item : (List<Object>) value) {
+                super.addPropertyDirect(key, item);
+            }
+        } else {
+            super.addPropertyDirect(key, value);
+        }
+    }
+
+    @Override
+    protected void addPropertyInternal(String key, Object value) {
+        this.addPropertyDirect(key, value);
     }
 
     private Object validateOption(String key, Object value) {
-        E.checkArgument(value instanceof String,
-                        "Invalid value for key '%s': %s", key, value);
-
         TypedOption<?, ?> option = OptionSpace.get(key);
-        return option.parseConvert((String) value);
+
+        if (value instanceof String) {
+            return option.parseConvert((String) value);
+        }
+
+        Class dataType = option.dataType();
+        if (dataType.isInstance(value)) {
+            return value;
+        }
+
+        throw new IllegalArgumentException(
+              String.format("Invalid value for key '%s': '%s'", key, value));
     }
 
     private void checkRequiredOptions() {
         // TODO: Check required options must be contained in this map
     }
+
+    public void save(File copiedFile) throws ConfigurationException {
+        FileHandler fileHandler = new FileHandler(this);
+        fileHandler.save(copiedFile);
+    }
+
+    @Nullable
+    public File getFile() {
+        if (StringUtils.isEmpty(this.path)) {
+            return null;
+        }
+
+        return new File(this.path);
+    }
+
+    private static Configuration loadConfigFile(File configFile) {
+        E.checkArgument(configFile.exists() &&
+                        configFile.isFile() &&
+                        configFile.canRead(),
+                        "Please specify a proper config file rather than: '%s'",
+                        configFile.toString());
+
+        try {
+            String fileName = configFile.getName();
+            String fileExtension = FilenameUtils.getExtension(fileName);
+
+            Configuration config;
+            Configurations configs = new Configurations();
+
+            switch (fileExtension) {
+                case "yml":
+                case "yaml":
+                    Parameters params = new Parameters();
+                    FileBasedConfigurationBuilder<FileBasedConfiguration>
+                    builder = new FileBasedConfigurationBuilder(
+                                  YAMLConfiguration.class)
+                                  .configure(params.fileBased()
+                                  .setFile(configFile));
+                    config = builder.getConfiguration();
+                    break;
+                case "xml":
+                    config = configs.xml(configFile);
+                    break;
+                default:
+                    config = configs.properties(configFile);
+                    break;
+            }
+            return config;
+        } catch (ConfigurationException e) {
+            throw new ConfigException("Unable to load config: '%s'",
+                                      e, configFile);
+        }
+    }
 }
diff --git a/hugegraph-common/src/main/java/com/baidu/hugegraph/config/TypedOption.java b/hugegraph-common/src/main/java/com/baidu/hugegraph/config/TypedOption.java
index 2aa50e3..cd5841b 100644
--- a/hugegraph-common/src/main/java/com/baidu/hugegraph/config/TypedOption.java
+++ b/hugegraph-common/src/main/java/com/baidu/hugegraph/config/TypedOption.java
@@ -129,6 +129,9 @@
             return value;
         } else if (dataType.equals(Class.class)) {
             try {
+                if (value.startsWith("class")) {
+                    value = value.substring("class".length()).trim();
+                }
                 return Class.forName(value);
             } catch (ClassNotFoundException e) {
                 throw new ConfigException(
diff --git a/hugegraph-common/src/main/java/com/baidu/hugegraph/rest/AbstractRestClient.java b/hugegraph-common/src/main/java/com/baidu/hugegraph/rest/AbstractRestClient.java
index 5c96196..d6b1b71 100644
--- a/hugegraph-common/src/main/java/com/baidu/hugegraph/rest/AbstractRestClient.java
+++ b/hugegraph-common/src/main/java/com/baidu/hugegraph/rest/AbstractRestClient.java
@@ -31,24 +31,16 @@
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
-import javax.net.ssl.HostnameVerifier;
-import javax.net.ssl.HttpsURLConnection;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLSession;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.X509TrustManager;
-import javax.ws.rs.client.Client;
-import javax.ws.rs.client.ClientBuilder;
-import javax.ws.rs.client.ClientRequestContext;
-import javax.ws.rs.client.ClientRequestFilter;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.client.Invocation.Builder;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Variant;
-
+import jakarta.ws.rs.client.Client;
+import jakarta.ws.rs.client.ClientRequestContext;
+import jakarta.ws.rs.client.ClientRequestFilter;
+import jakarta.ws.rs.client.Entity;
+import jakarta.ws.rs.client.Invocation.Builder;
+import jakarta.ws.rs.client.WebTarget;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.core.Response;
+import jakarta.ws.rs.core.Variant;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.http.HttpHeaders;
@@ -64,6 +56,7 @@
 import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
 import org.glassfish.jersey.client.ClientConfig;
 import org.glassfish.jersey.client.ClientProperties;
+import org.glassfish.jersey.client.JerseyClientBuilder;
 import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
 import org.glassfish.jersey.internal.util.collection.Ref;
 import org.glassfish.jersey.internal.util.collection.Refs;
@@ -74,6 +67,13 @@
 import com.baidu.hugegraph.util.ExecutorUtil;
 import com.google.common.collect.ImmutableMap;
 
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+
 public abstract class AbstractRestClient implements RestClient {
 
     // Time unit: hours
@@ -163,7 +163,8 @@
 
     public AbstractRestClient(String url, ClientConfig config) {
         configConnectionManager(url, config);
-        this.client = ClientBuilder.newClient(config);
+
+        this.client = JerseyClientBuilder.newClient(config);
         this.client.register(GZipEncoder.class);
         this.target = this.client.target(url);
         this.pool = (PoolingHttpClientConnectionManager) config.getProperty(
diff --git a/hugegraph-common/src/main/java/com/baidu/hugegraph/rest/RestClient.java b/hugegraph-common/src/main/java/com/baidu/hugegraph/rest/RestClient.java
index 54a6df3..a60aeee 100644
--- a/hugegraph-common/src/main/java/com/baidu/hugegraph/rest/RestClient.java
+++ b/hugegraph-common/src/main/java/com/baidu/hugegraph/rest/RestClient.java
@@ -21,7 +21,7 @@
 
 import java.util.Map;
 
-import javax.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.core.MultivaluedMap;
 
 public interface RestClient {
 
diff --git a/hugegraph-common/src/main/java/com/baidu/hugegraph/rest/RestResult.java b/hugegraph-common/src/main/java/com/baidu/hugegraph/rest/RestResult.java
index dc78f18..88ba49e 100644
--- a/hugegraph-common/src/main/java/com/baidu/hugegraph/rest/RestResult.java
+++ b/hugegraph-common/src/main/java/com/baidu/hugegraph/rest/RestResult.java
@@ -23,8 +23,8 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response;
+import jakarta.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.core.Response;
 
 import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.JsonNode;
diff --git a/hugegraph-common/src/main/java/com/baidu/hugegraph/version/CommonVersion.java b/hugegraph-common/src/main/java/com/baidu/hugegraph/version/CommonVersion.java
index 32e2025..e10b092 100644
--- a/hugegraph-common/src/main/java/com/baidu/hugegraph/version/CommonVersion.java
+++ b/hugegraph-common/src/main/java/com/baidu/hugegraph/version/CommonVersion.java
@@ -27,5 +27,5 @@
 
     // The second parameter of Version.of() is for all-in-one JAR
     public static final Version VERSION = Version.of(CommonVersion.class,
-                                                     "2.0.1");
+                                                     "2.1.0");
 }
diff --git a/hugegraph-common/src/test/java/com/baidu/hugegraph/unit/config/HugeConfigTest.java b/hugegraph-common/src/test/java/com/baidu/hugegraph/unit/config/HugeConfigTest.java
index 75a47bb..f522d56 100644
--- a/hugegraph-common/src/test/java/com/baidu/hugegraph/unit/config/HugeConfigTest.java
+++ b/hugegraph-common/src/test/java/com/baidu/hugegraph/unit/config/HugeConfigTest.java
@@ -35,10 +35,13 @@
 import java.util.Map;
 
 import org.apache.commons.collections.IteratorUtils;
-import org.apache.commons.configuration.Configuration;
-import org.apache.commons.configuration.ConfigurationException;
-import org.apache.commons.configuration.MapConfiguration;
-import org.apache.commons.configuration.PropertiesConfiguration;
+import org.apache.commons.configuration2.AbstractConfiguration;
+import org.apache.commons.configuration2.Configuration;
+import org.apache.commons.configuration2.MapConfiguration;
+import org.apache.commons.configuration2.PropertiesConfiguration;
+import org.apache.commons.configuration2.convert.DisabledListDelimiterHandler;
+import org.apache.commons.configuration2.ex.ConfigurationException;
+import org.apache.commons.configuration2.io.FileHandler;
 import org.apache.commons.io.FileUtils;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -262,7 +265,8 @@
     @Test
     public void testHugeConfig() throws Exception {
         Configuration conf = new PropertiesConfiguration();
-        Whitebox.setInternalState(conf, "delimiterParsingDisabled", true);
+        Assert.assertEquals(DisabledListDelimiterHandler.INSTANCE,
+               ((AbstractConfiguration) conf).getListDelimiterHandler());
 
         HugeConfig config = new HugeConfig(conf);
 
@@ -338,7 +342,10 @@
 
     @Test
     public void testHugeConfigWithConfiguration() throws Exception {
-        HugeConfig config = new HugeConfig(new PropertiesConfiguration(CONF));
+        PropertiesConfiguration configuration = new PropertiesConfiguration();
+        FileHandler fileHandler = new FileHandler(configuration);
+        fileHandler.load(CONF);
+        HugeConfig config = new HugeConfig(configuration);
 
         Assert.assertEquals("file-text1-value", config.get(TestOptions.text1));
         Assert.assertEquals("file-text2-value", config.get(TestOptions.text2));
@@ -348,7 +355,8 @@
     @Test
     public void testHugeConfigWithOverride() throws Exception {
         Configuration conf = new PropertiesConfiguration();
-        Whitebox.setInternalState(conf, "delimiterParsingDisabled", true);
+        Assert.assertEquals(DisabledListDelimiterHandler.INSTANCE,
+               ((AbstractConfiguration) conf).getListDelimiterHandler());
 
         HugeConfig config = new HugeConfig(conf);
 
diff --git a/hugegraph-common/src/test/java/com/baidu/hugegraph/unit/rest/RestClientTest.java b/hugegraph-common/src/test/java/com/baidu/hugegraph/unit/rest/RestClientTest.java
index d682025..bd48a0c 100644
--- a/hugegraph-common/src/test/java/com/baidu/hugegraph/unit/rest/RestClientTest.java
+++ b/hugegraph-common/src/test/java/com/baidu/hugegraph/unit/rest/RestClientTest.java
@@ -32,20 +32,18 @@
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLSession;
 import javax.net.ssl.SSLSessionContext;
-import javax.ws.rs.client.Entity;
-import javax.ws.rs.client.WebTarget;
-import javax.ws.rs.client.Invocation.Builder;
-import javax.ws.rs.core.MultivaluedHashMap;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response;
 
+import jakarta.ws.rs.client.Invocation.Builder;
+import jakarta.ws.rs.client.WebTarget;
+import jakarta.ws.rs.core.MultivaluedHashMap;
+import jakarta.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.core.Response;
 import org.apache.http.HttpClientConnection;
 import org.apache.http.HttpHeaders;
 import org.apache.http.HttpHost;
 import org.apache.http.conn.routing.HttpRoute;
 import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
 import org.apache.http.pool.PoolStats;
-import org.glassfish.jersey.client.ClientRequest;
 import org.glassfish.jersey.internal.util.collection.ImmutableMultivaluedMap;
 import org.junit.Test;
 import org.mockito.Mockito;
diff --git a/hugegraph-common/src/test/java/com/baidu/hugegraph/unit/rest/RestResultTest.java b/hugegraph-common/src/test/java/com/baidu/hugegraph/unit/rest/RestResultTest.java
index 357c4a0..02832fd 100644
--- a/hugegraph-common/src/test/java/com/baidu/hugegraph/unit/rest/RestResultTest.java
+++ b/hugegraph-common/src/test/java/com/baidu/hugegraph/unit/rest/RestResultTest.java
@@ -21,10 +21,9 @@
 
 import java.util.Map;
 
-import javax.ws.rs.core.MultivaluedHashMap;
-import javax.ws.rs.core.MultivaluedMap;
-import javax.ws.rs.core.Response;
-
+import jakarta.ws.rs.core.MultivaluedHashMap;
+import jakarta.ws.rs.core.MultivaluedMap;
+import jakarta.ws.rs.core.Response;
 import org.glassfish.jersey.internal.util.collection.ImmutableMultivaluedMap;
 import org.junit.Test;
 import org.mockito.Mockito;
diff --git a/hugegraph-rpc/pom.xml b/hugegraph-rpc/pom.xml
index 07c2522..564e668 100644
--- a/hugegraph-rpc/pom.xml
+++ b/hugegraph-rpc/pom.xml
@@ -6,12 +6,12 @@
     <parent>
         <groupId>com.baidu.hugegraph</groupId>
         <artifactId>hugegraph-commons</artifactId>
-        <version>2.0.1</version>
+        <version>2.1.0</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
     <artifactId>hugegraph-rpc</artifactId>
-    <version>2.0.1</version>
+    <version>2.1.0</version>
 
     <name>hugegraph-rpc</name>
     <description>HugeGraph Database RPC component</description>
@@ -25,7 +25,7 @@
         <dependency>
             <groupId>com.baidu.hugegraph</groupId>
             <artifactId>hugegraph-common</artifactId>
-            <version>2.0.1</version>
+            <version>2.1.0</version>
         </dependency>
 
         <!-- sofa rpc -->
@@ -144,7 +144,7 @@
                         <manifestEntries>
                             <!-- Must be on one line, otherwise the automatic
                                  upgrade script cannot replace the version number -->
-                            <Implementation-Version>2.0.1.0</Implementation-Version>
+                            <Implementation-Version>2.1.0.0</Implementation-Version>
                         </manifestEntries>
                     </archive>
                 </configuration>
diff --git a/hugegraph-rpc/src/main/java/com/baidu/hugegraph/version/RpcVersion.java b/hugegraph-rpc/src/main/java/com/baidu/hugegraph/version/RpcVersion.java
index c9992cc..d64af44 100644
--- a/hugegraph-rpc/src/main/java/com/baidu/hugegraph/version/RpcVersion.java
+++ b/hugegraph-rpc/src/main/java/com/baidu/hugegraph/version/RpcVersion.java
@@ -27,5 +27,5 @@
 
     // The second parameter of Version.of() is for all-in-one JAR
     public static final Version VERSION = Version.of(RpcVersion.class,
-                                                     "2.0.1");
+                                                     "2.1.0");
 }
diff --git a/pom.xml b/pom.xml
index 9e3c345..f276f3f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
 
     <groupId>com.baidu.hugegraph</groupId>
     <artifactId>hugegraph-commons</artifactId>
-    <version>2.0.1</version>
+    <version>2.1.0</version>
     <packaging>pom</packaging>
 
     <name>hugegraph-commons</name>
@@ -59,19 +59,22 @@
         <compiler.target>1.8</compiler.target>
         <log4j2.version>2.17.0</log4j2.version>
         <commons.configuration.version>1.10</commons.configuration.version>
-        <commons.configuration2.version>2.1.1</commons.configuration2.version>
+        <commons.configuration2.version>2.3</commons.configuration2.version>
+        <commons.beanutils.version>1.9.4</commons.beanutils.version>
         <commons.collections.version>3.2.2</commons.collections.version>
         <commons.io.version>2.7</commons.io.version>
         <commons.codec.version>1.11</commons.codec.version>
         <guava.version>25.1-jre</guava.version>
         <javax.json.version>1.0</javax.json.version>
         <jsr305.version>3.0.1</jsr305.version>
-        <javassist.version>3.21.0-GA</javassist.version>
-        <jersey.version>2.22</jersey.version>
-        <jersey.hk2.version>2.27</jersey.hk2.version>
+        <javassist.version>3.28.0-GA</javassist.version>
+        <jersey.version>3.0.3</jersey.version>
+        <jersey.hk2.version>3.0.3</jersey.hk2.version>
         <jackson.version>2.12.1</jackson.version>
         <junit.version>4.12</junit.version>
-        <mockito.version>2.25.1</mockito.version>
+        <mockito.version>4.1.0</mockito.version>
+        <jakarta.xml.version>4.0.0-RC2</jakarta.xml.version>
+        <sun.xml.version>3.0.2</sun.xml.version>
     </properties>
 
     <modules>
@@ -135,7 +138,7 @@
                         <manifestEntries>
                             <!-- Must be on one line, otherwise the automatic
                                  upgrade script cannot replace the version number -->
-                            <Implementation-Version>2.0.1.0</Implementation-Version>
+                            <Implementation-Version>2.1.0.0</Implementation-Version>
                         </manifestEntries>
                     </archive>
                 </configuration>
@@ -144,7 +147,7 @@
             <plugin>
                 <groupId>org.jacoco</groupId>
                 <artifactId>jacoco-maven-plugin</artifactId>
-                <version>0.8.2</version>
+                <version>0.8.7</version>
                 <executions>
                     <execution>
                         <id>pre-unit-test</id>