1.修改mvn publish文件
diff --git a/.github/workflows/maven-publish.yml b/.github/workflows/maven-publish.yml
index 6431cd8..b862f9e 100644
--- a/.github/workflows/maven-publish.yml
+++ b/.github/workflows/maven-publish.yml
@@ -17,8 +17,16 @@
       - name: Create RocketMQ container
         run: |
           docker pull apache/rocketmq:4.9.4
+          echo 'brokerClusterName = DefaultCluster
+                brokerName = broker-a
+                brokerId = 0
+                deleteWhen = 04
+                fileReservedTime = 48
+                brokerRole = ASYNC_MASTER
+                flushDiskType = ASYNC_FLUSH
+                brokerIP1 =127.0.0.1'>>./broker.conf
           docker run -d --name rmqnamesrv -p 9876:9876 apache/rocketmq:4.9.4 sh mqnamesrv autoCreateTopicEnable=true
-          docker run -d --name rmqbroker -p 10911:10911 -p 10909:10909 -e "NAMESRV_ADDR=127.0.0.1:9876" apache/rocketmq:4.9.4 sh mqbroker autoCreateTopicEnable=true
+          docker run -d --name rmqbroker -p 10911:10911 -p 10909:10909 --link rmqnamesrv:namesrv -v ./broker.conf:/opt/rocketmq:4.9.4/conf/broker.conf -e "NAMESRV_ADDR=rmqnamesrv:9876" apache/rocketmq:4.9.4 sh mqbroker autoCreateTopicEnable=true -c /opt/rocketmq-4.4.0/conf/broker.conf
 
       - name: Wait for RocketMQ namesrv container to be ready
         run: |
diff --git a/pom.xml b/pom.xml
index f3d1bcb..dd83d24 100644
--- a/pom.xml
+++ b/pom.xml
@@ -113,6 +113,11 @@
             <!-- Project Modules-->
             <dependency>
                 <groupId>org.apache.rocketmq</groupId>
+                <artifactId>rocketmq-eventbridge-start</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.rocketmq</groupId>
                 <artifactId>rocketmq-eventbridge-adapter-persistence</artifactId>
                 <version>${project.version}</version>
             </dependency>
@@ -157,6 +162,12 @@
                 <version>${project.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>org.apache.rocketmq</groupId>
+                <artifactId>rocketmq-eventbridge-e2etest</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+
             <!-- Framework -->
             <dependency>
                 <groupId>org.springframework.boot</groupId>
diff --git a/start/pom.xml b/start/pom.xml
index e1e1995..a7e115d 100644
--- a/start/pom.xml
+++ b/start/pom.xml
@@ -91,7 +91,7 @@
         </dependency>
     </dependencies>
 
-    <build>
+   <!-- <build>
         <finalName>rocketmq-eventbridge</finalName>
         <resources>
             <resource>
@@ -125,11 +125,11 @@
                             <goal>repackage</goal>
                         </goals>
                         <configuration>
-                            <mainClass>org.apache.rocketmq.eventbridge.Main</mainClass>
+                            <mainClass>org.apache.rocketmq.eventbridge.StartMain</mainClass>
                         </configuration>
                     </execution>
                 </executions>
             </plugin>
         </plugins>
-    </build>
+    </build>-->
 </project>
\ No newline at end of file
diff --git a/test/pom.xml b/test/pom.xml
index 12f4a80..c51e371 100644
--- a/test/pom.xml
+++ b/test/pom.xml
@@ -23,6 +23,7 @@
 
     <modules>
         <module>demo</module>
+        <module>rocketmq-eventbridge-e2etest</module>
     </modules>
 
 </project>
\ No newline at end of file
diff --git a/test/rocketmq-eventbridge-e2etest/pom.xml b/test/rocketmq-eventbridge-e2etest/pom.xml
new file mode 100644
index 0000000..8ded330
--- /dev/null
+++ b/test/rocketmq-eventbridge-e2etest/pom.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>rocketmq-eventbridge-test</artifactId>
+        <groupId>org.apache.rocketmq</groupId>
+        <version>1.0.0</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>rocketmq-eventbridge-e2etest</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.rocketmq</groupId>
+            <artifactId>rocketmq-eventbridge-start</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.13.2</version>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.ow2.asm</groupId>
+                    <artifactId>asm</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/test/rocketmq-eventbridge-e2etest/src/test/java/org/apache/rocketmq/eventbridge/e2etest/BaseTest.java b/test/rocketmq-eventbridge-e2etest/src/test/java/org/apache/rocketmq/eventbridge/e2etest/BaseTest.java
new file mode 100644
index 0000000..5e6248e
--- /dev/null
+++ b/test/rocketmq-eventbridge-e2etest/src/test/java/org/apache/rocketmq/eventbridge/e2etest/BaseTest.java
@@ -0,0 +1,95 @@
+package org.apache.rocketmq.eventbridge.e2etest;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.Version;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonMappingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import org.junit.Assert;
+import org.junit.Before;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.web.client.TestRestTemplate;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Map;
+
+public class BaseTest {
+
+    protected final static ObjectMapper mapper = new ObjectMapper();
+
+    static {
+        SimpleModule m = new SimpleModule("WorkflowJob", Version.unknownVersion());
+        mapper.registerModule(m);
+
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+    }
+
+    protected URL baseUrl;
+
+    @LocalServerPort
+    protected int port;
+
+    @Autowired
+    protected TestRestTemplate template;
+
+    @Before
+    public void setUp() throws Exception {
+        this.baseUrl = new URL("http://localhost:" + port);
+    }
+
+    protected <T> T parseDataFromResponse(ResponseEntity<Object> response, Class<T> dataType, Map<Class, Class> modelMapping) {
+        Assert.assertEquals(HttpStatus.OK, response.getStatusCode());
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+        try {
+            for (Map.Entry<Class, Class> e : modelMapping.entrySet()) {
+                SimpleModule model = new SimpleModule(e.getKey().getSimpleName(), Version.unknownVersion());
+                model.addAbstractTypeMapping(e.getKey(), e.getValue());
+                mapper.registerModule(model);
+            }
+            return mapper.readValue(mapper.writeValueAsString(response.getBody()), dataType);
+        } catch (JsonParseException e) {
+            e.printStackTrace();
+            Assert.fail(e.toString());
+        } catch (JsonMappingException e) {
+            e.printStackTrace();
+            Assert.fail(e.toString());
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            Assert.fail(e.toString());
+        } catch (IOException e) {
+            e.printStackTrace();
+            Assert.fail(e.toString());
+        }
+
+        return null;
+    }
+
+    protected <T> T parseDataFromResponse(ResponseEntity<Object> response, Class<T> dataType) {
+        Assert.assertEquals(HttpStatus.OK, response.getStatusCode());
+
+        try {
+            return mapper.readValue(mapper.writeValueAsString(response.getBody()), dataType);
+        } catch (JsonParseException e) {
+            e.printStackTrace();
+            Assert.fail(e.toString());
+        } catch (JsonMappingException e) {
+            e.printStackTrace();
+            Assert.fail(e.toString());
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+            Assert.fail(e.toString());
+        } catch (IOException e) {
+            e.printStackTrace();
+            Assert.fail(e.toString());
+        }
+
+        return null;
+    }
+}
diff --git a/test/rocketmq-eventbridge-e2etest/src/test/java/org/apache/rocketmq/eventbridge/e2etest/controller/ApplicationTagControllerTest.java b/test/rocketmq-eventbridge-e2etest/src/test/java/org/apache/rocketmq/eventbridge/e2etest/controller/ApplicationTagControllerTest.java
new file mode 100644
index 0000000..0f5446e
--- /dev/null
+++ b/test/rocketmq-eventbridge-e2etest/src/test/java/org/apache/rocketmq/eventbridge/e2etest/controller/ApplicationTagControllerTest.java
@@ -0,0 +1,32 @@
+package org.apache.rocketmq.eventbridge.e2etest.controller;
+
+import org.apache.rocketmq.eventbridge.Main;
+import org.apache.rocketmq.eventbridge.e2etest.BaseTest;
+import org.apache.rocketmq.eventbridge.e2etest.util.Utils;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = Main.class)
+public class ApplicationTagControllerTest extends BaseTest {
+
+    @Test
+    public void testGetAllApplicationTags() {
+        String url = String.format("%s/bus/createEventBus", baseUrl);
+        Map<String, String> maps = new HashMap<>();
+        maps.put("eventBusName", "demo-bus");
+        maps.put("description", "a demo bus.");
+        ResponseEntity<Void> response = Utils.request(template, url, HttpMethod.POST, maps, Void.class);
+        Assert.assertTrue(response.getStatusCode().is2xxSuccessful());
+    }
+
+
+}
diff --git a/test/rocketmq-eventbridge-e2etest/src/test/java/org/apache/rocketmq/eventbridge/e2etest/util/Utils.java b/test/rocketmq-eventbridge-e2etest/src/test/java/org/apache/rocketmq/eventbridge/e2etest/util/Utils.java
new file mode 100644
index 0000000..cc29fe7
--- /dev/null
+++ b/test/rocketmq-eventbridge-e2etest/src/test/java/org/apache/rocketmq/eventbridge/e2etest/util/Utils.java
@@ -0,0 +1,62 @@
+package org.apache.rocketmq.eventbridge.e2etest.util;
+
+import org.springframework.boot.test.web.client.TestRestTemplate;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+
+import java.io.IOException;
+import java.util.Map;
+
+public class Utils {
+
+	public static <T> ResponseEntity<T> request(TestRestTemplate template, String url, HttpMethod method, Object body, Class<T> clazz) {
+		HttpHeaders headers = devHeaders();
+
+		HttpEntity entity = new HttpEntity(body, headers);
+		return template.exchange(url, method, entity, clazz);
+	}
+
+	public static <T> ResponseEntity<T> requestByGet(TestRestTemplate template, String url, Map<String,Object> args, Class<T> clazz) {
+		return template.getForEntity(url, clazz ,args);
+	}
+
+	public static <T> ResponseEntity<T> requestAsAdmin(TestRestTemplate template, String url, HttpMethod method, Object body, Class<T> clazz) {
+		HttpHeaders headers = new HttpHeaders();
+		headers.add("X-AI-USER", "admin");
+
+		HttpEntity entity = new HttpEntity(body, headers);
+		return template.exchange(url, method, entity, clazz);
+	}
+
+	public static <T> ResponseEntity<T> request(TestRestTemplate template, String url, String fileKey, String file, Class<T> clazz, Object... urlVariables) throws IOException {
+		HttpHeaders headers = devHeaders();
+		headers.setContentType(MediaType.MULTIPART_FORM_DATA);
+
+		MultiValueMap<String, Object> multipartRequest = new LinkedMultiValueMap<>();
+		multipartRequest.add(fileKey, new ClassPathResource(file));
+		HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(multipartRequest, headers);
+
+		return template.exchange(url, HttpMethod.POST, entity, clazz, urlVariables);
+	}
+
+	private static HttpHeaders devHeaders() {
+		HttpHeaders headers = new HttpHeaders();
+		headers.add("X-AI-USER", "developer");
+
+		return headers;
+	}
+
+	public static <T> ResponseEntity<T> requestAsWanyaWu(TestRestTemplate template, String url, HttpMethod method, Object body, Class<T> clazz) {
+		HttpHeaders headers = new HttpHeaders();
+		headers.add("X-AI-USER", "vanya.wu");
+
+		HttpEntity entity = new HttpEntity(body, headers);
+		return template.exchange(url, method, entity, clazz);
+	}
+}