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

visoar pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/bifromq.git


The following commit(s) were added to refs/heads/main by this push:
     new d71c1917 chores - renaming/simplify versioning mgmt/update 
assembly/etc (#149)
d71c1917 is described below

commit d71c19174e9a5337ac04177661df1a870b1c603f
Author: Yonny(Yu) Hao <[email protected]>
AuthorDate: Thu Jun 26 15:13:36 2025 +0800

    chores - renaming/simplify versioning mgmt/update assembly/etc (#149)
    
    * using revision property to simplify version management
    
    * 1. add license/notice/disclaimer to assembly
    2. rename module build-bifromq-starters -> build-bifromq-starter
---
 .gitattributes                                     |   6 +
 base-cluster/pom.xml                               |   2 +-
 base-crdt/base-crdt-service/pom.xml                |   2 +-
 base-crdt/base-crdt-store/pom.xml                  |   2 +-
 base-crdt/pom.xml                                  |   2 +-
 base-env/base-env-provider-spi/pom.xml             |   2 +-
 base-env/base-env-provider/pom.xml                 |   2 +-
 base-env/pom.xml                                   |   2 +-
 base-hlc/pom.xml                                   |   2 +-
 base-hookloader/pom.xml                            |   2 +-
 base-kv/base-kv-local-engine/pom.xml               |   2 +-
 base-kv/base-kv-meta-service/pom.xml               |   2 +-
 base-kv/base-kv-raft-type/pom.xml                  |   2 +-
 base-kv/base-kv-raft/pom.xml                       |   4 +-
 base-kv/base-kv-store-balance-controller/pom.xml   |   2 +-
 base-kv/base-kv-store-balance-spi/pom.xml          |   2 +-
 base-kv/base-kv-store-client/pom.xml               |   2 +-
 base-kv/base-kv-store-rpc-definition/pom.xml       |   2 +-
 base-kv/base-kv-store-server/pom.xml               |   2 +-
 base-kv/base-kv-type-proto/pom.xml                 |   2 +-
 base-kv/pom.xml                                    |   2 +-
 base-logger/pom.xml                                |   2 +-
 base-rpc/base-rpc-client/pom.xml                   |   2 +-
 base-rpc/base-rpc-common/pom.xml                   |   2 +-
 base-rpc/base-rpc-grpc-inproc/pom.xml              |   2 +-
 base-rpc/base-rpc-server/pom.xml                   |   2 +-
 base-rpc/base-rpc-traffic-governor/pom.xml         |   2 +-
 base-rpc/pom.xml                                   |   2 +-
 base-scheduler/pom.xml                             |   2 +-
 base-util/pom.xml                                  |   2 +-
 bifromq-apiserver/pom.xml                          |   2 +-
 bifromq-common-type/pom.xml                        |   2 +-
 bifromq-deliverer/pom.xml                          |   2 +-
 bifromq-dist/bifromq-dist-client/pom.xml           |   2 +-
 bifromq-dist/bifromq-dist-coproc-proto/pom.xml     |   2 +-
 bifromq-dist/bifromq-dist-rpc-definition/pom.xml   |   2 +-
 bifromq-dist/bifromq-dist-server/pom.xml           |   2 +-
 bifromq-dist/bifromq-dist-worker-schema/pom.xml    |   2 +-
 bifromq-dist/bifromq-dist-worker-spi/pom.xml       |   2 +-
 bifromq-dist/bifromq-dist-worker/pom.xml           |   2 +-
 bifromq-dist/pom.xml                               |   2 +-
 bifromq-inbox/bifromq-inbox-client/pom.xml         |   2 +-
 bifromq-inbox/bifromq-inbox-coproc-proto/pom.xml   |   2 +-
 bifromq-inbox/bifromq-inbox-rpc-definition/pom.xml |   2 +-
 bifromq-inbox/bifromq-inbox-server/pom.xml         |   2 +-
 bifromq-inbox/bifromq-inbox-store-schema/pom.xml   |   2 +-
 bifromq-inbox/bifromq-inbox-store-spi/pom.xml      |   2 +-
 bifromq-inbox/bifromq-inbox-store/pom.xml          |   2 +-
 bifromq-inbox/pom.xml                              |   2 +-
 bifromq-metrics/pom.xml                            |   2 +-
 bifromq-mqtt/bifromq-mqtt-broker-client/pom.xml    |   2 +-
 .../bifromq-mqtt-broker-rpc-definition/pom.xml     |   2 +-
 bifromq-mqtt/bifromq-mqtt-server/pom.xml           |   2 +-
 bifromq-mqtt/pom.xml                               |   2 +-
 bifromq-plugin/bifromq-plugin-archetype/pom.xml    |   2 +-
 .../bifromq-plugin-auth-provider-helper/pom.xml    |   2 +-
 .../bifromq-plugin-auth-provider/pom.xml           |   2 +-
 .../bifromq-plugin-client-balancer-helper/pom.xml  |   2 +-
 .../bifromq-plugin-client-balancer/pom.xml         |   2 +-
 bifromq-plugin/bifromq-plugin-context/pom.xml      |   2 +-
 .../bifromq-plugin-event-collector-helper/pom.xml  |   2 +-
 .../bifromq-plugin-event-collector/pom.xml         |   2 +-
 bifromq-plugin/bifromq-plugin-main/pom.xml         |   2 +-
 bifromq-plugin/bifromq-plugin-manager/pom.xml      |   2 +-
 .../pom.xml                                        |   2 +-
 .../bifromq-plugin-resource-throttler/pom.xml      |   2 +-
 .../bifromq-plugin-setting-provider-helper/pom.xml |   2 +-
 .../bifromq-plugin-setting-provider/pom.xml        |   2 +-
 .../bifromq-plugin-sub-broker-helper/pom.xml       |   2 +-
 bifromq-plugin/bifromq-plugin-sub-broker/pom.xml   |   2 +-
 bifromq-plugin/pom.xml                             |   2 +-
 bifromq-retain/bifromq-retain-client/pom.xml       |   2 +-
 bifromq-retain/bifromq-retain-coproc-proto/pom.xml |   2 +-
 bifromq-retain/bifromq-retain-gc/pom.xml           |   2 +-
 .../bifromq-retain-rpc-definition/pom.xml          |   2 +-
 bifromq-retain/bifromq-retain-server/pom.xml       |   2 +-
 bifromq-retain/bifromq-retain-store-schema/pom.xml |   2 +-
 bifromq-retain/bifromq-retain-store-spi/pom.xml    |   2 +-
 bifromq-retain/bifromq-retain-store/pom.xml        |   2 +-
 bifromq-retain/pom.xml                             |   2 +-
 .../bifromq-session-dict-client/pom.xml            |   2 +-
 .../bifromq-session-dict-rpc-definition/pom.xml    |   2 +-
 .../bifromq-session-dict-server/pom.xml            |   2 +-
 bifromq-session-dict/pom.xml                       |   2 +-
 bifromq-sysprops/pom.xml                           |   2 +-
 bifromq-util/pom.xml                               |   2 +-
 .../assembly/assembly-windows.xml}                 |  12 ++
 .../assembly/assembly.xml}                         |  12 ++
 .../bin/bifromq-start.bat                          |   0
 .../bin/bifromq-start.sh                           |   0
 .../bin/bifromq-stop.bat                           |   0
 .../bin/bifromq-stop.sh                            |   0
 .../bin/pid.bat                                    |   0
 .../bin/standalone.bat                             |   0
 .../bin/standalone.sh                              |   0
 .../conf/log4j2.xml                                |   0
 .../conf/standalone.yml                            |   0
 .../plugins/README.md                              |   0
 .../pom.xml                                        |  40 +++--
 .../bifromq/starter/ServiceBootstrapper.java       |  10 +-
 .../apache/bifromq/starter/StandaloneStarter.java  | 186 ++++++++++-----------
 .../bifromq/starter/config/StandaloneConfig.java   |   8 +-
 .../config/StandaloneConfigConsolidator.java       |  12 +-
 .../starter/config/model/BalancerOptions.java      |   0
 .../starter/config/model/ClusterConfig.java        |   0
 .../starter/config/model/ExecutorConfig.java       |   0
 .../starter/config/model/InMemEngineConfig.java    |   0
 .../bifromq/starter/config/model/RPCConfig.java    |   0
 .../starter/config/model/RocksDBEngineConfig.java  |   2 +-
 .../starter/config/model/SSLContextConfig.java     |   0
 .../config/model/ServerSSLContextConfig.java       |   0
 .../starter/config/model/StorageEngineConfig.java  |   0
 .../starter/config/model/api/APIServerConfig.java  |   2 +-
 .../config/model/dict/SessionDictClientConfig.java |   0
 .../config/model/dict/SessionDictServerConfig.java |   0
 .../model/dict/SessionDictServiceConfig.java       |   0
 .../config/model/dist/DistClientConfig.java        |   0
 .../config/model/dist/DistServerConfig.java        |   0
 .../config/model/dist/DistServiceConfig.java       |   0
 .../config/model/dist/DistWorkerClientConfig.java  |   0
 .../config/model/dist/DistWorkerConfig.java        |   0
 .../config/model/inbox/InboxClientConfig.java      |   0
 .../config/model/inbox/InboxServerConfig.java      |   0
 .../config/model/inbox/InboxServiceConfig.java     |   0
 .../config/model/inbox/InboxStoreClientConfig.java |   0
 .../config/model/inbox/InboxStoreConfig.java       |   0
 .../config/model/mqtt/MQTTBrokerClientConfig.java  |   0
 .../config/model/mqtt/MQTTServerConfig.java        |   8 +-
 .../config/model/mqtt/MQTTServiceConfig.java       |   0
 .../model/mqtt/listener/TCPListenerConfig.java     |   0
 .../model/mqtt/listener/TLSListenerConfig.java     |   2 +-
 .../model/mqtt/listener/WSListenerConfig.java      |   0
 .../model/mqtt/listener/WSSListenerConfig.java     |   2 +-
 .../config/model/retain/RetainClientConfig.java    |   0
 .../config/model/retain/RetainServerConfig.java    |   0
 .../config/model/retain/RetainServiceConfig.java   |   0
 .../model/retain/RetainStoreClientConfig.java      |   0
 .../config/model/retain/RetainStoreConfig.java     |   0
 .../metrics/netty/PooledByteBufAllocator.java      |   0
 .../netty/PooledByteBufAllocatorMetric.java        |   2 +-
 .../bifromq/starter/module/APIServerModule.java    |  10 +-
 .../bifromq/starter/module/ConfigModule.java       |   2 +-
 .../bifromq/starter/module/CoreServiceModule.java  |  14 +-
 .../bifromq/starter/module/DistServiceModule.java  |  20 +--
 .../bifromq/starter/module/EngineConfUtil.java     |   4 +-
 .../bifromq/starter/module/ExecutorsModule.java    |   6 +-
 .../bifromq/starter/module/InboxServiceModule.java |  16 +-
 .../bifromq/starter/module/MQTTServiceModule.java  |  18 +-
 .../bifromq/starter/module/PluginModule.java       |  12 +-
 .../starter/module/RPCClientSSLContextModule.java  |   4 +-
 .../starter/module/RPCServerBuilderModule.java     |  10 +-
 .../starter/module/RetainServiceModule.java        |  20 +--
 .../org/apache/bifromq/starter/module/SSLUtil.java |   2 +-
 .../bifromq/starter/module/ServiceInjector.java    |   0
 .../starter/module/ServiceInjectorModule.java      |   0
 .../starter/module/SessionDictServiceModule.java   |   6 +-
 .../starter/module/SharedResourceProvider.java     |   0
 .../starter/module/SharedResourcesHolder.java      |   0
 .../bifromq/starter/utils/ClusterDomainUtil.java   |   0
 .../bifromq/starter/utils/ConfigFileUtil.java      |   0
 .../apache/bifromq/starter/utils/ResourceUtil.java |   0
 .../src/main/resources/log4j2.xml                  |   0
 .../starter/utils/ClusterDomainUtilTest.java       |   0
 .../bifromq/starter/utils/ResourceUtilTest.java    |   0
 .../src/test/resources/log4j2-test.xml             |   0
 .../src/test/resources/testResource.txt            |   0
 build/build-plugin-demo/pom.xml                    |   2 +-
 build/pom.xml                                      |   4 +-
 coverage-report/pom.xml                            |   2 +-
 pom.xml                                            |   8 +-
 release/release.sh                                 | 131 +++++++++++++++
 testsuites/pom.xml                                 |   2 +-
 172 files changed, 474 insertions(+), 295 deletions(-)

diff --git a/.gitattributes b/.gitattributes
index 8e948c53..6c38a71e 100755
--- a/.gitattributes
+++ b/.gitattributes
@@ -1 +1,7 @@
 * text=auto !eol
+.asf.yaml           export-ignore
+.github/            export-ignore
+.gitattributes      export-ignore
+.gitignore          export-ignore
+.licenserc.yaml     export-ignore
+lombok.config       export-ignore
diff --git a/base-cluster/pom.xml b/base-cluster/pom.xml
index d8bd01ab..34c97841 100644
--- a/base-cluster/pom.xml
+++ b/base-cluster/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>bifromq-parent</artifactId>
         <groupId>org.apache.bifromq</groupId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>base-cluster</artifactId>
diff --git a/base-crdt/base-crdt-service/pom.xml 
b/base-crdt/base-crdt-service/pom.xml
index 99e8dae3..f0b2351a 100644
--- a/base-crdt/base-crdt-service/pom.xml
+++ b/base-crdt/base-crdt-service/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>base-crdt</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/base-crdt/base-crdt-store/pom.xml 
b/base-crdt/base-crdt-store/pom.xml
index 2a928215..3e334005 100644
--- a/base-crdt/base-crdt-store/pom.xml
+++ b/base-crdt/base-crdt-store/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>base-crdt</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>base-crdt-store</artifactId>
diff --git a/base-crdt/pom.xml b/base-crdt/pom.xml
index 0c80e228..646b3aa5 100644
--- a/base-crdt/pom.xml
+++ b/base-crdt/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-parent</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <packaging>pom</packaging>
 
diff --git a/base-env/base-env-provider-spi/pom.xml 
b/base-env/base-env-provider-spi/pom.xml
index f6300ffb..7191a903 100644
--- a/base-env/base-env-provider-spi/pom.xml
+++ b/base-env/base-env-provider-spi/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>base-env</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>base-env-provider-spi</artifactId>
diff --git a/base-env/base-env-provider/pom.xml 
b/base-env/base-env-provider/pom.xml
index f3665f19..57f09c0b 100644
--- a/base-env/base-env-provider/pom.xml
+++ b/base-env/base-env-provider/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>base-env</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>base-env-provider</artifactId>
diff --git a/base-env/pom.xml b/base-env/pom.xml
index 1676eff8..81f51df4 100644
--- a/base-env/pom.xml
+++ b/base-env/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-parent</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <packaging>pom</packaging>
diff --git a/base-hlc/pom.xml b/base-hlc/pom.xml
index 4795135c..2726761d 100644
--- a/base-hlc/pom.xml
+++ b/base-hlc/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-parent</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>base-hlc</artifactId>
diff --git a/base-hookloader/pom.xml b/base-hookloader/pom.xml
index 2a42489c..673b3e11 100644
--- a/base-hookloader/pom.xml
+++ b/base-hookloader/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-parent</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>base-hookloader</artifactId>
diff --git a/base-kv/base-kv-local-engine/pom.xml 
b/base-kv/base-kv-local-engine/pom.xml
index 1f3a1d69..398e6036 100644
--- a/base-kv/base-kv-local-engine/pom.xml
+++ b/base-kv/base-kv-local-engine/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>base-kv</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>base-kv-local-engine</artifactId>
diff --git a/base-kv/base-kv-meta-service/pom.xml 
b/base-kv/base-kv-meta-service/pom.xml
index 29520075..ef5a964f 100644
--- a/base-kv/base-kv-meta-service/pom.xml
+++ b/base-kv/base-kv-meta-service/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>base-kv</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>base-kv-meta-service</artifactId>
diff --git a/base-kv/base-kv-raft-type/pom.xml 
b/base-kv/base-kv-raft-type/pom.xml
index a142bf53..50695776 100644
--- a/base-kv/base-kv-raft-type/pom.xml
+++ b/base-kv/base-kv-raft-type/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>base-kv</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>base-kv-raft-type</artifactId>
diff --git a/base-kv/base-kv-raft/pom.xml b/base-kv/base-kv-raft/pom.xml
index 2fee9935..7a308e9c 100644
--- a/base-kv/base-kv-raft/pom.xml
+++ b/base-kv/base-kv-raft/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>base-kv</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>base-kv-raft</artifactId>
@@ -54,7 +54,7 @@
         <dependency>
             <groupId>org.testng</groupId>
             <artifactId>testng</artifactId>
-            <scope>compile</scope>
+            <scope>provided</scope>
         </dependency>
         <!--for testing-->
         <dependency>
diff --git a/base-kv/base-kv-store-balance-controller/pom.xml 
b/base-kv/base-kv-store-balance-controller/pom.xml
index 8e1834c6..f89a83f9 100644
--- a/base-kv/base-kv-store-balance-controller/pom.xml
+++ b/base-kv/base-kv-store-balance-controller/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>base-kv</artifactId>
         <groupId>org.apache.bifromq</groupId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/base-kv/base-kv-store-balance-spi/pom.xml 
b/base-kv/base-kv-store-balance-spi/pom.xml
index 64f18811..904d3111 100644
--- a/base-kv/base-kv-store-balance-spi/pom.xml
+++ b/base-kv/base-kv-store-balance-spi/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>base-kv</artifactId>
         <groupId>org.apache.bifromq</groupId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/base-kv/base-kv-store-client/pom.xml 
b/base-kv/base-kv-store-client/pom.xml
index eaad3005..1b26bb93 100644
--- a/base-kv/base-kv-store-client/pom.xml
+++ b/base-kv/base-kv-store-client/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>base-kv</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>base-kv-store-client</artifactId>
diff --git a/base-kv/base-kv-store-rpc-definition/pom.xml 
b/base-kv/base-kv-store-rpc-definition/pom.xml
index 11168a72..8232dc96 100644
--- a/base-kv/base-kv-store-rpc-definition/pom.xml
+++ b/base-kv/base-kv-store-rpc-definition/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>base-kv</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>base-kv-store-rpc-definition</artifactId>
diff --git a/base-kv/base-kv-store-server/pom.xml 
b/base-kv/base-kv-store-server/pom.xml
index 704f6a5c..5514a7e4 100644
--- a/base-kv/base-kv-store-server/pom.xml
+++ b/base-kv/base-kv-store-server/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>base-kv</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>base-kv-store-server</artifactId>
diff --git a/base-kv/base-kv-type-proto/pom.xml 
b/base-kv/base-kv-type-proto/pom.xml
index 2f5f23ae..9740b079 100644
--- a/base-kv/base-kv-type-proto/pom.xml
+++ b/base-kv/base-kv-type-proto/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>base-kv</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>base-kv-type-proto</artifactId>
diff --git a/base-kv/pom.xml b/base-kv/pom.xml
index f9ca2ccb..fdcf2baa 100644
--- a/base-kv/pom.xml
+++ b/base-kv/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <artifactId>bifromq-parent</artifactId>
         <groupId>org.apache.bifromq</groupId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <packaging>pom</packaging>
 
diff --git a/base-logger/pom.xml b/base-logger/pom.xml
index 11b0f1e0..ba647b98 100644
--- a/base-logger/pom.xml
+++ b/base-logger/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-parent</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>base-logger</artifactId>
diff --git a/base-rpc/base-rpc-client/pom.xml b/base-rpc/base-rpc-client/pom.xml
index f30b4ddc..4df9a0ab 100644
--- a/base-rpc/base-rpc-client/pom.xml
+++ b/base-rpc/base-rpc-client/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>base-rpc</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>base-rpc-client</artifactId>
diff --git a/base-rpc/base-rpc-common/pom.xml b/base-rpc/base-rpc-common/pom.xml
index b5b39c48..b6f3171b 100644
--- a/base-rpc/base-rpc-common/pom.xml
+++ b/base-rpc/base-rpc-common/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>base-rpc</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>base-rpc-common</artifactId>
diff --git a/base-rpc/base-rpc-grpc-inproc/pom.xml 
b/base-rpc/base-rpc-grpc-inproc/pom.xml
index 4d363ddd..30fc7c78 100644
--- a/base-rpc/base-rpc-grpc-inproc/pom.xml
+++ b/base-rpc/base-rpc-grpc-inproc/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>base-rpc</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>base-rpc-grpc-inproc</artifactId>
diff --git a/base-rpc/base-rpc-server/pom.xml b/base-rpc/base-rpc-server/pom.xml
index 87641854..59604a6e 100644
--- a/base-rpc/base-rpc-server/pom.xml
+++ b/base-rpc/base-rpc-server/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>base-rpc</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>base-rpc-server</artifactId>
diff --git a/base-rpc/base-rpc-traffic-governor/pom.xml 
b/base-rpc/base-rpc-traffic-governor/pom.xml
index a2f90d1f..7e3e47a0 100644
--- a/base-rpc/base-rpc-traffic-governor/pom.xml
+++ b/base-rpc/base-rpc-traffic-governor/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>base-rpc</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>base-rpc-traffic-governor</artifactId>
diff --git a/base-rpc/pom.xml b/base-rpc/pom.xml
index 41c2e1a4..43e0fb45 100644
--- a/base-rpc/pom.xml
+++ b/base-rpc/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <artifactId>bifromq-parent</artifactId>
         <groupId>org.apache.bifromq</groupId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <packaging>pom</packaging>
diff --git a/base-scheduler/pom.xml b/base-scheduler/pom.xml
index 611815c6..81c1e6bb 100644
--- a/base-scheduler/pom.xml
+++ b/base-scheduler/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>bifromq-parent</artifactId>
         <groupId>org.apache.bifromq</groupId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/base-util/pom.xml b/base-util/pom.xml
index 66f70b0a..ca88f6c8 100644
--- a/base-util/pom.xml
+++ b/base-util/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-parent</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>base-util</artifactId>
diff --git a/bifromq-apiserver/pom.xml b/bifromq-apiserver/pom.xml
index b2a7ed43..dbe1e834 100644
--- a/bifromq-apiserver/pom.xml
+++ b/bifromq-apiserver/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-parent</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-apiserver</artifactId>
diff --git a/bifromq-common-type/pom.xml b/bifromq-common-type/pom.xml
index 6b0f4f57..739926d5 100644
--- a/bifromq-common-type/pom.xml
+++ b/bifromq-common-type/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>bifromq-parent</artifactId>
         <groupId>org.apache.bifromq</groupId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/bifromq-deliverer/pom.xml b/bifromq-deliverer/pom.xml
index 82827170..2a0a7e7f 100644
--- a/bifromq-deliverer/pom.xml
+++ b/bifromq-deliverer/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-parent</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-deliverer</artifactId>
diff --git a/bifromq-dist/bifromq-dist-client/pom.xml 
b/bifromq-dist/bifromq-dist-client/pom.xml
index f86382ef..d73d2efa 100644
--- a/bifromq-dist/bifromq-dist-client/pom.xml
+++ b/bifromq-dist/bifromq-dist-client/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-dist</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-dist-client</artifactId>
diff --git a/bifromq-dist/bifromq-dist-coproc-proto/pom.xml 
b/bifromq-dist/bifromq-dist-coproc-proto/pom.xml
index 3de38183..6c0ecc7b 100644
--- a/bifromq-dist/bifromq-dist-coproc-proto/pom.xml
+++ b/bifromq-dist/bifromq-dist-coproc-proto/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-dist</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-dist-coproc-proto</artifactId>
diff --git a/bifromq-dist/bifromq-dist-rpc-definition/pom.xml 
b/bifromq-dist/bifromq-dist-rpc-definition/pom.xml
index 5b2a2d5f..4b393907 100644
--- a/bifromq-dist/bifromq-dist-rpc-definition/pom.xml
+++ b/bifromq-dist/bifromq-dist-rpc-definition/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-dist</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/bifromq-dist/bifromq-dist-server/pom.xml 
b/bifromq-dist/bifromq-dist-server/pom.xml
index 04efb124..30f7cc45 100644
--- a/bifromq-dist/bifromq-dist-server/pom.xml
+++ b/bifromq-dist/bifromq-dist-server/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-dist</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-dist-server</artifactId>
diff --git a/bifromq-dist/bifromq-dist-worker-schema/pom.xml 
b/bifromq-dist/bifromq-dist-worker-schema/pom.xml
index d3146717..1c2cf307 100644
--- a/bifromq-dist/bifromq-dist-worker-schema/pom.xml
+++ b/bifromq-dist/bifromq-dist-worker-schema/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-dist</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-dist-worker-schema</artifactId>
diff --git a/bifromq-dist/bifromq-dist-worker-spi/pom.xml 
b/bifromq-dist/bifromq-dist-worker-spi/pom.xml
index e865dfc7..83c4aab4 100644
--- a/bifromq-dist/bifromq-dist-worker-spi/pom.xml
+++ b/bifromq-dist/bifromq-dist-worker-spi/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-dist</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-dist-worker-spi</artifactId>
diff --git a/bifromq-dist/bifromq-dist-worker/pom.xml 
b/bifromq-dist/bifromq-dist-worker/pom.xml
index 9de7e6e9..c4b4e503 100644
--- a/bifromq-dist/bifromq-dist-worker/pom.xml
+++ b/bifromq-dist/bifromq-dist-worker/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-dist</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-dist-worker</artifactId>
diff --git a/bifromq-dist/pom.xml b/bifromq-dist/pom.xml
index 9f3025ac..25d0f70d 100644
--- a/bifromq-dist/pom.xml
+++ b/bifromq-dist/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>bifromq-parent</artifactId>
         <groupId>org.apache.bifromq</groupId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <packaging>pom</packaging>
diff --git a/bifromq-inbox/bifromq-inbox-client/pom.xml 
b/bifromq-inbox/bifromq-inbox-client/pom.xml
index 02edbb83..f74bba0f 100644
--- a/bifromq-inbox/bifromq-inbox-client/pom.xml
+++ b/bifromq-inbox/bifromq-inbox-client/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-inbox</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-inbox-client</artifactId>
diff --git a/bifromq-inbox/bifromq-inbox-coproc-proto/pom.xml 
b/bifromq-inbox/bifromq-inbox-coproc-proto/pom.xml
index dcf26f83..0864ffe8 100644
--- a/bifromq-inbox/bifromq-inbox-coproc-proto/pom.xml
+++ b/bifromq-inbox/bifromq-inbox-coproc-proto/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-inbox</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-inbox-coproc-proto</artifactId>
diff --git a/bifromq-inbox/bifromq-inbox-rpc-definition/pom.xml 
b/bifromq-inbox/bifromq-inbox-rpc-definition/pom.xml
index 9cb394af..fdbe7d6c 100644
--- a/bifromq-inbox/bifromq-inbox-rpc-definition/pom.xml
+++ b/bifromq-inbox/bifromq-inbox-rpc-definition/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-inbox</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-inbox-rpc-definition</artifactId>
diff --git a/bifromq-inbox/bifromq-inbox-server/pom.xml 
b/bifromq-inbox/bifromq-inbox-server/pom.xml
index 09980cfa..882126f8 100644
--- a/bifromq-inbox/bifromq-inbox-server/pom.xml
+++ b/bifromq-inbox/bifromq-inbox-server/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-inbox</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/bifromq-inbox/bifromq-inbox-store-schema/pom.xml 
b/bifromq-inbox/bifromq-inbox-store-schema/pom.xml
index bcdf22fc..84122b1a 100644
--- a/bifromq-inbox/bifromq-inbox-store-schema/pom.xml
+++ b/bifromq-inbox/bifromq-inbox-store-schema/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-inbox</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-inbox-store-schema</artifactId>
diff --git a/bifromq-inbox/bifromq-inbox-store-spi/pom.xml 
b/bifromq-inbox/bifromq-inbox-store-spi/pom.xml
index aadda17d..dcfd5b79 100644
--- a/bifromq-inbox/bifromq-inbox-store-spi/pom.xml
+++ b/bifromq-inbox/bifromq-inbox-store-spi/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-inbox</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-inbox-store-spi</artifactId>
diff --git a/bifromq-inbox/bifromq-inbox-store/pom.xml 
b/bifromq-inbox/bifromq-inbox-store/pom.xml
index 6729019b..9addf2e5 100644
--- a/bifromq-inbox/bifromq-inbox-store/pom.xml
+++ b/bifromq-inbox/bifromq-inbox-store/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-inbox</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-inbox-store</artifactId>
diff --git a/bifromq-inbox/pom.xml b/bifromq-inbox/pom.xml
index eef98551..3cb04bc6 100644
--- a/bifromq-inbox/pom.xml
+++ b/bifromq-inbox/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <artifactId>bifromq-parent</artifactId>
         <groupId>org.apache.bifromq</groupId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <packaging>pom</packaging>
 
diff --git a/bifromq-metrics/pom.xml b/bifromq-metrics/pom.xml
index ace1026c..86462c26 100644
--- a/bifromq-metrics/pom.xml
+++ b/bifromq-metrics/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>bifromq-parent</artifactId>
         <groupId>org.apache.bifromq</groupId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/bifromq-mqtt/bifromq-mqtt-broker-client/pom.xml 
b/bifromq-mqtt/bifromq-mqtt-broker-client/pom.xml
index 9f286edc..e3164931 100644
--- a/bifromq-mqtt/bifromq-mqtt-broker-client/pom.xml
+++ b/bifromq-mqtt/bifromq-mqtt-broker-client/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-mqtt</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-mqtt-broker-client</artifactId>
diff --git a/bifromq-mqtt/bifromq-mqtt-broker-rpc-definition/pom.xml 
b/bifromq-mqtt/bifromq-mqtt-broker-rpc-definition/pom.xml
index d6b1f945..678c780e 100644
--- a/bifromq-mqtt/bifromq-mqtt-broker-rpc-definition/pom.xml
+++ b/bifromq-mqtt/bifromq-mqtt-broker-rpc-definition/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-mqtt</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-mqtt-broker-rpc-definition</artifactId>
diff --git a/bifromq-mqtt/bifromq-mqtt-server/pom.xml 
b/bifromq-mqtt/bifromq-mqtt-server/pom.xml
index 062f64f0..595f9260 100644
--- a/bifromq-mqtt/bifromq-mqtt-server/pom.xml
+++ b/bifromq-mqtt/bifromq-mqtt-server/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-mqtt</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-mqtt-server</artifactId>
diff --git a/bifromq-mqtt/pom.xml b/bifromq-mqtt/pom.xml
index d48cd388..07743ac5 100644
--- a/bifromq-mqtt/pom.xml
+++ b/bifromq-mqtt/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>bifromq-parent</artifactId>
         <groupId>org.apache.bifromq</groupId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <packaging>pom</packaging>
diff --git a/bifromq-plugin/bifromq-plugin-archetype/pom.xml 
b/bifromq-plugin/bifromq-plugin-archetype/pom.xml
index e1b60623..57cb253b 100644
--- a/bifromq-plugin/bifromq-plugin-archetype/pom.xml
+++ b/bifromq-plugin/bifromq-plugin-archetype/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-plugin</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <packaging>maven-archetype</packaging>
diff --git a/bifromq-plugin/bifromq-plugin-auth-provider-helper/pom.xml 
b/bifromq-plugin/bifromq-plugin-auth-provider-helper/pom.xml
index c71c9d28..fc714c5c 100644
--- a/bifromq-plugin/bifromq-plugin-auth-provider-helper/pom.xml
+++ b/bifromq-plugin/bifromq-plugin-auth-provider-helper/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-plugin</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/bifromq-plugin/bifromq-plugin-auth-provider/pom.xml 
b/bifromq-plugin/bifromq-plugin-auth-provider/pom.xml
index 8a5c97dc..b5f2918e 100644
--- a/bifromq-plugin/bifromq-plugin-auth-provider/pom.xml
+++ b/bifromq-plugin/bifromq-plugin-auth-provider/pom.xml
@@ -26,7 +26,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-plugin</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-plugin-auth-provider</artifactId>
diff --git a/bifromq-plugin/bifromq-plugin-client-balancer-helper/pom.xml 
b/bifromq-plugin/bifromq-plugin-client-balancer-helper/pom.xml
index 5958fddd..9e81c482 100644
--- a/bifromq-plugin/bifromq-plugin-client-balancer-helper/pom.xml
+++ b/bifromq-plugin/bifromq-plugin-client-balancer-helper/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-plugin</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-plugin-client-balancer-helper</artifactId>
diff --git a/bifromq-plugin/bifromq-plugin-client-balancer/pom.xml 
b/bifromq-plugin/bifromq-plugin-client-balancer/pom.xml
index 854c108a..7225d656 100644
--- a/bifromq-plugin/bifromq-plugin-client-balancer/pom.xml
+++ b/bifromq-plugin/bifromq-plugin-client-balancer/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-plugin</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-plugin-client-balancer</artifactId>
diff --git a/bifromq-plugin/bifromq-plugin-context/pom.xml 
b/bifromq-plugin/bifromq-plugin-context/pom.xml
index ef1246df..1f2da87f 100644
--- a/bifromq-plugin/bifromq-plugin-context/pom.xml
+++ b/bifromq-plugin/bifromq-plugin-context/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-plugin</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-plugin-context</artifactId>
diff --git a/bifromq-plugin/bifromq-plugin-event-collector-helper/pom.xml 
b/bifromq-plugin/bifromq-plugin-event-collector-helper/pom.xml
index 021d959b..77567069 100644
--- a/bifromq-plugin/bifromq-plugin-event-collector-helper/pom.xml
+++ b/bifromq-plugin/bifromq-plugin-event-collector-helper/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-plugin</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/bifromq-plugin/bifromq-plugin-event-collector/pom.xml 
b/bifromq-plugin/bifromq-plugin-event-collector/pom.xml
index 66c42c8f..141616ab 100644
--- a/bifromq-plugin/bifromq-plugin-event-collector/pom.xml
+++ b/bifromq-plugin/bifromq-plugin-event-collector/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-plugin</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/bifromq-plugin/bifromq-plugin-main/pom.xml 
b/bifromq-plugin/bifromq-plugin-main/pom.xml
index 46b8a702..2d0480c0 100644
--- a/bifromq-plugin/bifromq-plugin-main/pom.xml
+++ b/bifromq-plugin/bifromq-plugin-main/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-plugin</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-plugin-main</artifactId>
diff --git a/bifromq-plugin/bifromq-plugin-manager/pom.xml 
b/bifromq-plugin/bifromq-plugin-manager/pom.xml
index 4ede5b47..af583322 100644
--- a/bifromq-plugin/bifromq-plugin-manager/pom.xml
+++ b/bifromq-plugin/bifromq-plugin-manager/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>bifromq-plugin</artifactId>
         <groupId>org.apache.bifromq</groupId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/bifromq-plugin/bifromq-plugin-resource-throttler-helper/pom.xml 
b/bifromq-plugin/bifromq-plugin-resource-throttler-helper/pom.xml
index e907fe85..3fd29c5e 100644
--- a/bifromq-plugin/bifromq-plugin-resource-throttler-helper/pom.xml
+++ b/bifromq-plugin/bifromq-plugin-resource-throttler-helper/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-plugin</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-plugin-resource-throttler-helper</artifactId>
diff --git a/bifromq-plugin/bifromq-plugin-resource-throttler/pom.xml 
b/bifromq-plugin/bifromq-plugin-resource-throttler/pom.xml
index 56a509c2..d3f070d2 100644
--- a/bifromq-plugin/bifromq-plugin-resource-throttler/pom.xml
+++ b/bifromq-plugin/bifromq-plugin-resource-throttler/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-plugin</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-plugin-resource-throttler</artifactId>
diff --git a/bifromq-plugin/bifromq-plugin-setting-provider-helper/pom.xml 
b/bifromq-plugin/bifromq-plugin-setting-provider-helper/pom.xml
index 61d2e0b5..85ad119e 100644
--- a/bifromq-plugin/bifromq-plugin-setting-provider-helper/pom.xml
+++ b/bifromq-plugin/bifromq-plugin-setting-provider-helper/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-plugin</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/bifromq-plugin/bifromq-plugin-setting-provider/pom.xml 
b/bifromq-plugin/bifromq-plugin-setting-provider/pom.xml
index 8c0c36e0..022333ac 100644
--- a/bifromq-plugin/bifromq-plugin-setting-provider/pom.xml
+++ b/bifromq-plugin/bifromq-plugin-setting-provider/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-plugin</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-plugin-setting-provider</artifactId>
diff --git a/bifromq-plugin/bifromq-plugin-sub-broker-helper/pom.xml 
b/bifromq-plugin/bifromq-plugin-sub-broker-helper/pom.xml
index 543802bf..00ed4eef 100644
--- a/bifromq-plugin/bifromq-plugin-sub-broker-helper/pom.xml
+++ b/bifromq-plugin/bifromq-plugin-sub-broker-helper/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-plugin</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/bifromq-plugin/bifromq-plugin-sub-broker/pom.xml 
b/bifromq-plugin/bifromq-plugin-sub-broker/pom.xml
index 38512cd6..68bdc2ab 100644
--- a/bifromq-plugin/bifromq-plugin-sub-broker/pom.xml
+++ b/bifromq-plugin/bifromq-plugin-sub-broker/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-plugin</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/bifromq-plugin/pom.xml b/bifromq-plugin/pom.xml
index 24f4204e..9f0e604d 100644
--- a/bifromq-plugin/pom.xml
+++ b/bifromq-plugin/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>bifromq-parent</artifactId>
         <groupId>org.apache.bifromq</groupId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <packaging>pom</packaging>
diff --git a/bifromq-retain/bifromq-retain-client/pom.xml 
b/bifromq-retain/bifromq-retain-client/pom.xml
index ab437864..4a87977e 100644
--- a/bifromq-retain/bifromq-retain-client/pom.xml
+++ b/bifromq-retain/bifromq-retain-client/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-retain</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-retain-client</artifactId>
diff --git a/bifromq-retain/bifromq-retain-coproc-proto/pom.xml 
b/bifromq-retain/bifromq-retain-coproc-proto/pom.xml
index 7469fa1e..f0f8cbbc 100644
--- a/bifromq-retain/bifromq-retain-coproc-proto/pom.xml
+++ b/bifromq-retain/bifromq-retain-coproc-proto/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-retain</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-retain-coproc-proto</artifactId>
diff --git a/bifromq-retain/bifromq-retain-gc/pom.xml 
b/bifromq-retain/bifromq-retain-gc/pom.xml
index b9ec9df8..ed57dacd 100644
--- a/bifromq-retain/bifromq-retain-gc/pom.xml
+++ b/bifromq-retain/bifromq-retain-gc/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-retain</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-retain-gc</artifactId>
diff --git a/bifromq-retain/bifromq-retain-rpc-definition/pom.xml 
b/bifromq-retain/bifromq-retain-rpc-definition/pom.xml
index c706467d..249c58e0 100644
--- a/bifromq-retain/bifromq-retain-rpc-definition/pom.xml
+++ b/bifromq-retain/bifromq-retain-rpc-definition/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-retain</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-retain-rpc-definition</artifactId>
diff --git a/bifromq-retain/bifromq-retain-server/pom.xml 
b/bifromq-retain/bifromq-retain-server/pom.xml
index 3bf9cf1b..f75e8079 100644
--- a/bifromq-retain/bifromq-retain-server/pom.xml
+++ b/bifromq-retain/bifromq-retain-server/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-retain</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-retain-server</artifactId>
diff --git a/bifromq-retain/bifromq-retain-store-schema/pom.xml 
b/bifromq-retain/bifromq-retain-store-schema/pom.xml
index e6b638c3..07b059a8 100644
--- a/bifromq-retain/bifromq-retain-store-schema/pom.xml
+++ b/bifromq-retain/bifromq-retain-store-schema/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-retain</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-retain-store-schema</artifactId>
diff --git a/bifromq-retain/bifromq-retain-store-spi/pom.xml 
b/bifromq-retain/bifromq-retain-store-spi/pom.xml
index 731ae8db..ca81c4bb 100644
--- a/bifromq-retain/bifromq-retain-store-spi/pom.xml
+++ b/bifromq-retain/bifromq-retain-store-spi/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-retain</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-retain-store-spi</artifactId>
diff --git a/bifromq-retain/bifromq-retain-store/pom.xml 
b/bifromq-retain/bifromq-retain-store/pom.xml
index 3d6d0107..f0ea8cdb 100644
--- a/bifromq-retain/bifromq-retain-store/pom.xml
+++ b/bifromq-retain/bifromq-retain-store/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-retain</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-retain-store</artifactId>
diff --git a/bifromq-retain/pom.xml b/bifromq-retain/pom.xml
index 55f35735..bba6db75 100644
--- a/bifromq-retain/pom.xml
+++ b/bifromq-retain/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>bifromq-parent</artifactId>
         <groupId>org.apache.bifromq</groupId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <packaging>pom</packaging>
diff --git a/bifromq-session-dict/bifromq-session-dict-client/pom.xml 
b/bifromq-session-dict/bifromq-session-dict-client/pom.xml
index dc804203..1b4a6219 100644
--- a/bifromq-session-dict/bifromq-session-dict-client/pom.xml
+++ b/bifromq-session-dict/bifromq-session-dict-client/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-session-dict</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-session-dict-client</artifactId>
diff --git a/bifromq-session-dict/bifromq-session-dict-rpc-definition/pom.xml 
b/bifromq-session-dict/bifromq-session-dict-rpc-definition/pom.xml
index aef91a2e..9da1c114 100644
--- a/bifromq-session-dict/bifromq-session-dict-rpc-definition/pom.xml
+++ b/bifromq-session-dict/bifromq-session-dict-rpc-definition/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-session-dict</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-session-dict-rpc-definition</artifactId>
diff --git a/bifromq-session-dict/bifromq-session-dict-server/pom.xml 
b/bifromq-session-dict/bifromq-session-dict-server/pom.xml
index 036d065e..88347643 100644
--- a/bifromq-session-dict/bifromq-session-dict-server/pom.xml
+++ b/bifromq-session-dict/bifromq-session-dict-server/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-session-dict</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-session-dict-server</artifactId>
diff --git a/bifromq-session-dict/pom.xml b/bifromq-session-dict/pom.xml
index 5e362240..413c328f 100644
--- a/bifromq-session-dict/pom.xml
+++ b/bifromq-session-dict/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-parent</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <packaging>pom</packaging>
diff --git a/bifromq-sysprops/pom.xml b/bifromq-sysprops/pom.xml
index 087f3c02..6d30623b 100644
--- a/bifromq-sysprops/pom.xml
+++ b/bifromq-sysprops/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-parent</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-sysprops</artifactId>
diff --git a/bifromq-util/pom.xml b/bifromq-util/pom.xml
index 683b1e49..6b7f1cfd 100644
--- a/bifromq-util/pom.xml
+++ b/bifromq-util/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-parent</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>bifromq-util</artifactId>
diff --git 
a/build/build-bifromq-starters/assembly/assembly-standalone-windows.xml 
b/build/build-bifromq-starter/assembly/assembly-windows.xml
similarity index 79%
rename from 
build/build-bifromq-starters/assembly/assembly-standalone-windows.xml
rename to build/build-bifromq-starter/assembly/assembly-windows.xml
index edbccb1a..56ccb94f 100644
--- a/build/build-bifromq-starters/assembly/assembly-standalone-windows.xml
+++ b/build/build-bifromq-starter/assembly/assembly-windows.xml
@@ -45,6 +45,18 @@
                 <include>plugins/**</include>
             </includes>
         </fileSet>
+        <fileSet>
+            <directory>${project.basedir}/../../</directory>
+            <includes>
+                <include>licenses/**</include>
+                <include>LICENSE</include>
+                <include>LICENSE-Binary</include>
+                <include>NOTICE</include>
+                <include>NOTICE-Binary</include>
+                <include>DISCLAIMER</include>
+            </includes>
+            <outputDirectory>/</outputDirectory>
+        </fileSet>
     </fileSets>
     <dependencySets>
         <dependencySet>
diff --git a/build/build-bifromq-starters/assembly/assembly-standalone.xml 
b/build/build-bifromq-starter/assembly/assembly.xml
similarity index 79%
rename from build/build-bifromq-starters/assembly/assembly-standalone.xml
rename to build/build-bifromq-starter/assembly/assembly.xml
index e3d59fcb..b4e00a10 100644
--- a/build/build-bifromq-starters/assembly/assembly-standalone.xml
+++ b/build/build-bifromq-starter/assembly/assembly.xml
@@ -45,6 +45,18 @@
                 <include>plugins/**</include>
             </includes>
         </fileSet>
+        <fileSet>
+            <directory>${project.basedir}/../../</directory>
+            <includes>
+                <include>licenses/**</include>
+                <include>LICENSE</include>
+                <include>LICENSE-Binary</include>
+                <include>NOTICE</include>
+                <include>NOTICE-Binary</include>
+                <include>DISCLAIMER</include>
+            </includes>
+            <outputDirectory>/</outputDirectory>
+        </fileSet>
     </fileSets>
     <dependencySets>
         <dependencySet>
diff --git a/build/build-bifromq-starters/bin/bifromq-start.bat 
b/build/build-bifromq-starter/bin/bifromq-start.bat
similarity index 100%
rename from build/build-bifromq-starters/bin/bifromq-start.bat
rename to build/build-bifromq-starter/bin/bifromq-start.bat
diff --git a/build/build-bifromq-starters/bin/bifromq-start.sh 
b/build/build-bifromq-starter/bin/bifromq-start.sh
similarity index 100%
rename from build/build-bifromq-starters/bin/bifromq-start.sh
rename to build/build-bifromq-starter/bin/bifromq-start.sh
diff --git a/build/build-bifromq-starters/bin/bifromq-stop.bat 
b/build/build-bifromq-starter/bin/bifromq-stop.bat
similarity index 100%
rename from build/build-bifromq-starters/bin/bifromq-stop.bat
rename to build/build-bifromq-starter/bin/bifromq-stop.bat
diff --git a/build/build-bifromq-starters/bin/bifromq-stop.sh 
b/build/build-bifromq-starter/bin/bifromq-stop.sh
similarity index 100%
rename from build/build-bifromq-starters/bin/bifromq-stop.sh
rename to build/build-bifromq-starter/bin/bifromq-stop.sh
diff --git a/build/build-bifromq-starters/bin/pid.bat 
b/build/build-bifromq-starter/bin/pid.bat
similarity index 100%
rename from build/build-bifromq-starters/bin/pid.bat
rename to build/build-bifromq-starter/bin/pid.bat
diff --git a/build/build-bifromq-starters/bin/standalone.bat 
b/build/build-bifromq-starter/bin/standalone.bat
similarity index 100%
rename from build/build-bifromq-starters/bin/standalone.bat
rename to build/build-bifromq-starter/bin/standalone.bat
diff --git a/build/build-bifromq-starters/bin/standalone.sh 
b/build/build-bifromq-starter/bin/standalone.sh
similarity index 100%
rename from build/build-bifromq-starters/bin/standalone.sh
rename to build/build-bifromq-starter/bin/standalone.sh
diff --git a/build/build-bifromq-starters/conf/log4j2.xml 
b/build/build-bifromq-starter/conf/log4j2.xml
similarity index 100%
rename from build/build-bifromq-starters/conf/log4j2.xml
rename to build/build-bifromq-starter/conf/log4j2.xml
diff --git a/build/build-bifromq-starters/conf/standalone.yml 
b/build/build-bifromq-starter/conf/standalone.yml
similarity index 100%
rename from build/build-bifromq-starters/conf/standalone.yml
rename to build/build-bifromq-starter/conf/standalone.yml
diff --git a/build/build-bifromq-starters/plugins/README.md 
b/build/build-bifromq-starter/plugins/README.md
similarity index 100%
rename from build/build-bifromq-starters/plugins/README.md
rename to build/build-bifromq-starter/plugins/README.md
diff --git a/build/build-bifromq-starters/pom.xml 
b/build/build-bifromq-starter/pom.xml
similarity index 83%
rename from build/build-bifromq-starters/pom.xml
rename to build/build-bifromq-starter/pom.xml
index 5804a5ec..696a2c8d 100644
--- a/build/build-bifromq-starters/pom.xml
+++ b/build/build-bifromq-starter/pom.xml
@@ -24,11 +24,11 @@
     <parent>
         <artifactId>build</artifactId>
         <groupId>org.apache.bifromq</groupId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>build-bifromq-starters</artifactId>
+    <artifactId>build-bifromq-starter</artifactId>
 
     <dependencies>
         <!-- third party compile dependencies -->
@@ -192,22 +192,38 @@
                 <artifactId>maven-assembly-plugin</artifactId>
                 <executions>
                     <execution>
-                        <id>make-assembly</id>
+                        <id>make-assembly-unix</id>
                         <phase>package</phase>
                         <goals>
                             <goal>single</goal>
                         </goals>
+                        <configuration>
+                            <descriptors>
+                                <descriptor>assembly/assembly.xml</descriptor>
+                            </descriptors>
+                            <appendAssemblyId>false</appendAssemblyId>
+                            
<finalName>bifromq-${project.parent.version}</finalName>
+                            <tarLongFileMode>posix</tarLongFileMode>
+                            
<outputDirectory>${build.output.dir}</outputDirectory>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>make-assembly-windows</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                        <configuration>
+                            <descriptors>
+                                
<descriptor>assembly/assembly-windows.xml</descriptor>
+                            </descriptors>
+                            <appendAssemblyId>false</appendAssemblyId>
+                            
<finalName>bifromq-${project.parent.version}-windows</finalName>
+                            <tarLongFileMode>posix</tarLongFileMode>
+                            
<outputDirectory>${build.output.dir}</outputDirectory>
+                        </configuration>
                     </execution>
                 </executions>
-                <configuration>
-                    <outputDirectory>${build.output.dir}</outputDirectory>
-                    <descriptors>
-                        
<descriptor>assembly/assembly-standalone.xml</descriptor>
-                        
<descriptor>assembly/assembly-standalone-windows.xml</descriptor>
-                    </descriptors>
-                    <appendAssemblyId>true</appendAssemblyId>
-                    <tarLongFileMode>posix</tarLongFileMode>
-                </configuration>
             </plugin>
         </plugins>
     </build>
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/ServiceBootstrapper.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/ServiceBootstrapper.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/ServiceBootstrapper.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/ServiceBootstrapper.java
index e35808a3..a26e59b2 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/ServiceBootstrapper.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/ServiceBootstrapper.java
@@ -19,21 +19,21 @@
 
 package org.apache.bifromq.starter;
 
-import org.apache.bifromq.baserpc.server.IRPCServer;
-import org.apache.bifromq.baserpc.server.RPCServerBuilder;
-import org.apache.bifromq.retain.server.IRetainServer;
-import org.apache.bifromq.retain.store.IRetainStore;
-import org.apache.bifromq.starter.module.ServiceInjector;
 import com.google.inject.Inject;
 import java.util.Optional;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.bifromq.apiserver.IAPIServer;
+import org.apache.bifromq.baserpc.server.IRPCServer;
+import org.apache.bifromq.baserpc.server.RPCServerBuilder;
 import org.apache.bifromq.dist.server.IDistServer;
 import org.apache.bifromq.dist.worker.IDistWorker;
 import org.apache.bifromq.inbox.server.IInboxServer;
 import org.apache.bifromq.inbox.store.IInboxStore;
 import org.apache.bifromq.mqtt.IMQTTBroker;
+import org.apache.bifromq.retain.server.IRetainServer;
+import org.apache.bifromq.retain.store.IRetainStore;
 import org.apache.bifromq.sessiondict.server.ISessionDictServer;
+import org.apache.bifromq.starter.module.ServiceInjector;
 
 @Slf4j
 class ServiceBootstrapper {
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/StandaloneStarter.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/StandaloneStarter.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/StandaloneStarter.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/StandaloneStarter.java
index 1ecb68bf..3e64e399 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/StandaloneStarter.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/StandaloneStarter.java
@@ -23,29 +23,6 @@ import static 
org.apache.bifromq.starter.utils.ClusterDomainUtil.resolve;
 import static org.apache.bifromq.starter.utils.ConfigFileUtil.build;
 import static org.apache.bifromq.starter.utils.ConfigFileUtil.serialize;
 
-import org.apache.bifromq.basecluster.IAgentHost;
-import org.apache.bifromq.baseenv.EnvProvider;
-import org.apache.bifromq.baseenv.MemUsage;
-import org.apache.bifromq.plugin.settingprovider.Setting;
-import org.apache.bifromq.starter.config.StandaloneConfig;
-import org.apache.bifromq.starter.config.StandaloneConfigConsolidator;
-import org.apache.bifromq.starter.metrics.netty.PooledByteBufAllocator;
-import org.apache.bifromq.starter.module.APIServerModule;
-import org.apache.bifromq.starter.module.ConfigModule;
-import org.apache.bifromq.starter.module.CoreServiceModule;
-import org.apache.bifromq.starter.module.DistServiceModule;
-import org.apache.bifromq.starter.module.ExecutorsModule;
-import org.apache.bifromq.starter.module.InboxServiceModule;
-import org.apache.bifromq.starter.module.MQTTServiceModule;
-import org.apache.bifromq.starter.module.PluginModule;
-import org.apache.bifromq.starter.module.RPCClientSSLContextModule;
-import org.apache.bifromq.starter.module.RPCServerBuilderModule;
-import org.apache.bifromq.starter.module.RetainServiceModule;
-import org.apache.bifromq.starter.module.ServiceInjectorModule;
-import org.apache.bifromq.starter.module.SessionDictServiceModule;
-import org.apache.bifromq.starter.module.SharedResourcesHolder;
-import org.apache.bifromq.sysprops.BifroMQSysProp;
-import org.apache.bifromq.sysprops.props.ClusterDomainResolveTimeoutSeconds;
 import com.google.common.base.Strings;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
@@ -74,6 +51,29 @@ import java.util.Set;
 import java.util.stream.Collectors;
 import lombok.Builder;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.bifromq.basecluster.IAgentHost;
+import org.apache.bifromq.baseenv.EnvProvider;
+import org.apache.bifromq.baseenv.MemUsage;
+import org.apache.bifromq.plugin.settingprovider.Setting;
+import org.apache.bifromq.starter.config.StandaloneConfig;
+import org.apache.bifromq.starter.config.StandaloneConfigConsolidator;
+import org.apache.bifromq.starter.metrics.netty.PooledByteBufAllocator;
+import org.apache.bifromq.starter.module.APIServerModule;
+import org.apache.bifromq.starter.module.ConfigModule;
+import org.apache.bifromq.starter.module.CoreServiceModule;
+import org.apache.bifromq.starter.module.DistServiceModule;
+import org.apache.bifromq.starter.module.ExecutorsModule;
+import org.apache.bifromq.starter.module.InboxServiceModule;
+import org.apache.bifromq.starter.module.MQTTServiceModule;
+import org.apache.bifromq.starter.module.PluginModule;
+import org.apache.bifromq.starter.module.RPCClientSSLContextModule;
+import org.apache.bifromq.starter.module.RPCServerBuilderModule;
+import org.apache.bifromq.starter.module.RetainServiceModule;
+import org.apache.bifromq.starter.module.ServiceInjectorModule;
+import org.apache.bifromq.starter.module.SessionDictServiceModule;
+import org.apache.bifromq.starter.module.SharedResourcesHolder;
+import org.apache.bifromq.sysprops.BifroMQSysProp;
+import org.apache.bifromq.sysprops.props.ClusterDomainResolveTimeoutSeconds;
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.CommandLineParser;
 import org.apache.commons.cli.DefaultParser;
@@ -121,26 +121,6 @@ public class StandaloneStarter {
         this.sharedResourcesHolder = sharedResourcesHolder;
     }
 
-    void start() {
-        startSystemMetrics();
-        join();
-        bootstrappedServices.start();
-        log.info("Standalone broker started");
-    }
-
-    void stop() {
-        bootstrappedServices.stop();
-        sharedResourcesHolder.close();
-        closeables.forEach(closable -> {
-            try {
-                closable.close();
-            } catch (Exception e) {
-                // Never happen
-            }
-        });
-        log.info("Standalone broker stopped");
-    }
-
     private static void printConfigs(StandaloneConfig config) {
         log.info("Available Processors: {}", 
EnvProvider.INSTANCE.availableProcessors());
         List<String> arguments = 
ManagementFactory.getRuntimeMXBean().getInputArguments();
@@ -166,6 +146,76 @@ public class StandaloneStarter {
         log.info("Consolidated Config(YAML): \n{}", serialize(config));
     }
 
+    public static void main(String[] args) {
+        CommandLineParser parser = new DefaultParser();
+        HelpFormatter formatter = new HelpFormatter();
+        try {
+            CommandLine cmd = parser.parse(CLI_OPTIONS, args);
+            File confFile = new File(cmd.getOptionValue("c"));
+            if (!confFile.exists()) {
+                throw new RuntimeException("Conf file does not exist: " + 
cmd.getOptionValue("c"));
+            }
+            StandaloneConfig config = build(confFile, StandaloneConfig.class);
+            StandaloneConfigConsolidator.consolidate(config);
+            printConfigs(config);
+
+            if (!Strings.isNullOrEmpty(config.getClusterConfig().getEnv())) {
+                Metrics.globalRegistry.config().commonTags("env", 
config.getClusterConfig().getEnv());
+            }
+            Injector serviceInjector = Guice.createInjector(
+                new ConfigModule(config),
+                new RPCClientSSLContextModule(),
+                new CoreServiceModule(),
+                new RPCServerBuilderModule(),
+                new PluginModule(),
+                new ExecutorsModule());
+            Injector injector = Guice.createInjector(
+                new ConfigModule(config),
+                new DistServiceModule(),
+                new InboxServiceModule(),
+                new RetainServiceModule(),
+                new SessionDictServiceModule(),
+                new MQTTServiceModule(),
+                new APIServerModule(),
+                new ServiceInjectorModule(serviceInjector));
+            StandaloneStarter starter = StandaloneStarter.builder()
+                .config(config)
+                .agentHost(serviceInjector.getInstance(IAgentHost.class))
+                
.bootstrappedServices(injector.getInstance(ServiceBootstrapper.class).bootstrap())
+                
.sharedResourcesHolder(serviceInjector.getInstance(SharedResourcesHolder.class))
+                .build();
+            Thread shutdownThread = new Thread(starter::stop);
+            shutdownThread.setName("shutdown");
+            Runtime.getRuntime().addShutdownHook(shutdownThread);
+
+            starter.start();
+        } catch (Throwable e) {
+            log.error("Failed to start BifroMQ", e);
+            formatter.printHelp("CMD", CLI_OPTIONS);
+            System.exit(-1);
+        }
+    }
+
+    void start() {
+        startSystemMetrics();
+        join();
+        bootstrappedServices.start();
+        log.info("Standalone broker started");
+    }
+
+    void stop() {
+        bootstrappedServices.stop();
+        sharedResourcesHolder.close();
+        closeables.forEach(closable -> {
+            try {
+                closable.close();
+            } catch (Exception e) {
+                // Never happen
+            }
+        });
+        log.info("Standalone broker stopped");
+    }
+
     private void join() {
         String env = config.getClusterConfig().getEnv();
         String clusterDomainName = 
config.getClusterConfig().getClusterDomainName();
@@ -234,54 +284,4 @@ public class StandaloneStarter {
         Gauge.builder("netty.direct.memory.usage", () -> 
MemUsage.local().nettyDirectMemoryUsage())
             .register(Metrics.globalRegistry);
     }
-
-    public static void main(String[] args) {
-        CommandLineParser parser = new DefaultParser();
-        HelpFormatter formatter = new HelpFormatter();
-        try {
-            CommandLine cmd = parser.parse(CLI_OPTIONS, args);
-            File confFile = new File(cmd.getOptionValue("c"));
-            if (!confFile.exists()) {
-                throw new RuntimeException("Conf file does not exist: " + 
cmd.getOptionValue("c"));
-            }
-            StandaloneConfig config = build(confFile, StandaloneConfig.class);
-            StandaloneConfigConsolidator.consolidate(config);
-            printConfigs(config);
-
-            if (!Strings.isNullOrEmpty(config.getClusterConfig().getEnv())) {
-                Metrics.globalRegistry.config().commonTags("env", 
config.getClusterConfig().getEnv());
-            }
-            Injector serviceInjector = Guice.createInjector(
-                new ConfigModule(config),
-                new RPCClientSSLContextModule(),
-                new CoreServiceModule(),
-                new RPCServerBuilderModule(),
-                new PluginModule(),
-                new ExecutorsModule());
-            Injector injector = Guice.createInjector(
-                new ConfigModule(config),
-                new DistServiceModule(),
-                new InboxServiceModule(),
-                new RetainServiceModule(),
-                new SessionDictServiceModule(),
-                new MQTTServiceModule(),
-                new APIServerModule(),
-                new ServiceInjectorModule(serviceInjector));
-            StandaloneStarter starter = StandaloneStarter.builder()
-                .config(config)
-                .agentHost(serviceInjector.getInstance(IAgentHost.class))
-                
.bootstrappedServices(injector.getInstance(ServiceBootstrapper.class).bootstrap())
-                
.sharedResourcesHolder(serviceInjector.getInstance(SharedResourcesHolder.class))
-                .build();
-            Thread shutdownThread = new Thread(starter::stop);
-            shutdownThread.setName("shutdown");
-            Runtime.getRuntime().addShutdownHook(shutdownThread);
-
-            starter.start();
-        } catch (Throwable e) {
-            log.error("Failed to start BifroMQ", e);
-            formatter.printHelp("CMD", CLI_OPTIONS);
-            System.exit(-1);
-        }
-    }
 }
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/StandaloneConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/StandaloneConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/StandaloneConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/StandaloneConfig.java
index 0128fe6c..66851d12 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/StandaloneConfig.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/StandaloneConfig.java
@@ -19,6 +19,10 @@
 
 package org.apache.bifromq.starter.config;
 
+import com.fasterxml.jackson.annotation.JsonSetter;
+import com.fasterxml.jackson.annotation.Nulls;
+import lombok.Getter;
+import lombok.Setter;
 import org.apache.bifromq.baseenv.EnvProvider;
 import org.apache.bifromq.starter.config.model.ClusterConfig;
 import org.apache.bifromq.starter.config.model.RPCConfig;
@@ -28,10 +32,6 @@ import 
org.apache.bifromq.starter.config.model.dist.DistServiceConfig;
 import org.apache.bifromq.starter.config.model.inbox.InboxServiceConfig;
 import org.apache.bifromq.starter.config.model.mqtt.MQTTServiceConfig;
 import org.apache.bifromq.starter.config.model.retain.RetainServiceConfig;
-import com.fasterxml.jackson.annotation.JsonSetter;
-import com.fasterxml.jackson.annotation.Nulls;
-import lombok.Getter;
-import lombok.Setter;
 
 @Getter
 @Setter
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/StandaloneConfigConsolidator.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/StandaloneConfigConsolidator.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/StandaloneConfigConsolidator.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/StandaloneConfigConsolidator.java
index 6a117ae8..58dd91b5 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/StandaloneConfigConsolidator.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/StandaloneConfigConsolidator.java
@@ -19,12 +19,6 @@
 
 package org.apache.bifromq.starter.config;
 
-import org.apache.bifromq.starter.config.model.ClusterConfig;
-import org.apache.bifromq.starter.config.model.RPCConfig;
-import org.apache.bifromq.starter.config.model.SSLContextConfig;
-import org.apache.bifromq.starter.config.model.ServerSSLContextConfig;
-import org.apache.bifromq.starter.config.model.api.APIServerConfig;
-import org.apache.bifromq.starter.config.model.mqtt.MQTTServerConfig;
 import com.google.common.base.Strings;
 import io.netty.handler.ssl.util.SelfSignedCertificate;
 import java.net.InetAddress;
@@ -33,6 +27,12 @@ import java.security.cert.CertificateException;
 import java.util.Enumeration;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.bifromq.starter.config.model.ClusterConfig;
+import org.apache.bifromq.starter.config.model.RPCConfig;
+import org.apache.bifromq.starter.config.model.SSLContextConfig;
+import org.apache.bifromq.starter.config.model.ServerSSLContextConfig;
+import org.apache.bifromq.starter.config.model.api.APIServerConfig;
+import org.apache.bifromq.starter.config.model.mqtt.MQTTServerConfig;
 
 @Slf4j
 public class StandaloneConfigConsolidator {
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/BalancerOptions.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/BalancerOptions.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/BalancerOptions.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/BalancerOptions.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/ClusterConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/ClusterConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/ClusterConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/ClusterConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/ExecutorConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/ExecutorConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/ExecutorConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/ExecutorConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/InMemEngineConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/InMemEngineConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/InMemEngineConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/InMemEngineConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/RPCConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/RPCConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/RPCConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/RPCConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/RocksDBEngineConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/RocksDBEngineConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/RocksDBEngineConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/RocksDBEngineConfig.java
index e01518fb..ca3baa87 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/RocksDBEngineConfig.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/RocksDBEngineConfig.java
@@ -21,10 +21,10 @@ package org.apache.bifromq.starter.config.model;
 
 import static java.lang.Math.max;
 
-import org.apache.bifromq.baseenv.EnvProvider;
 import lombok.Getter;
 import lombok.Setter;
 import lombok.experimental.Accessors;
+import org.apache.bifromq.baseenv.EnvProvider;
 import org.rocksdb.util.SizeUnit;
 
 @Getter
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/SSLContextConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/SSLContextConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/SSLContextConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/SSLContextConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/ServerSSLContextConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/ServerSSLContextConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/ServerSSLContextConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/ServerSSLContextConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/StorageEngineConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/StorageEngineConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/StorageEngineConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/StorageEngineConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/api/APIServerConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/api/APIServerConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/api/APIServerConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/api/APIServerConfig.java
index 6cdcd60a..4f19b431 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/api/APIServerConfig.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/api/APIServerConfig.java
@@ -19,11 +19,11 @@
 
 package org.apache.bifromq.starter.config.model.api;
 
-import org.apache.bifromq.starter.config.model.ServerSSLContextConfig;
 import com.fasterxml.jackson.annotation.JsonSetter;
 import com.fasterxml.jackson.annotation.Nulls;
 import lombok.Getter;
 import lombok.Setter;
+import org.apache.bifromq.starter.config.model.ServerSSLContextConfig;
 
 @Getter
 @Setter
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/dict/SessionDictClientConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/dict/SessionDictClientConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/dict/SessionDictClientConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/dict/SessionDictClientConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/dict/SessionDictServerConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/dict/SessionDictServerConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/dict/SessionDictServerConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/dict/SessionDictServerConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/dict/SessionDictServiceConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/dict/SessionDictServiceConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/dict/SessionDictServiceConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/dict/SessionDictServiceConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/dist/DistClientConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/dist/DistClientConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/dist/DistClientConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/dist/DistClientConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/dist/DistServerConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/dist/DistServerConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/dist/DistServerConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/dist/DistServerConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/dist/DistServiceConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/dist/DistServiceConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/dist/DistServiceConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/dist/DistServiceConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/dist/DistWorkerClientConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/dist/DistWorkerClientConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/dist/DistWorkerClientConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/dist/DistWorkerClientConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/dist/DistWorkerConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/dist/DistWorkerConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/dist/DistWorkerConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/dist/DistWorkerConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/inbox/InboxClientConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/inbox/InboxClientConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/inbox/InboxClientConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/inbox/InboxClientConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/inbox/InboxServerConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/inbox/InboxServerConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/inbox/InboxServerConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/inbox/InboxServerConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/inbox/InboxServiceConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/inbox/InboxServiceConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/inbox/InboxServiceConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/inbox/InboxServiceConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/inbox/InboxStoreClientConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/inbox/InboxStoreClientConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/inbox/InboxStoreClientConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/inbox/InboxStoreClientConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/inbox/InboxStoreConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/inbox/InboxStoreConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/inbox/InboxStoreConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/inbox/InboxStoreConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/mqtt/MQTTBrokerClientConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/mqtt/MQTTBrokerClientConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/mqtt/MQTTBrokerClientConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/mqtt/MQTTBrokerClientConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/mqtt/MQTTServerConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/mqtt/MQTTServerConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/mqtt/MQTTServerConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/mqtt/MQTTServerConfig.java
index 8b7de2c7..c6191833 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/mqtt/MQTTServerConfig.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/mqtt/MQTTServerConfig.java
@@ -19,15 +19,15 @@
 
 package org.apache.bifromq.starter.config.model.mqtt;
 
+import com.fasterxml.jackson.annotation.JsonSetter;
+import com.fasterxml.jackson.annotation.Nulls;
+import lombok.Getter;
+import lombok.Setter;
 import org.apache.bifromq.baseenv.EnvProvider;
 import org.apache.bifromq.starter.config.model.mqtt.listener.TCPListenerConfig;
 import org.apache.bifromq.starter.config.model.mqtt.listener.TLSListenerConfig;
 import org.apache.bifromq.starter.config.model.mqtt.listener.WSListenerConfig;
 import org.apache.bifromq.starter.config.model.mqtt.listener.WSSListenerConfig;
-import com.fasterxml.jackson.annotation.JsonSetter;
-import com.fasterxml.jackson.annotation.Nulls;
-import lombok.Getter;
-import lombok.Setter;
 
 @Getter
 @Setter
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/mqtt/MQTTServiceConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/mqtt/MQTTServiceConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/mqtt/MQTTServiceConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/mqtt/MQTTServiceConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/mqtt/listener/TCPListenerConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/mqtt/listener/TCPListenerConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/mqtt/listener/TCPListenerConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/mqtt/listener/TCPListenerConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/mqtt/listener/TLSListenerConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/mqtt/listener/TLSListenerConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/mqtt/listener/TLSListenerConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/mqtt/listener/TLSListenerConfig.java
index 47128088..0e17e722 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/mqtt/listener/TLSListenerConfig.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/mqtt/listener/TLSListenerConfig.java
@@ -19,9 +19,9 @@
 
 package org.apache.bifromq.starter.config.model.mqtt.listener;
 
-import org.apache.bifromq.starter.config.model.ServerSSLContextConfig;
 import lombok.Getter;
 import lombok.Setter;
+import org.apache.bifromq.starter.config.model.ServerSSLContextConfig;
 
 @Getter
 @Setter
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/mqtt/listener/WSListenerConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/mqtt/listener/WSListenerConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/mqtt/listener/WSListenerConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/mqtt/listener/WSListenerConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/mqtt/listener/WSSListenerConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/mqtt/listener/WSSListenerConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/mqtt/listener/WSSListenerConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/mqtt/listener/WSSListenerConfig.java
index 9bf91833..fa83cca6 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/mqtt/listener/WSSListenerConfig.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/mqtt/listener/WSSListenerConfig.java
@@ -19,9 +19,9 @@
 
 package org.apache.bifromq.starter.config.model.mqtt.listener;
 
-import org.apache.bifromq.starter.config.model.ServerSSLContextConfig;
 import lombok.Getter;
 import lombok.Setter;
+import org.apache.bifromq.starter.config.model.ServerSSLContextConfig;
 
 @Getter
 @Setter
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/retain/RetainClientConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/retain/RetainClientConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/retain/RetainClientConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/retain/RetainClientConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/retain/RetainServerConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/retain/RetainServerConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/retain/RetainServerConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/retain/RetainServerConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/retain/RetainServiceConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/retain/RetainServiceConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/retain/RetainServiceConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/retain/RetainServiceConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/retain/RetainStoreClientConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/retain/RetainStoreClientConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/retain/RetainStoreClientConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/retain/RetainStoreClientConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/retain/RetainStoreConfig.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/retain/RetainStoreConfig.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/config/model/retain/RetainStoreConfig.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/config/model/retain/RetainStoreConfig.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/metrics/netty/PooledByteBufAllocator.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/metrics/netty/PooledByteBufAllocator.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/metrics/netty/PooledByteBufAllocator.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/metrics/netty/PooledByteBufAllocator.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/metrics/netty/PooledByteBufAllocatorMetric.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/metrics/netty/PooledByteBufAllocatorMetric.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/metrics/netty/PooledByteBufAllocatorMetric.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/metrics/netty/PooledByteBufAllocatorMetric.java
index 7f194854..e7885bd3 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/metrics/netty/PooledByteBufAllocatorMetric.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/metrics/netty/PooledByteBufAllocatorMetric.java
@@ -19,11 +19,11 @@
 
 package org.apache.bifromq.starter.metrics.netty;
 
-import org.apache.bifromq.baseenv.EnvProvider;
 import io.netty.buffer.ByteBufAllocatorMetric;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
 import java.util.concurrent.atomic.AtomicBoolean;
+import org.apache.bifromq.baseenv.EnvProvider;
 
 /**
  * A non-blocking wrapper of {@link 
io.netty.buffer.PooledByteBufAllocatorMetric}.
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/APIServerModule.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/APIServerModule.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/APIServerModule.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/APIServerModule.java
index 56f26a9a..1e7d87c7 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/APIServerModule.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/APIServerModule.java
@@ -21,11 +21,6 @@ package org.apache.bifromq.starter.module;
 
 import static org.apache.bifromq.starter.module.SSLUtil.buildServerSslContext;
 
-import org.apache.bifromq.baserpc.trafficgovernor.IRPCServiceTrafficService;
-import org.apache.bifromq.plugin.settingprovider.SettingProviderManager;
-import org.apache.bifromq.retain.client.IRetainClient;
-import org.apache.bifromq.starter.config.StandaloneConfig;
-import org.apache.bifromq.starter.config.model.api.APIServerConfig;
 import com.google.common.base.Strings;
 import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
@@ -37,9 +32,14 @@ import org.apache.bifromq.apiserver.APIServer;
 import org.apache.bifromq.apiserver.IAPIServer;
 import org.apache.bifromq.basecluster.IAgentHost;
 import org.apache.bifromq.basekv.metaservice.IBaseKVMetaService;
+import org.apache.bifromq.baserpc.trafficgovernor.IRPCServiceTrafficService;
 import org.apache.bifromq.dist.client.IDistClient;
 import org.apache.bifromq.inbox.client.IInboxClient;
+import org.apache.bifromq.plugin.settingprovider.SettingProviderManager;
+import org.apache.bifromq.retain.client.IRetainClient;
 import org.apache.bifromq.sessiondict.client.ISessionDictClient;
+import org.apache.bifromq.starter.config.StandaloneConfig;
+import org.apache.bifromq.starter.config.model.api.APIServerConfig;
 
 public class APIServerModule extends AbstractModule {
     @Override
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/ConfigModule.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/ConfigModule.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/ConfigModule.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/ConfigModule.java
index f030a01a..795eb77b 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/ConfigModule.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/ConfigModule.java
@@ -19,8 +19,8 @@
 
 package org.apache.bifromq.starter.module;
 
-import org.apache.bifromq.starter.config.StandaloneConfig;
 import com.google.inject.AbstractModule;
+import org.apache.bifromq.starter.config.StandaloneConfig;
 
 public class ConfigModule extends AbstractModule {
     private final StandaloneConfig config;
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/CoreServiceModule.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/CoreServiceModule.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/CoreServiceModule.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/CoreServiceModule.java
index 5e1e3d81..a4c5f3be 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/CoreServiceModule.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/CoreServiceModule.java
@@ -19,13 +19,6 @@
 
 package org.apache.bifromq.starter.module;
 
-import org.apache.bifromq.baserpc.trafficgovernor.IRPCServiceTrafficService;
-import org.apache.bifromq.retain.client.IRetainClient;
-import org.apache.bifromq.retain.store.IRetainStore;
-import org.apache.bifromq.starter.config.StandaloneConfig;
-import org.apache.bifromq.starter.config.model.dist.DistWorkerClientConfig;
-import org.apache.bifromq.starter.config.model.inbox.InboxStoreConfig;
-import org.apache.bifromq.starter.config.model.retain.RetainStoreClientConfig;
 import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
@@ -41,12 +34,19 @@ import 
org.apache.bifromq.basecrdt.service.CRDTServiceOptions;
 import org.apache.bifromq.basecrdt.service.ICRDTService;
 import org.apache.bifromq.basekv.client.IBaseKVStoreClient;
 import org.apache.bifromq.basekv.metaservice.IBaseKVMetaService;
+import org.apache.bifromq.baserpc.trafficgovernor.IRPCServiceTrafficService;
 import org.apache.bifromq.dist.client.IDistClient;
 import org.apache.bifromq.dist.worker.IDistWorker;
 import org.apache.bifromq.inbox.client.IInboxClient;
 import org.apache.bifromq.inbox.store.IInboxStore;
 import org.apache.bifromq.mqtt.inbox.IMqttBrokerClient;
+import org.apache.bifromq.retain.client.IRetainClient;
+import org.apache.bifromq.retain.store.IRetainStore;
 import org.apache.bifromq.sessiondict.client.ISessionDictClient;
+import org.apache.bifromq.starter.config.StandaloneConfig;
+import org.apache.bifromq.starter.config.model.dist.DistWorkerClientConfig;
+import org.apache.bifromq.starter.config.model.inbox.InboxStoreConfig;
+import org.apache.bifromq.starter.config.model.retain.RetainStoreClientConfig;
 
 public class CoreServiceModule extends AbstractModule {
     @Override
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/DistServiceModule.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/DistServiceModule.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/DistServiceModule.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/DistServiceModule.java
index d237e9dd..5a82f765 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/DistServiceModule.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/DistServiceModule.java
@@ -22,6 +22,16 @@ package org.apache.bifromq.starter.module;
 import static 
org.apache.bifromq.starter.module.EngineConfUtil.buildDataEngineConf;
 import static 
org.apache.bifromq.starter.module.EngineConfUtil.buildWALEngineConf;
 
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Key;
+import com.google.inject.Provider;
+import com.google.inject.TypeLiteral;
+import com.google.inject.name.Names;
+import jakarta.inject.Singleton;
+import java.time.Duration;
+import java.util.Optional;
+import java.util.concurrent.ScheduledExecutorService;
 import org.apache.bifromq.basecluster.IAgentHost;
 import org.apache.bifromq.basekv.client.IBaseKVStoreClient;
 import org.apache.bifromq.basekv.metaservice.IBaseKVMetaService;
@@ -39,16 +49,6 @@ import org.apache.bifromq.starter.config.StandaloneConfig;
 import org.apache.bifromq.starter.config.model.dist.DistServerConfig;
 import org.apache.bifromq.starter.config.model.dist.DistWorkerConfig;
 import org.apache.bifromq.sysprops.props.DistWorkerLoadEstimationWindowSeconds;
-import com.google.inject.AbstractModule;
-import com.google.inject.Inject;
-import com.google.inject.Key;
-import com.google.inject.Provider;
-import com.google.inject.TypeLiteral;
-import com.google.inject.name.Names;
-import jakarta.inject.Singleton;
-import java.time.Duration;
-import java.util.Optional;
-import java.util.concurrent.ScheduledExecutorService;
 
 public class DistServiceModule extends AbstractModule {
     @Override
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/EngineConfUtil.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/EngineConfUtil.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/EngineConfUtil.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/EngineConfUtil.java
index 7f25d195..8c171695 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/EngineConfUtil.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/EngineConfUtil.java
@@ -19,6 +19,8 @@
 
 package org.apache.bifromq.starter.module;
 
+import java.nio.file.Path;
+import java.nio.file.Paths;
 import org.apache.bifromq.basekv.localengine.ICPableKVEngineConfigurator;
 import org.apache.bifromq.basekv.localengine.IWALableKVEngineConfigurator;
 import org.apache.bifromq.basekv.localengine.memory.InMemKVEngineConfigurator;
@@ -27,8 +29,6 @@ import 
org.apache.bifromq.basekv.localengine.rocksdb.RocksDBWALableKVEngineConfi
 import org.apache.bifromq.starter.config.model.InMemEngineConfig;
 import org.apache.bifromq.starter.config.model.RocksDBEngineConfig;
 import org.apache.bifromq.starter.config.model.StorageEngineConfig;
-import java.nio.file.Path;
-import java.nio.file.Paths;
 
 public class EngineConfUtil {
     public static final String USER_DIR_PROP = "user.dir";
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/ExecutorsModule.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/ExecutorsModule.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/ExecutorsModule.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/ExecutorsModule.java
index 6dac7dab..30dceadd 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/ExecutorsModule.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/ExecutorsModule.java
@@ -19,9 +19,6 @@
 
 package org.apache.bifromq.starter.module;
 
-import org.apache.bifromq.baseenv.EnvProvider;
-import org.apache.bifromq.baseenv.NettyEnv;
-import org.apache.bifromq.starter.config.StandaloneConfig;
 import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
@@ -33,6 +30,9 @@ import io.netty.channel.EventLoopGroup;
 import jakarta.inject.Singleton;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
+import org.apache.bifromq.baseenv.EnvProvider;
+import org.apache.bifromq.baseenv.NettyEnv;
+import org.apache.bifromq.starter.config.StandaloneConfig;
 
 public class ExecutorsModule extends AbstractModule {
     @Override
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/InboxServiceModule.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/InboxServiceModule.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/InboxServiceModule.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/InboxServiceModule.java
index ae451903..b161e6dc 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/InboxServiceModule.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/InboxServiceModule.java
@@ -22,14 +22,6 @@ package org.apache.bifromq.starter.module;
 import static 
org.apache.bifromq.starter.module.EngineConfUtil.buildDataEngineConf;
 import static 
org.apache.bifromq.starter.module.EngineConfUtil.buildWALEngineConf;
 
-import org.apache.bifromq.baserpc.server.RPCServerBuilder;
-import org.apache.bifromq.plugin.eventcollector.EventCollectorManager;
-import org.apache.bifromq.plugin.resourcethrottler.ResourceThrottlerManager;
-import org.apache.bifromq.plugin.settingprovider.SettingProviderManager;
-import org.apache.bifromq.retain.client.IRetainClient;
-import org.apache.bifromq.starter.config.StandaloneConfig;
-import org.apache.bifromq.starter.config.model.inbox.InboxServerConfig;
-import org.apache.bifromq.starter.config.model.inbox.InboxStoreConfig;
 import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
 import com.google.inject.Key;
@@ -45,11 +37,19 @@ import org.apache.bifromq.basekv.client.IBaseKVStoreClient;
 import org.apache.bifromq.basekv.metaservice.IBaseKVMetaService;
 import org.apache.bifromq.basekv.store.option.KVRangeOptions;
 import org.apache.bifromq.basekv.store.option.KVRangeStoreOptions;
+import org.apache.bifromq.baserpc.server.RPCServerBuilder;
 import org.apache.bifromq.dist.client.IDistClient;
 import org.apache.bifromq.inbox.client.IInboxClient;
 import org.apache.bifromq.inbox.server.IInboxServer;
 import org.apache.bifromq.inbox.store.IInboxStore;
+import org.apache.bifromq.plugin.eventcollector.EventCollectorManager;
+import org.apache.bifromq.plugin.resourcethrottler.ResourceThrottlerManager;
+import org.apache.bifromq.plugin.settingprovider.SettingProviderManager;
+import org.apache.bifromq.retain.client.IRetainClient;
 import org.apache.bifromq.sessiondict.client.ISessionDictClient;
+import org.apache.bifromq.starter.config.StandaloneConfig;
+import org.apache.bifromq.starter.config.model.inbox.InboxServerConfig;
+import org.apache.bifromq.starter.config.model.inbox.InboxStoreConfig;
 import org.apache.bifromq.sysprops.props.InboxStoreLoadEstimationWindowSeconds;
 
 public class InboxServiceModule extends AbstractModule {
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/MQTTServiceModule.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/MQTTServiceModule.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/MQTTServiceModule.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/MQTTServiceModule.java
index 2b19094a..6d4a4fd3 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/MQTTServiceModule.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/MQTTServiceModule.java
@@ -21,26 +21,26 @@ package org.apache.bifromq.starter.module;
 
 import static org.apache.bifromq.starter.module.SSLUtil.buildServerSslContext;
 
-import org.apache.bifromq.baserpc.server.RPCServerBuilder;
-import org.apache.bifromq.plugin.authprovider.AuthProviderManager;
-import org.apache.bifromq.plugin.clientbalancer.ClientBalancerManager;
-import org.apache.bifromq.plugin.eventcollector.EventCollectorManager;
-import org.apache.bifromq.plugin.resourcethrottler.ResourceThrottlerManager;
-import org.apache.bifromq.plugin.settingprovider.SettingProviderManager;
-import org.apache.bifromq.retain.client.IRetainClient;
-import org.apache.bifromq.starter.config.StandaloneConfig;
-import org.apache.bifromq.starter.config.model.mqtt.MQTTServerConfig;
 import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.TypeLiteral;
 import jakarta.inject.Singleton;
 import java.util.Optional;
+import org.apache.bifromq.baserpc.server.RPCServerBuilder;
 import org.apache.bifromq.dist.client.IDistClient;
 import org.apache.bifromq.inbox.client.IInboxClient;
 import org.apache.bifromq.mqtt.IMQTTBroker;
 import org.apache.bifromq.mqtt.IMQTTBrokerBuilder;
+import org.apache.bifromq.plugin.authprovider.AuthProviderManager;
+import org.apache.bifromq.plugin.clientbalancer.ClientBalancerManager;
+import org.apache.bifromq.plugin.eventcollector.EventCollectorManager;
+import org.apache.bifromq.plugin.resourcethrottler.ResourceThrottlerManager;
+import org.apache.bifromq.plugin.settingprovider.SettingProviderManager;
+import org.apache.bifromq.retain.client.IRetainClient;
 import org.apache.bifromq.sessiondict.client.ISessionDictClient;
+import org.apache.bifromq.starter.config.StandaloneConfig;
+import org.apache.bifromq.starter.config.model.mqtt.MQTTServerConfig;
 
 public class MQTTServiceModule extends AbstractModule {
     @Override
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/PluginModule.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/PluginModule.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/PluginModule.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/PluginModule.java
index a0032d03..2ee53a43 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/PluginModule.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/PluginModule.java
@@ -19,6 +19,12 @@
 
 package org.apache.bifromq.starter.module;
 
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import jakarta.inject.Singleton;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.bifromq.inbox.client.IInboxClient;
+import org.apache.bifromq.mqtt.inbox.IMqttBrokerClient;
 import org.apache.bifromq.plugin.authprovider.AuthProviderManager;
 import org.apache.bifromq.plugin.clientbalancer.ClientBalancerManager;
 import org.apache.bifromq.plugin.eventcollector.EventCollectorManager;
@@ -28,12 +34,6 @@ import 
org.apache.bifromq.plugin.settingprovider.SettingProviderManager;
 import org.apache.bifromq.plugin.subbroker.ISubBrokerManager;
 import org.apache.bifromq.plugin.subbroker.SubBrokerManager;
 import org.apache.bifromq.starter.config.StandaloneConfig;
-import com.google.inject.AbstractModule;
-import com.google.inject.Inject;
-import jakarta.inject.Singleton;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.bifromq.inbox.client.IInboxClient;
-import org.apache.bifromq.mqtt.inbox.IMqttBrokerClient;
 import org.pf4j.PluginManager;
 
 @Slf4j
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/RPCClientSSLContextModule.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/RPCClientSSLContextModule.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/RPCClientSSLContextModule.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/RPCClientSSLContextModule.java
index 4dd8b605..d2dfd4fa 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/RPCClientSSLContextModule.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/RPCClientSSLContextModule.java
@@ -22,8 +22,6 @@ package org.apache.bifromq.starter.module;
 import static org.apache.bifromq.starter.module.SSLUtil.defaultSslProvider;
 import static org.apache.bifromq.starter.utils.ResourceUtil.loadFile;
 
-import org.apache.bifromq.starter.config.StandaloneConfig;
-import org.apache.bifromq.starter.config.model.SSLContextConfig;
 import com.google.common.base.Strings;
 import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
@@ -37,6 +35,8 @@ import io.netty.handler.ssl.SslProvider;
 import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
 import jakarta.inject.Singleton;
 import java.util.Optional;
+import org.apache.bifromq.starter.config.StandaloneConfig;
+import org.apache.bifromq.starter.config.model.SSLContextConfig;
 
 public class RPCClientSSLContextModule extends AbstractModule {
     @Override
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/RPCServerBuilderModule.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/RPCServerBuilderModule.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/RPCServerBuilderModule.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/RPCServerBuilderModule.java
index 19054011..5524df6f 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/RPCServerBuilderModule.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/RPCServerBuilderModule.java
@@ -23,11 +23,6 @@ import static 
org.apache.bifromq.starter.module.SSLUtil.defaultSslProvider;
 import static org.apache.bifromq.starter.module.SSLUtil.findJdkProvider;
 import static org.apache.bifromq.starter.utils.ResourceUtil.loadFile;
 
-import org.apache.bifromq.baserpc.server.IRPCServer;
-import org.apache.bifromq.baserpc.server.RPCServerBuilder;
-import org.apache.bifromq.baserpc.trafficgovernor.IRPCServiceTrafficService;
-import org.apache.bifromq.starter.config.StandaloneConfig;
-import org.apache.bifromq.starter.config.model.ServerSSLContextConfig;
 import com.google.common.base.Strings;
 import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
@@ -38,6 +33,11 @@ import io.netty.handler.ssl.SslContextBuilder;
 import io.netty.handler.ssl.SslProvider;
 import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
 import jakarta.inject.Singleton;
+import org.apache.bifromq.baserpc.server.IRPCServer;
+import org.apache.bifromq.baserpc.server.RPCServerBuilder;
+import org.apache.bifromq.baserpc.trafficgovernor.IRPCServiceTrafficService;
+import org.apache.bifromq.starter.config.StandaloneConfig;
+import org.apache.bifromq.starter.config.model.ServerSSLContextConfig;
 
 public class RPCServerBuilderModule extends AbstractModule {
     @Override
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/RetainServiceModule.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/RetainServiceModule.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/RetainServiceModule.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/RetainServiceModule.java
index 7796127f..f964bf63 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/RetainServiceModule.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/RetainServiceModule.java
@@ -22,6 +22,16 @@ package org.apache.bifromq.starter.module;
 import static 
org.apache.bifromq.starter.module.EngineConfUtil.buildDataEngineConf;
 import static 
org.apache.bifromq.starter.module.EngineConfUtil.buildWALEngineConf;
 
+import com.google.inject.AbstractModule;
+import com.google.inject.Inject;
+import com.google.inject.Key;
+import com.google.inject.Provider;
+import com.google.inject.TypeLiteral;
+import com.google.inject.name.Names;
+import jakarta.inject.Singleton;
+import java.time.Duration;
+import java.util.Optional;
+import java.util.concurrent.ScheduledExecutorService;
 import org.apache.bifromq.basecluster.IAgentHost;
 import org.apache.bifromq.basekv.client.IBaseKVStoreClient;
 import org.apache.bifromq.basekv.metaservice.IBaseKVMetaService;
@@ -37,16 +47,6 @@ import org.apache.bifromq.starter.config.StandaloneConfig;
 import org.apache.bifromq.starter.config.model.retain.RetainServerConfig;
 import org.apache.bifromq.starter.config.model.retain.RetainStoreConfig;
 import 
org.apache.bifromq.sysprops.props.RetainStoreLoadEstimationWindowSeconds;
-import com.google.inject.AbstractModule;
-import com.google.inject.Inject;
-import com.google.inject.Key;
-import com.google.inject.Provider;
-import com.google.inject.TypeLiteral;
-import com.google.inject.name.Names;
-import jakarta.inject.Singleton;
-import java.time.Duration;
-import java.util.Optional;
-import java.util.concurrent.ScheduledExecutorService;
 
 public class RetainServiceModule extends AbstractModule {
     @Override
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/SSLUtil.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/SSLUtil.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/SSLUtil.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/SSLUtil.java
index 6d2b6a6a..9bd083fa 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/SSLUtil.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/SSLUtil.java
@@ -21,7 +21,6 @@ package org.apache.bifromq.starter.module;
 
 import static org.apache.bifromq.starter.utils.ResourceUtil.loadFile;
 
-import org.apache.bifromq.starter.config.model.ServerSSLContextConfig;
 import com.google.common.base.Strings;
 import io.netty.handler.ssl.OpenSsl;
 import io.netty.handler.ssl.SslContext;
@@ -30,6 +29,7 @@ import io.netty.handler.ssl.SslProvider;
 import io.netty.handler.ssl.util.InsecureTrustManagerFactory;
 import java.security.Provider;
 import java.security.Security;
+import org.apache.bifromq.starter.config.model.ServerSSLContextConfig;
 
 public class SSLUtil {
     public static SslProvider defaultSslProvider() {
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/ServiceInjector.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/ServiceInjector.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/ServiceInjector.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/ServiceInjector.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/ServiceInjectorModule.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/ServiceInjectorModule.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/ServiceInjectorModule.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/ServiceInjectorModule.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/SessionDictServiceModule.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/SessionDictServiceModule.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/SessionDictServiceModule.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/SessionDictServiceModule.java
index 3fffcaa8..fcfd7a4e 100644
--- 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/SessionDictServiceModule.java
+++ 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/SessionDictServiceModule.java
@@ -19,17 +19,17 @@
 
 package org.apache.bifromq.starter.module;
 
-import org.apache.bifromq.baserpc.server.RPCServerBuilder;
-import org.apache.bifromq.starter.config.StandaloneConfig;
-import org.apache.bifromq.starter.config.model.dict.SessionDictServerConfig;
 import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.TypeLiteral;
 import jakarta.inject.Singleton;
 import java.util.Optional;
+import org.apache.bifromq.baserpc.server.RPCServerBuilder;
 import org.apache.bifromq.mqtt.inbox.IMqttBrokerClient;
 import org.apache.bifromq.sessiondict.server.ISessionDictServer;
+import org.apache.bifromq.starter.config.StandaloneConfig;
+import org.apache.bifromq.starter.config.model.dict.SessionDictServerConfig;
 
 public class SessionDictServiceModule extends AbstractModule {
     @Override
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/SharedResourceProvider.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/SharedResourceProvider.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/SharedResourceProvider.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/SharedResourceProvider.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/SharedResourcesHolder.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/SharedResourcesHolder.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/module/SharedResourcesHolder.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/module/SharedResourcesHolder.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/utils/ClusterDomainUtil.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/utils/ClusterDomainUtil.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/utils/ClusterDomainUtil.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/utils/ClusterDomainUtil.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/utils/ConfigFileUtil.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/utils/ConfigFileUtil.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/utils/ConfigFileUtil.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/utils/ConfigFileUtil.java
diff --git 
a/build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/utils/ResourceUtil.java
 
b/build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/utils/ResourceUtil.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/main/java/org/apache/bifromq/starter/utils/ResourceUtil.java
rename to 
build/build-bifromq-starter/src/main/java/org/apache/bifromq/starter/utils/ResourceUtil.java
diff --git a/build/build-bifromq-starters/src/main/resources/log4j2.xml 
b/build/build-bifromq-starter/src/main/resources/log4j2.xml
similarity index 100%
rename from build/build-bifromq-starters/src/main/resources/log4j2.xml
rename to build/build-bifromq-starter/src/main/resources/log4j2.xml
diff --git 
a/build/build-bifromq-starters/src/test/java/org/apache/bifromq/starter/utils/ClusterDomainUtilTest.java
 
b/build/build-bifromq-starter/src/test/java/org/apache/bifromq/starter/utils/ClusterDomainUtilTest.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/test/java/org/apache/bifromq/starter/utils/ClusterDomainUtilTest.java
rename to 
build/build-bifromq-starter/src/test/java/org/apache/bifromq/starter/utils/ClusterDomainUtilTest.java
diff --git 
a/build/build-bifromq-starters/src/test/java/org/apache/bifromq/starter/utils/ResourceUtilTest.java
 
b/build/build-bifromq-starter/src/test/java/org/apache/bifromq/starter/utils/ResourceUtilTest.java
similarity index 100%
rename from 
build/build-bifromq-starters/src/test/java/org/apache/bifromq/starter/utils/ResourceUtilTest.java
rename to 
build/build-bifromq-starter/src/test/java/org/apache/bifromq/starter/utils/ResourceUtilTest.java
diff --git a/build/build-bifromq-starters/src/test/resources/log4j2-test.xml 
b/build/build-bifromq-starter/src/test/resources/log4j2-test.xml
similarity index 100%
rename from build/build-bifromq-starters/src/test/resources/log4j2-test.xml
rename to build/build-bifromq-starter/src/test/resources/log4j2-test.xml
diff --git a/build/build-bifromq-starters/src/test/resources/testResource.txt 
b/build/build-bifromq-starter/src/test/resources/testResource.txt
similarity index 100%
rename from build/build-bifromq-starters/src/test/resources/testResource.txt
rename to build/build-bifromq-starter/src/test/resources/testResource.txt
diff --git a/build/build-plugin-demo/pom.xml b/build/build-plugin-demo/pom.xml
index 6329212e..0b7c1b79 100644
--- a/build/build-plugin-demo/pom.xml
+++ b/build/build-plugin-demo/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>build</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
diff --git a/build/pom.xml b/build/pom.xml
index 5a555d47..075cdf97 100644
--- a/build/pom.xml
+++ b/build/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <artifactId>bifromq-parent</artifactId>
         <groupId>org.apache.bifromq</groupId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <packaging>pom</packaging>
 
@@ -33,7 +33,7 @@
 
     <modules>
         <module>build-plugin-demo</module>
-        <module>build-bifromq-starters</module>
+        <module>build-bifromq-starter</module>
     </modules>
 
 </project>
\ No newline at end of file
diff --git a/coverage-report/pom.xml b/coverage-report/pom.xml
index 665a8299..6f42a163 100644
--- a/coverage-report/pom.xml
+++ b/coverage-report/pom.xml
@@ -24,7 +24,7 @@
     <parent>
         <artifactId>bifromq-parent</artifactId>
         <groupId>org.apache.bifromq</groupId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
     <packaging>pom</packaging>
diff --git a/pom.xml b/pom.xml
index 7a0cc21c..51429ec2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -25,12 +25,12 @@
         <groupId>org.apache</groupId>
         <artifactId>apache</artifactId>
         <version>29</version>
-        <relativePath />
+        <relativePath/>
     </parent>
 
     <groupId>org.apache.bifromq</groupId>
     <artifactId>bifromq-parent</artifactId>
-    <version>4.0.0-SNAPSHOT</version>
+    <version>${revision}</version>
     <modules>
         <module>base-env</module>
         <module>base-cluster</module>
@@ -65,7 +65,8 @@
 
     <name>BifroMQ</name>
     <url>https://github.com/apache/bifromq</url>
-    <description>BifroMQ(Incubation) is a distributed MQTT broker 
implementation with native multi-tenancy support</description>
+    <description>BifroMQ(Incubation) is a distributed MQTT broker 
implementation with native multi-tenancy support
+    </description>
 
     <scm>
         <url>https://github.com/apache/bifromq</url>
@@ -102,6 +103,7 @@
     </mailingLists>
 
     <properties>
+        <revision>4.0.0-SNAPSHOT</revision>
         <apache.commons.cli.version>1.5.0</apache.commons.cli.version>
         
<apache.commons.collections.version>4.4</apache.commons.collections.version>
         <bouncycastle.version>1.78.1</bouncycastle.version>
diff --git a/release/release.sh b/release/release.sh
new file mode 100755
index 00000000..21952b47
--- /dev/null
+++ b/release/release.sh
@@ -0,0 +1,131 @@
+#!/usr/bin/env bash
+
+#
+# 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.
+#
+
+
+# Print usage information
+usage() {
+  cat <<EOF
+Usage: $(basename "$0") <release-branch> [<svn-username> <svn-password>]
+  <release-branch>   Release branch in format release-v<major>.<minor>.x (e.g. 
release-v4.0.x)
+  <svn-username>      (Optional) SVN username for committing to Apache Dev repo
+  <svn-password>      (Optional) SVN password for committing to Apache Dev repo
+
+Example:
+  $(basename "$0") release-v4.0.x my_user my_password
+EOF
+}
+
+# Show help if no arguments or help flag is given
+if [[ $# -lt 1 || "$1" == "-h" || "$1" == "--help" ]]; then
+  usage
+  exit 0
+fi
+
+set -e
+
+# =====================================================
+# BifroMQ ASF Release Tool
+# =====================================================
+
+PROJECT_NAME="bifromq"
+ASF_SVN_DEV_URL="https://dist.apache.org/repos/dist/dev/incubator/${PROJECT_NAME}";
+
+BRANCH="$1"
+USERNAME=$2
+PASSWORD=$3
+
+if [[ ! "$BRANCH" =~ ^release-v([0-9]+)\.([0-9]+)\.x$ ]]; then
+  echo "ERROR: Branch name must follow release-v<major>.<minor>.x format (e.g. 
release-v4.0.x)"
+  exit 1
+fi
+
+MAJOR="${BASH_REMATCH[1]}"
+MINOR="${BASH_REMATCH[2]}"
+MAJOR_MINOR="${MAJOR}.${MINOR}"
+
+WORKDIR=$(pwd)
+TMPDIR=$(mktemp -d)
+trap 'rm -rf "$TMPDIR"' EXIT
+
+command -v gpg >/dev/null || { echo "GPG is required but not installed."; exit 
1; }
+
+echo "Cloning repository..."
+cd "$TMPDIR"
+git clone https://github.com/apache/${PROJECT_NAME}.git repo
+cd repo
+git checkout "$BRANCH"
+
+echo "Locating latest tag for branch $BRANCH..."
+LATEST_TAG=$(git tag --list "v${MAJOR_MINOR}.*" --sort=-v:refname | head -n 1)
+if [ -z "$LATEST_TAG" ]; then
+  echo "ERROR: No matching tag found."
+  exit 1
+fi
+echo "Found tag: $LATEST_TAG"
+git checkout "$LATEST_TAG"
+
+# remove prefix 'v' from tag
+VERSION="${LATEST_TAG#v}"
+
+POM_VERSION=$(xmllint --xpath "string(//project/properties/revision)" pom.xml)
+if [ "$POM_VERSION" != "$VERSION" ]; then
+  echo "ERROR: POM revision ($POM_VERSION) doesn't match tag version 
($VERSION)"
+  exit 1
+fi
+
+echo "ASF required file check..."
+for f in LICENSE NOTICE DISCLAIMER; do
+  [ -f "$f" ] || { echo "Missing $f file."; exit 1; }
+done
+
+SRC_DIR="${PROJECT_NAME}-${VERSION}-src"
+SRC_TARBALL="${SRC_DIR}.tar.gz"
+git archive --format=tar.gz --prefix="${SRC_DIR}/" -o "$WORKDIR/$SRC_TARBALL" 
"$LATEST_TAG"
+
+echo "Building binary via Maven..."
+mvn clean package -DskipTests
+
+cd "$WORKDIR"
+cp "$TMPDIR/repo/target/output/bifromq-*.*" "${WORKDIR}"
+
+cd "$WORKDIR"
+find . -maxdepth 1 -type f ! -name '*.asc' ! -name '*.sha512' -print0 | while 
IFS= read -r -d '' ARTIFACT; do
+  gpg --armor --output "${ARTIFACT}.asc" --detach-sign "$ARTIFACT"
+  shasum -a 512 "$ARTIFACT" > "${ARTIFACT}.sha512"
+done
+
+SVN_TMP=$(mktemp -d)
+svn checkout "$ASF_SVN_DEV_URL" "$SVN_TMP"
+mkdir -p "$SVN_TMP/$VERSION"
+cp "$WORKDIR"/* "$SVN_TMP/$VERSION/"
+cd "$SVN_TMP"
+svn add --force "$VERSION"
+svn status
+
+if [ "$USERNAME" = "" ]; then
+  svn commit -m "Add release ${VERSION}" || exit
+else
+  svn commit -m "Add release ${VERSION}" --username "${USERNAME}" --password 
"${PASSWORD}" || exit
+fi
+
+echo "========================================================="
+echo "BifroMQ release $VERSION has been successfully created."
+echo "========================================================="
\ No newline at end of file
diff --git a/testsuites/pom.xml b/testsuites/pom.xml
index f1f42664..c69f919c 100644
--- a/testsuites/pom.xml
+++ b/testsuites/pom.xml
@@ -25,7 +25,7 @@
     <parent>
         <groupId>org.apache.bifromq</groupId>
         <artifactId>bifromq-parent</artifactId>
-        <version>4.0.0-SNAPSHOT</version>
+        <version>${revision}</version>
     </parent>
 
     <artifactId>testsuites</artifactId>


Reply via email to