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

liujun pushed a commit to branch dubbo-customized-version-main
in repository https://gitbox.apache.org/repos/asf/dubbo-initializer.git

commit 7f11b66580d8d5bb898fbda3b5d97aaefde5b6dd
Author: chickenlj <[email protected]>
AuthorDate: Wed Apr 12 01:54:16 2023 +0800

    customized dubbo initializer
---
 .../InitializerMetadataV2JsonMapper.java           |   1 +
 ...alizerProjectRequestToDescriptionConverter.java |  23 ++
 .../initializer/controller/ProjectRequest.java     |   2 +
 .../extension/SampleCodeContributor.java           |  19 +-
 .../ArchedMavenProjectGenerationConfiguration.java |   2 +-
 .../MulitModuleMavenBuildProjectContributor.java   |   2 +-
 .../initializer/metadata/InitializerMetadata.java  |  19 ++
 .../metadata/InitializerMetadataBuilder.java       |   1 +
 .../metadata/InitializerProperties.java            |   7 +
 .../alibaba/initializer/start/web/WebConfig.java   |   2 +-
 .../ConditionalOnDubboIdlDependency.java}          |  24 +-
 .../generation/condition/OnDubboIdlCondition.java  |  47 +++
 .../maven/DefaultMavenDependenciesCustomizer.java  |   6 -
 .../DubboMavenProjectGenerationConfiguration.java  |  17 +-
 .../build/maven/IdlMavenPluginCustomizer.java      |  45 +++
 .../codes/DubboSampleCodeContributor.java          |   3 +
 ...boSourceCodeProjectGenerationConfiguration.java |   3 +-
 ...terZookeeperProjectGenerationConfiguration.java |   2 -
 .../src/main/resources/metadata.yaml               | 348 ++++++++-------------
 .../java/DemoServiceImpl.java.mustache             |   2 +-
 .../resources/application.properties.mustache      |   8 +-
 .../codes/dubbo/api/java/DemoService.java.mustache |   2 +-
 .../codes/dubbo/java/DemoServiceImpl.java.mustache |   4 +-
 .../resources/application.properties.mustache      |   2 +-
 initializer-page/dev/api.json                      |   9 +
 initializer-page/public/bootstrap.html             |   2 +-
 initializer-page/src/components/Application.js     |  46 +--
 .../src/components/common/builder/Warnings.js      |   8 +
 .../common/builder/quick-search/QuickSearch.js     |   2 +-
 .../src/components/common/layout/Header.js         |   4 +-
 .../src/components/common/layout/QuickLinks.js     |  36 ++-
 .../src/components/reducer/Initializr.js           |   1 +
 .../src/components/reducer/__tests__/Initializr.js |   3 +-
 initializer-page/src/components/utils/ApiUtils.js  |   8 +
 .../src/components/utils/__tests__/ApiUtils.js     |  12 +-
 initializer-page/src/images/aliyun-icon.png        | Bin 4284 -> 0 bytes
 initializer-page/src/images/dubbo_colorful.png     | Bin 0 -> 2529 bytes
 initializer-page/src/images/dubbo_white.png        | Bin 0 -> 1150 bytes
 initializer-page/static/bootstrap.html             |   4 +-
 initializer-page/static/images/favicon.ico         | Bin 0 -> 16958 bytes
 initializer-page/webpack.common.js                 |  14 +-
 41 files changed, 450 insertions(+), 290 deletions(-)

diff --git 
a/initializer-generator/src/main/java/com/alibaba/initializer/controller/InitializerMetadataV2JsonMapper.java
 
b/initializer-generator/src/main/java/com/alibaba/initializer/controller/InitializerMetadataV2JsonMapper.java
index fd2646b..b9e1f78 100644
--- 
a/initializer-generator/src/main/java/com/alibaba/initializer/controller/InitializerMetadataV2JsonMapper.java
+++ 
b/initializer-generator/src/main/java/com/alibaba/initializer/controller/InitializerMetadataV2JsonMapper.java
@@ -76,6 +76,7 @@ public class InitializerMetadataV2JsonMapper extends 
InitializrMetadataV2JsonMap
         singleSelect(delegate, metadata.getJavaVersions());
         singleSelect(delegate, metadata.getLanguages());
         singleSelect(delegate, metadata.getBootVersions());
+        singleSelect(delegate, ((InitializerMetadata) 
metadata).getDubboVersions());
         text(delegate, metadata.getGroupId());
         text(delegate, metadata.getArtifactId());
         text(delegate, metadata.getVersion());
diff --git 
a/initializer-generator/src/main/java/com/alibaba/initializer/controller/InitializerProjectRequestToDescriptionConverter.java
 
b/initializer-generator/src/main/java/com/alibaba/initializer/controller/InitializerProjectRequestToDescriptionConverter.java
index 8d858a7..d1930c8 100644
--- 
a/initializer-generator/src/main/java/com/alibaba/initializer/controller/InitializerProjectRequestToDescriptionConverter.java
+++ 
b/initializer-generator/src/main/java/com/alibaba/initializer/controller/InitializerProjectRequestToDescriptionConverter.java
@@ -16,6 +16,7 @@
 
 package com.alibaba.initializer.controller;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -38,6 +39,7 @@ import 
io.spring.initializr.web.project.InvalidProjectRequestException;
 import io.spring.initializr.web.project.ProjectRequestToDescriptionConverter;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.util.CollectionUtils;
 
 /**
  * copyed from {@link DefaultProjectRequestToDescriptionConverter} and add some
@@ -49,8 +51,22 @@ import org.apache.commons.lang3.StringUtils;
 public class InitializerProjectRequestToDescriptionConverter
         implements ProjectRequestToDescriptionConverter<ProjectRequest> {
 
+    private void customizeMetadataBasedOnDubboVersion(ProjectRequest request, 
InitializrMetadata metadata) {
+        String dubboVersion = request.getDubboVersion();
+        metadata.getConfiguration().getEnv().getBoms().forEach((k, v) -> {
+            if (k.contains("dubbo")) {
+                if (v.getMappings().get(0) != null) {
+                    v.getMappings().get(0).setVersion(dubboVersion);
+                }
+            }
+        });
+    }
+
+
     @Override
     public ProjectDescription convert(ProjectRequest request, 
InitializrMetadata metadata) {
+        customizeMetadataBasedOnDubboVersion(request, metadata);
+
         InitializerProjectDescription description = new 
InitializerProjectDescription();
         doConvert(request, description, metadata);
         doAddition(request, description, metadata);
@@ -209,6 +225,13 @@ public class 
InitializerProjectRequestToDescriptionConverter
 
     private List<Dependency> 
getResolvedDependencies(io.spring.initializr.web.project.ProjectRequest 
request, String springBootVersion, InitializrMetadata metadata) {
         List<String> depIds = request.getDependencies();
+        // If user click 'generate' button directly without adding any 
dependency.
+        if (CollectionUtils.isEmpty(depIds)) {
+            depIds = new ArrayList<>();
+            depIds.add("dubbo");
+            depIds.add("dubbo-zookeeper");
+            depIds.add("dubbo-tcp");
+        }
         Version requestedVersion = Version.parse(springBootVersion);
         return depIds.stream().map((it) -> {
             Dependency dependency = metadata.getDependencies().get(it);
diff --git 
a/initializer-generator/src/main/java/com/alibaba/initializer/controller/ProjectRequest.java
 
b/initializer-generator/src/main/java/com/alibaba/initializer/controller/ProjectRequest.java
index 60680ce..0a3650d 100644
--- 
a/initializer-generator/src/main/java/com/alibaba/initializer/controller/ProjectRequest.java
+++ 
b/initializer-generator/src/main/java/com/alibaba/initializer/controller/ProjectRequest.java
@@ -29,4 +29,6 @@ public class ProjectRequest extends WebProjectRequest {
 
     private String architecture;
 
+    private String dubboVersion = "3.1.8";
+
 }
diff --git 
a/initializer-generator/src/main/java/com/alibaba/initializer/generation/extension/SampleCodeContributor.java
 
b/initializer-generator/src/main/java/com/alibaba/initializer/generation/extension/SampleCodeContributor.java
index b1ede7b..b4e7279 100644
--- 
a/initializer-generator/src/main/java/com/alibaba/initializer/generation/extension/SampleCodeContributor.java
+++ 
b/initializer-generator/src/main/java/com/alibaba/initializer/generation/extension/SampleCodeContributor.java
@@ -107,12 +107,19 @@ public class SampleCodeContributor implements 
ProjectContributor {
 
         Map<Dependency, String> dependencyRepoUris = getRepos(description);
         List<String> uris = new ArrayList<>();
-        dependencyRepoUris.values().forEach(uri -> {
-            if (module.isMain())
-                uris.add(uri);
-            else
-                uris.add(uri + "/" + module.getName());
-        });
+        if (architecture.getId().equals("none")) {
+            dependencyRepoUris.values().forEach(uri -> {
+                    uris.add(uri);
+                    uris.add(uri + "/api");
+            });
+        } else {
+            dependencyRepoUris.values().forEach(uri -> {
+                if (module.isMain())
+                    uris.add(uri);
+                else
+                    uris.add(uri + "/" + module.getName());
+            });
+        }
         uris.forEach(uri -> {
             CodeTemplateRepo repo = loader.load(uri);
             RepoRenderResult result = renderer.render(repo, params);
diff --git 
a/initializer-generator/src/main/java/com/alibaba/initializer/generation/extension/build/maven/ArchedMavenProjectGenerationConfiguration.java
 
b/initializer-generator/src/main/java/com/alibaba/initializer/generation/extension/build/maven/ArchedMavenProjectGenerationConfiguration.java
index 5cd2719..58d789c 100644
--- 
a/initializer-generator/src/main/java/com/alibaba/initializer/generation/extension/build/maven/ArchedMavenProjectGenerationConfiguration.java
+++ 
b/initializer-generator/src/main/java/com/alibaba/initializer/generation/extension/build/maven/ArchedMavenProjectGenerationConfiguration.java
@@ -84,7 +84,7 @@ public class ArchedMavenProjectGenerationConfiguration {
 
     @Bean
     public MulitModuleMavenBuildProjectContributor 
mulitModuleavenBuildProjectContributor(
-            MavenBuild build, IndentingWriterFactory 
indentingWriterFactory,InitializrMetadata metadata) {
+            MavenBuild build, IndentingWriterFactory indentingWriterFactory, 
InitializrMetadata metadata) {
         return new MulitModuleMavenBuildProjectContributor(build, 
indentingWriterFactory, metadata);
     }
 
diff --git 
a/initializer-generator/src/main/java/com/alibaba/initializer/generation/extension/build/maven/MulitModuleMavenBuildProjectContributor.java
 
b/initializer-generator/src/main/java/com/alibaba/initializer/generation/extension/build/maven/MulitModuleMavenBuildProjectContributor.java
index 824dd4b..e5b29ec 100644
--- 
a/initializer-generator/src/main/java/com/alibaba/initializer/generation/extension/build/maven/MulitModuleMavenBuildProjectContributor.java
+++ 
b/initializer-generator/src/main/java/com/alibaba/initializer/generation/extension/build/maven/MulitModuleMavenBuildProjectContributor.java
@@ -65,7 +65,7 @@ public class MulitModuleMavenBuildProjectContributor extends 
MavenBuildProjectCo
         this.metadata = metadata;
         this.buildWriter = new MulitModuleMavenBuildWriter(metadata);
 
-        // use reflext to replace MavenBuildWriter
+        // use reflection to replace MavenBuildWriter
         try {
             Field buildWriterField = 
MavenBuildProjectContributor.class.getDeclaredField("buildWriter");
             buildWriterField.setAccessible(true);
diff --git 
a/initializer-generator/src/main/java/com/alibaba/initializer/metadata/InitializerMetadata.java
 
b/initializer-generator/src/main/java/com/alibaba/initializer/metadata/InitializerMetadata.java
index 581b462..234345b 100644
--- 
a/initializer-generator/src/main/java/com/alibaba/initializer/metadata/InitializerMetadata.java
+++ 
b/initializer-generator/src/main/java/com/alibaba/initializer/metadata/InitializerMetadata.java
@@ -21,6 +21,7 @@ import java.util.Map;
 import io.spring.initializr.metadata.DefaultMetadataElement;
 import io.spring.initializr.metadata.Defaultable;
 import io.spring.initializr.metadata.InitializrMetadata;
+import io.spring.initializr.metadata.SingleSelectCapability;
 
 /**
  * @author <a href="mailto:[email protected]";>theonefx</a>
@@ -32,6 +33,12 @@ public class InitializerMetadata extends InitializrMetadata {
             "application architecture",
             "the architecture of application");
 
+    private final SingleSelectCapability dubboVersions = new 
SingleSelectCapability(
+            "dubboVersion",
+            "Apache Dubbo Version",
+            "apache dubbo version");
+
+
     protected InitializerMetadata(InitializerProperties configuration) {
         super(configuration);
     }
@@ -39,9 +46,17 @@ public class InitializerMetadata extends InitializrMetadata {
     public Map<String, Object> defaults() {
         Map<String, Object> defaults = super.defaults();
         defaults.put("architecture", defaultId(this.architecture));
+        defaults.put("dubboVersion", defaultId(this.dubboVersions));
         return defaults;
     }
 
+    public void merge(InitializrMetadata other) {
+        super.merge(other);
+        InitializerMetadata initializerMetadata = (InitializerMetadata) other;
+        this.architecture.merge(initializerMetadata.architecture);
+        this.dubboVersions.merge(initializerMetadata.dubboVersions);
+    }
+
     private static String defaultId(Defaultable<? extends 
DefaultMetadataElement> element) {
         DefaultMetadataElement defaultValue = element.getDefault();
         return (defaultValue != null) ? defaultValue.getId() : null;
@@ -51,6 +66,10 @@ public class InitializerMetadata extends InitializrMetadata {
         return this.architecture;
     }
 
+    public SingleSelectCapability getDubboVersions() {
+        return dubboVersions;
+    }
+
     public InitializerProperties getInitializerConfiguration() {
         return (InitializerProperties) getConfiguration();
     }
diff --git 
a/initializer-generator/src/main/java/com/alibaba/initializer/metadata/InitializerMetadataBuilder.java
 
b/initializer-generator/src/main/java/com/alibaba/initializer/metadata/InitializerMetadataBuilder.java
index eba2b00..924a7f9 100644
--- 
a/initializer-generator/src/main/java/com/alibaba/initializer/metadata/InitializerMetadataBuilder.java
+++ 
b/initializer-generator/src/main/java/com/alibaba/initializer/metadata/InitializerMetadataBuilder.java
@@ -106,6 +106,7 @@ public class InitializerMetadataBuilder {
         public void customize(InitializrMetadata metadata) {
             InitializerMetadata initializerMetadata = (InitializerMetadata) 
metadata;
             
initializerMetadata.getArchitecture().merge(this.properties.getArchitecture());
+            
initializerMetadata.getDubboVersions().merge(this.properties.getDubboVersions());
             initializerMetadata.getDependencies().merge(new 
ArrayList<>(this.properties.getDependencies()));
             metadata.getTypes().merge(this.properties.getTypes());
             
metadata.getBootVersions().merge(this.properties.getBootVersions());
diff --git 
a/initializer-generator/src/main/java/com/alibaba/initializer/metadata/InitializerProperties.java
 
b/initializer-generator/src/main/java/com/alibaba/initializer/metadata/InitializerProperties.java
index 5b928fa..21a6bb9 100644
--- 
a/initializer-generator/src/main/java/com/alibaba/initializer/metadata/InitializerProperties.java
+++ 
b/initializer-generator/src/main/java/com/alibaba/initializer/metadata/InitializerProperties.java
@@ -76,6 +76,9 @@ public class InitializerProperties extends 
InitializrConfiguration {
     @JsonIgnore
     private final List<DefaultMetadataElement> bootVersions = new 
ArrayList<>();
 
+    @JsonIgnore
+    private final List<DefaultMetadataElement> dubboVersions = new 
ArrayList<>();
+
     /**
      * GroupId metadata.
      */
@@ -140,6 +143,10 @@ public class InitializerProperties extends 
InitializrConfiguration {
         return this.bootVersions;
     }
 
+    public List<DefaultMetadataElement> getDubboVersions() {
+        return dubboVersions;
+    }
+
     public InitializrProperties.SimpleElement getGroupId() {
         return this.groupId;
     }
diff --git 
a/initializer-generator/src/main/java/com/alibaba/initializer/start/web/WebConfig.java
 
b/initializer-generator/src/main/java/com/alibaba/initializer/start/web/WebConfig.java
index c3ccc64..f2677c5 100644
--- 
a/initializer-generator/src/main/java/com/alibaba/initializer/start/web/WebConfig.java
+++ 
b/initializer-generator/src/main/java/com/alibaba/initializer/start/web/WebConfig.java
@@ -38,7 +38,7 @@ public class WebConfig implements WebMvcConfigurer {
     static private final Set<String> ALLOWED_ORIGIN_HTTP = new HashSet<>();
 
     static {
-        ALLOWED_ORIGIN_HTTP.add("https://start.dubbo.apachr.org";);
+        ALLOWED_ORIGIN_HTTP.add("https://start.dubbo.apache.org";);
     }
 
     @Bean
diff --git 
a/initializer-generator/src/main/java/com/alibaba/initializer/controller/ProjectRequest.java
 
b/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/condition/ConditionalOnDubboIdlDependency.java
similarity index 54%
copy from 
initializer-generator/src/main/java/com/alibaba/initializer/controller/ProjectRequest.java
copy to 
initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/condition/ConditionalOnDubboIdlDependency.java
index 60680ce..1e5223f 100644
--- 
a/initializer-generator/src/main/java/com/alibaba/initializer/controller/ProjectRequest.java
+++ 
b/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/condition/ConditionalOnDubboIdlDependency.java
@@ -14,19 +14,23 @@
  * limitations under the License.
  */
 
-package com.alibaba.initializer.controller;
+package org.apache.dubbo.initializer.generation.condition;
 
-import io.spring.initializr.web.project.WebProjectRequest;
-import lombok.Getter;
-import lombok.Setter;
+import org.springframework.context.annotation.Conditional;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 
 /**
- * @author <a href="mailto:[email protected]";>theonefx</a>
+ * @author Weix Sun
  */
-@Getter
-@Setter
-public class ProjectRequest extends WebProjectRequest {
-
-    private String architecture;
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ ElementType.TYPE, ElementType.METHOD })
+@Documented
+@Conditional(OnDubboIdlCondition.class)
+public @interface ConditionalOnDubboIdlDependency {
 
 }
diff --git 
a/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/condition/OnDubboIdlCondition.java
 
b/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/condition/OnDubboIdlCondition.java
new file mode 100644
index 0000000..17ed992
--- /dev/null
+++ 
b/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/condition/OnDubboIdlCondition.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2022 the original author or authors.
+ *
+ * Licensed 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
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dubbo.initializer.generation.condition;
+
+import com.alibaba.initializer.metadata.Architecture;
+import com.alibaba.initializer.metadata.Module;
+import com.alibaba.initializer.project.InitializerProjectDescription;
+import io.spring.initializr.generator.condition.ProjectGenerationCondition;
+import io.spring.initializr.generator.project.ProjectDescription;
+import org.springframework.context.annotation.ConditionContext;
+import org.springframework.core.type.AnnotatedTypeMetadata;
+
+import java.util.Arrays;
+
+/**
+ * @author Weix Sun
+ */
+public class OnDubboIdlCondition extends ProjectGenerationCondition {
+
+       @Override
+       protected boolean matches(ProjectDescription description, 
ConditionContext context,
+                       AnnotatedTypeMetadata metadata) {
+               InitializerProjectDescription initializerDescriptiuon = 
(InitializerProjectDescription)description;
+               Architecture architecture = 
initializerDescriptiuon.getArchitecture();
+               if (architecture.getId().equals("none")) {
+                       return true;
+               }
+
+               Module module = context.getBeanFactory().getBean(Module.class);
+               String requestModuleName = module.getName() == null && 
module.isRoot() ? "root" : module.getName();
+               return requestModuleName.equals("service");
+       }
+}
diff --git 
a/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/extension/build/maven/DefaultMavenDependenciesCustomizer.java
 
b/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/extension/build/maven/DefaultMavenDependenciesCustomizer.java
index d2ff94a..ebcd58c 100644
--- 
a/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/extension/build/maven/DefaultMavenDependenciesCustomizer.java
+++ 
b/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/extension/build/maven/DefaultMavenDependenciesCustomizer.java
@@ -36,12 +36,6 @@ public class DefaultMavenDependenciesCustomizer implements 
BuildCustomizer<Maven
 
     @Override
     public void customize(MavenBuild build) {
-//        if (build.dependencies().has(DEFAULT_STARTER)) {
-//            build.dependencies().remove(DEFAULT_STARTER);
-//        }
-//        if (build.dependencies().has(TEST_STARTER)) {
-//            build.dependencies().remove(TEST_STARTER);
-//        }
         // Remove all dependencies, after the 'dependencies.bom' analysis is 
completed
         build.dependencies().ids().toList().forEach(id -> 
build.dependencies().remove(id));
     }
diff --git 
a/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/extension/build/maven/DubboMavenProjectGenerationConfiguration.java
 
b/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/extension/build/maven/DubboMavenProjectGenerationConfiguration.java
index 34b6b92..0d74445 100644
--- 
a/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/extension/build/maven/DubboMavenProjectGenerationConfiguration.java
+++ 
b/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/extension/build/maven/DubboMavenProjectGenerationConfiguration.java
@@ -17,22 +17,26 @@
 package org.apache.dubbo.initializer.generation.extension.build.maven;
 
 import 
com.alibaba.initializer.generation.InitializerProjectGenerationConfiguration;
+import com.alibaba.initializer.generation.condition.ConditionalOnArchitectured;
 import 
com.alibaba.initializer.generation.condition.ConditionalOnRequestedArchitecture;
 import io.spring.initializr.generator.buildsystem.maven.MavenBuildSystem;
 import io.spring.initializr.generator.condition.ConditionalOnBuildSystem;
-import io.spring.initializr.generator.project.ProjectGenerationConfiguration;
+
+import 
org.apache.dubbo.initializer.generation.condition.ConditionalOnDubboIdlDependency;
 import 
org.apache.dubbo.initializer.generation.condition.ConditionalOnRequestedModule;
+
+import 
io.spring.initializr.generator.condition.ConditionalOnRequestedDependency;
 import org.springframework.context.annotation.Bean;
 
 /**
  * @author <a href="mailto:[email protected]";>ErDan Wang</a>
  */
 @InitializerProjectGenerationConfiguration
-@ConditionalOnRequestedArchitecture("dubbo")
 @ConditionalOnBuildSystem(MavenBuildSystem.ID)
 public class DubboMavenProjectGenerationConfiguration {
 
     @Bean
+    @ConditionalOnRequestedArchitecture("dubbo")
     @ConditionalOnRequestedModule(value = "api")
     public ApiMavenPluginCustomizer apiMavenPluginCustomizer() {
         return new ApiMavenPluginCustomizer();
@@ -40,15 +44,24 @@ public class DubboMavenProjectGenerationConfiguration {
 
     // Root Maven Bom remove in MulitModuleMavenBuildProjectContributor
     @Bean
+    @ConditionalOnRequestedArchitecture("dubbo")
     @ConditionalOnRequestedModule(value = "root")
     public RootMavenPluginCustomizer rootMavenPluginCustomizer() {
         return new RootMavenPluginCustomizer();
     }
 
     @Bean
+    @ConditionalOnRequestedArchitecture("dubbo")
     @ConditionalOnRequestedModule({"root", "api"})
     public DefaultMavenDependenciesCustomizer 
defaultMavenDependenciesCustomizer() {
         return new DefaultMavenDependenciesCustomizer();
     }
 
+    @Bean
+    @ConditionalOnDubboIdlDependency
+    @ConditionalOnRequestedDependency("dubbo-idl")
+    public IdlMavenPluginCustomizer IdlMavenPluginCustomizer() {
+        return new IdlMavenPluginCustomizer();
+    }
+
 }
diff --git 
a/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/extension/build/maven/IdlMavenPluginCustomizer.java
 
b/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/extension/build/maven/IdlMavenPluginCustomizer.java
new file mode 100644
index 0000000..c8dce73
--- /dev/null
+++ 
b/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/extension/build/maven/IdlMavenPluginCustomizer.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.dubbo.initializer.generation.extension.build.maven;
+
+import io.spring.initializr.generator.buildsystem.maven.MavenBuild;
+import io.spring.initializr.generator.spring.build.BuildCustomizer;
+
+public class IdlMavenPluginCustomizer implements BuildCustomizer<MavenBuild> {
+    @Override
+    public void customize(MavenBuild mavenBuild) {
+        mavenBuild.plugins().add("org.xolstice.maven.plugins", 
"protobuf-maven-plugin", builder -> {
+            builder.version("0.6.1")
+                    .execution("protoc-compile", executionBuilder -> {
+                        
executionBuilder.goal("compile").goal("test-compile").goal("compile-custom").goal("test-compile-custom");
+                    })
+                    .configuration(configurationBuilder -> {
+                        configurationBuilder.add("protocArtifact", 
"com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}");
+                        configurationBuilder.add("grpc-java", 
"io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}");
+                        configurationBuilder.add("protocPlugins", 
protocPluginsBuilder -> {
+                            protocPluginsBuilder.add("protocPlugin", 
protocPluginBuilder -> {
+                                protocPluginBuilder.add("id", "dubbo");
+                                protocPluginBuilder.add("groupId", 
"dubbo-compiler");
+                                protocPluginBuilder.add("artifactId", 
"${dubbo.version}");
+                                protocPluginBuilder.add("mainClass", 
"org.apache.dubbo.gen.tri.Dubbo3TripleGenerator");
+                            });
+                        });
+                    })
+                    .build();
+        });
+    }
+}
diff --git 
a/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/extension/codes/DubboSampleCodeContributor.java
 
b/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/extension/codes/DubboSampleCodeContributor.java
index 890e4dc..f859f7b 100644
--- 
a/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/extension/codes/DubboSampleCodeContributor.java
+++ 
b/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/extension/codes/DubboSampleCodeContributor.java
@@ -23,6 +23,7 @@ import 
com.alibaba.initializer.core.template.CodeTemplateRepoRenderer;
 import com.alibaba.initializer.core.template.RepoRenderResult;
 import com.alibaba.initializer.core.template.loader.RootRepoTemplateLoader;
 import 
com.alibaba.initializer.generation.constants.BootstrapTemplateRenderConstants;
+import com.alibaba.initializer.generation.extension.SampleCodeContributor;
 import com.alibaba.initializer.metadata.Module;
 import com.alibaba.initializer.metadata.*;
 import com.alibaba.initializer.project.InitializerProjectDescription;
@@ -54,6 +55,8 @@ import java.util.stream.Collectors;
 import static 
com.alibaba.initializer.generation.constants.BootstrapTemplateRenderConstants.KEY_ARTIFACT_ID;
 
 /**
+ * Not enabled for now, please use {@linkplain SampleCodeContributor} instead.
+ *
  * @author @author <a href="mailto:[email protected]";>ErDan Wang</a>
  */
 public class DubboSampleCodeContributor implements ProjectContributor {
diff --git 
a/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/extension/codes/DubboSourceCodeProjectGenerationConfiguration.java
 
b/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/extension/codes/DubboSourceCodeProjectGenerationConfiguration.java
index 96f11a0..3082f04 100644
--- 
a/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/extension/codes/DubboSourceCodeProjectGenerationConfiguration.java
+++ 
b/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/extension/codes/DubboSourceCodeProjectGenerationConfiguration.java
@@ -13,12 +13,11 @@ import 
io.spring.initializr.generator.spring.code.MainApplicationTypeCustomizer;
 import org.springframework.context.annotation.Bean;
 
 @InitializerProjectGenerationConfiguration
-@ConditionalOnRequestedArchitecture("dubbo")
 @ConditionalOnModule(main = true)
 @ConditionalOnLanguage(JavaLanguage.ID)
 public class DubboSourceCodeProjectGenerationConfiguration {
     @Bean
-    @ConditionalOnRequestedDependency("dubbo")
+//    @ConditionalOnRequestedDependency("dubbo")
     public MainApplicationTypeCustomizer<TypeDeclaration> 
enableDubboAnnotator() {
         return (typeDeclaration) -> {
             
typeDeclaration.annotate(Annotation.name("org.apache.dubbo.config.spring.context.annotation.EnableDubbo"));
diff --git 
a/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/extension/dependency/dubbregisterzookeeper/DubboRegisterZookeeperProjectGenerationConfiguration.java
 
b/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/extension/dependency/dubbregisterzookeeper/DubboRegisterZookeeperProjectGenerationConfiguration.java
index a39d539..c7aaf5b 100644
--- 
a/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/extension/dependency/dubbregisterzookeeper/DubboRegisterZookeeperProjectGenerationConfiguration.java
+++ 
b/initializer-generator/src/main/java/org/apache/dubbo/initializer/generation/extension/dependency/dubbregisterzookeeper/DubboRegisterZookeeperProjectGenerationConfiguration.java
@@ -31,10 +31,8 @@ import org.springframework.context.annotation.Bean;
  */
 @ProjectGenerationConfiguration
 @ConditionalOnRequestedDependency("dubbo-register-zookeeper")
-@ConditionalOnRequestedArchitecture("pic")
 class DubboRegisterZookeeperProjectGenerationConfiguration {
 
-
        @Bean
        @ConditionalOnRequestedModule("root")
        DubboRegisterZookeeperBuildCustomizer 
dubboRegisterZookeeperBuildCustomizer() {
diff --git a/initializer-generator/src/main/resources/metadata.yaml 
b/initializer-generator/src/main/resources/metadata.yaml
index 2764ad4..d7a0934 100644
--- a/initializer-generator/src/main/resources/metadata.yaml
+++ b/initializer-generator/src/main/resources/metadata.yaml
@@ -7,7 +7,7 @@ initializr:
         versionProperty: dubbo.version
         mappings:
           - compatibilityRange: "2.3.0.M1"
-            version: 3.0.7
+            version: 3.1.8
       apache-dubbo-zookeeper:
         groupId: org.apache.dubbo
         artifactId: dubbo-dependencies-zookeeper
@@ -15,7 +15,15 @@ initializr:
         additionalBoms: [ apache-dubbo ]
         mappings:
           - compatibilityRange: "2.3.0.M1"
-            version: 3.0.7
+            version: 3.1.8
+      apache-dubbo-zookeeper-curator5:
+        groupId: org.apache.dubbo
+        artifactId: dubbo-dependencies-zookeeper-curator5
+        versionProperty: dubbo.version
+        additionalBoms: [ apache-dubbo ]
+        mappings:
+          - compatibilityRange: "2.3.0.M1"
+            version: 3.1.8
       codecentric-spring-boot-admin:
         groupId: de.codecentric
         artifactId: spring-boot-admin-dependencies
@@ -219,15 +227,34 @@ initializr:
         url: https://oss.sonatype.org/content/repositories/snapshots/
         releasesEnabled: false
         snapshotsEnabled: true
+      apache-snapshots:
+        name: Apache Snapshots
+        url: https://repository.apache.org/content/repositories/snapshots
+        releasesEnabled: false
+        snapshotsEnabled: true
   dependencies:
-    - name: Dubbo Core
+    - name: Dubbo Service API
       bom: apache-dubbo
       content:
-      - name: Dubbo Spring Boot
+      - name: Java Interface (default)
         id: dubbo
         groupId: org.apache.dubbo
         artifactId: dubbo-spring-boot-starter
-        description: Dubbo Spring Boot
+        description: Use java interface as the standard Dubbo service 
definition
+        starter: false
+#        hide: true
+        archCfg:
+          dubbo:
+            modules:
+              api:
+                code: true
+              service:
+                code: true
+      - name: IDL
+        id: dubbo-idl
+        groupId: org.apache.dubbo
+        artifactId: dubbo-spring-boot-starter
+        description: Use IDL as the standard Dubbo service definition
         starter: false
         archCfg:
           dubbo:
@@ -236,37 +263,98 @@ initializr:
                 code: true
               service:
                 code: true
-    - name: Dubbo Registry
+    - name: Dubbo Governance
       content:
-      - name: Zookeeper 注册中心
+      - name: Zookeeper (default)
         id: dubbo-zookeeper
         groupId: org.apache.dubbo
         artifactId: dubbo-dependencies-zookeeper
         type: pom
-        description: 使用Zookeeper作为Dubbo注册中心
+        description: "使用 Zookeeper 作为服务治理中心,可选作为注册中心、配置中心、元数据中心"
         starter: false
         compatibilityRange: "[2.0.0.RELEASE,3.1.0-M1)"
         bom: apache-dubbo-zookeeper
         codeOnly: false
-        #dependencies: [ "metrics-core" ]
-      - name: metrics-core
-        id: metrics-core
-        groupId: io.dropwizard.metrics
-        artifactId: metrics-core
+      - name: Zookeeper-curator5
+        id: dubbo-zookeeper-curator5
+        groupId: org.apache.dubbo
+        artifactId: dubbo-dependencies-zookeeper-curator5
+        type: pom
+        description: "[高版本] 使用 Zookeeper 作为服务治理中心,可选作为注册中心、配置中心、元数据中心"
         starter: false
-        hide: true
-    - name: Dubbo Protocols
-      content:
-      - name: protocol1
-        id: protocol1
-        description: protocol1
+        compatibilityRange: "[2.0.0.RELEASE,3.1.0-M1)"
+        bom: apache-dubbo-zookeeper-curator5
+        codeOnly: false
+      - name: Nacos
+        id: dubbo-nacos
+        groupId: com.alibaba.nacos
+        artifactId: nacos-client
+        versionProperty: nacos.version
+        version: 2.2.1
+        description: "使用 Nacos 作为服务治理中心,可选作为注册中心、配置中心、元数据中心"
+        starter: false
+        compatibilityRange: "[2.0.0.RELEASE,3.1.0-M1)"
+        codeOnly: false
+      - name: Apollo
+        id: dubbo-apollo
+        groupId: com.ctrip.framework.apollo
+        artifactId: apollo-client
+        versionProperty: apollo.version
+        version: 2.1.0
+        description: "使用 Apollo 作为配置中心"
         starter: false
-    - name: Dubbo Serialization
+        compatibilityRange: "[2.0.0.RELEASE,3.1.0-M1)"
+        codeOnly: false
+      - name: Redis
+        id: dubbo-redis
+        groupId: redis.clients
+        artifactId: jedis
+        versionProperty: jedis.version
+        version: 3.9.0
+        description: "使用 Redis 作为元数据中心"
+        starter: false
+        compatibilityRange: "[2.0.0.RELEASE,3.1.0-M1)"
+        codeOnly: false
+    - name: Dubbo Protocol
       content:
-      - name: serialization1
-        id: serialization1
-        description: serialization1
+      - name: http2 (default)
+        id: dubbo-http2
+        description: (HTTP/2) http2 protocol, streaming data exchange.
         starter: false
+      - name: grpc
+        id: dubbo-grpc
+        description: gRPC protocol, streaming data exchange.
+        starter: false
+      - name: tcp
+        id: dubbo-tcp
+        description: Dubbo2 tcp protocol.
+        starter: false
+      - name: REST
+        id: dubbo-rest
+        description: Dubbo2 rest protocol.
+        starter: false
+      - name: 单端口多协议
+        id: dubbo-multi-protocols
+        description: port unification.
+        starter: false
+    - name: Dubbo Features
+      content:
+        - name: QoS
+          id: dubbo-qos
+          description: qos.
+          starter: false
+        - name: Metrics
+          id: dubbo-metrics
+          description: metrics.
+          starter: false
+        - name: Tracing
+          id: dubbo-tracing
+          description: tracing.
+          starter: false
+        - name: 限流降级
+          id: dubbo-sentinel
+          description: sentinel.
+          starter: false
     - name: Developer Tools
       content:
         - name: Arthas
@@ -1264,164 +1352,6 @@ initializr:
           links:
             - rel: reference
               href: 
https://docs.spring.io/spring-boot/docs/{bootVersion}/reference/htmlsingle/#data.nosql.mongodb.embedded
-    - name: Spring Cloud Messaging
-      bom: spring-cloud
-      compatibilityRange: "[2.3.0.M1,3.1.0-M1)"
-      content:
-        - name: Cloud Bus
-          id: cloud-bus
-          description: Links nodes of a distributed system with a lightweight 
message broker which can used to broadcast state changes or other management 
instructions (requires a binder, e.g. Apache Kafka or RabbitMQ).
-          groupId: org.springframework.cloud
-          artifactId: spring-cloud-bus
-          links:
-            - rel: reference
-              href: 
https://docs.spring.io/spring-cloud-bus/docs/current/reference/html/
-        - name: Cloud Stream
-          id: cloud-stream
-          description: Framework for building highly scalable event-driven 
microservices connected with shared messaging systems (requires a binder, e.g. 
Apache Kafka, RabbitMQ or Solace PubSub+).
-          groupId: org.springframework.cloud
-          artifactId: spring-cloud-stream
-          links:
-            - rel: reference
-              href: 
https://docs.spring.io/spring-cloud-stream/docs/current/reference/html/spring-cloud-stream.html#spring-cloud-stream-overview-introducing
-    - name: VMware Tanzu Application Service
-      bom: spring-cloud-services
-      compatibilityRange: "[2.0.0.RELEASE,3.0.0-M1)"
-      content:
-        - name: Config Client (TAS)
-          id: scs-config-client
-          description: Config client on VMware Tanzu Application Service.
-          groupId: io.pivotal.spring.cloud
-          artifactId: spring-cloud-services-starter-config-client
-          links:
-            - rel: reference
-              href: 
https://docs.vmware.com/en/Spring-Cloud-Services-for-VMware-Tanzu/index.html
-          mappings:
-            - compatibilityRange: "[2.0.0.RELEASE,2.4.0-M1)"
-              starter: false
-        - name: Service Registry (TAS)
-          id: scs-service-registry
-          description: Eureka service discovery client on VMware Tanzu 
Application Service.
-          groupId: io.pivotal.spring.cloud
-          artifactId: spring-cloud-services-starter-service-registry
-          links:
-            - rel: reference
-              href: 
https://docs.vmware.com/en/Spring-Cloud-Services-for-VMware-Tanzu/index.html
-    - name: Microsoft Azure
-      bom: spring-cloud-azure
-      compatibilityRange: "[2.5.0-M1,3.1.0-M1)"
-      content:
-        - name: Azure Support
-          id: azure-support
-          groupId: com.azure.spring
-          artifactId: spring-cloud-azure-starter
-          description: Auto-configuration for Azure Services (Service Bus, 
Storage, Active Directory, Key Vault, and more).
-          links:
-            - rel: guide
-              href: https://spring.io/guides/gs/spring-boot-for-azure/
-              description: Deploying a Spring Boot app to Azure
-            - rel: reference
-              href: 
https://microsoft.github.io/spring-cloud-azure/current/reference/html/index.html
-              description: Spring Cloud Azure Reference Documentation
-            - rel: sample
-              href: https://aka.ms/spring/samples
-              description: Azure Samples
-        - name: Azure Active Directory
-          id: azure-active-directory
-          groupId: com.azure.spring
-          artifactId: spring-cloud-azure-starter-active-directory
-          description: Spring Security integration with Azure Active Directory 
for authentication.
-          links:
-            - rel: guide
-              href: https://aka.ms/spring/msdocs/aad
-              description: Securing a Java Web App with the Spring Boot 
Starter for Azure Active Directory
-            - rel: reference
-              href: 
https://microsoft.github.io/spring-cloud-azure/current/reference/html/index.html#spring-security-with-azure-active-directory
-            - rel: sample
-              href: https://aka.ms/spring/samples/latest/aad
-              description: Azure Active Directory Sample
-        - name: Azure Cosmos DB
-          id: azure-cosmos-db
-          compatibilityRange: "[2.5.0-M1,3.0.0-M1)"
-          groupId: com.azure.spring
-          artifactId: spring-cloud-azure-starter-data-cosmos
-          description: Fully managed NoSQL database service for modern app 
development, including Spring Data support.
-          links:
-            - rel: guide
-              href: https://aka.ms/spring/msdocs/cosmos
-              description: How to use Spring Boot Starter with Azure Cosmos DB 
SQL API
-            - rel: reference
-              href: 
https://microsoft.github.io/spring-cloud-azure/current/reference/html/index.html#spring-data-support
-            - rel: sample
-              href: https://aka.ms/spring/samples/latest/cosmos
-              description: Azure Cosmos DB Sample
-        - name: Azure Key Vault
-          id: azure-keyvault
-          groupId: com.azure.spring
-          artifactId: spring-cloud-azure-starter-keyvault
-          description: All key vault features are supported, e.g. manage 
application secrets and certificates.
-          links:
-            - rel: guide
-              href: https://aka.ms/spring/msdocs/keyvault
-              description: Read Secrets from Azure Key Vault in a Spring Boot 
Application
-            - rel: guide
-              href: https://aka.ms/spring/msdocs/keyvault/certificates
-              description: Securing Spring Boot Applications with Azure Key 
Vault Certificates
-            - rel: reference
-              href: 
https://microsoft.github.io/spring-cloud-azure/current/reference/html/index.html#secret-management
-            - rel: sample
-              href: https://aka.ms/spring/samples/latest/keyvault
-              description: Azure Key Vault Sample
-        - name: Azure Storage
-          id: azure-storage
-          groupId: com.azure.spring
-          artifactId: spring-cloud-azure-starter-storage
-          description: All Storage features are supported, e.g. blob, 
fileshare and queue.
-          links:
-            - rel: guide
-              href: https://aka.ms/spring/msdocs/storage
-              description: How to use the Spring Boot starter for Azure Storage
-            - rel: reference
-              href: 
https://microsoft.github.io/spring-cloud-azure/current/reference/html/index.html#resource-handling
-            - rel: sample
-              href: https://aka.ms/spring/samples/latest/storage
-              description: Azure Storage Sample
-    - name: Google Cloud Platform
-      bom: spring-cloud-gcp
-      compatibilityRange: "[2.4.0-M1,3.0.0-M1)"
-      content:
-        - name: GCP Support
-          id: cloud-gcp
-          description: Contains auto-configuration support for every Spring 
Cloud GCP integration. Most of the auto-configuration code is only enabled if 
other dependencies are added to the classpath.
-          groupId: com.google.cloud
-          artifactId: spring-cloud-gcp-starter
-          links:
-            - rel: reference
-              href: 
https://googlecloudplatform.github.io/spring-cloud-gcp/reference/html/index.html
-            - rel: guide
-              href: 
https://github.com/GoogleCloudPlatform/spring-cloud-gcp/tree/main/spring-cloud-gcp-samples
-              description: GCP Samples
-        - name: GCP Messaging
-          id: cloud-gcp-pubsub
-          description: Adds the GCP Support entry and all the required 
dependencies so that the Google Cloud Pub/Sub integration work out of the box.
-          groupId: com.google.cloud
-          artifactId: spring-cloud-gcp-starter-pubsub
-          links:
-            - rel: reference
-              href: 
https://googlecloudplatform.github.io/spring-cloud-gcp/reference/html/index.html#cloud-pubsub
-            - rel: guide
-              href: 
https://github.com/GoogleCloudPlatform/spring-cloud-gcp/tree/main/spring-cloud-gcp-samples/spring-cloud-gcp-pubsub-sample
-              description: GCP Pub/Sub Sample
-        - name: GCP Storage
-          id: cloud-gcp-storage
-          description: Adds the GCP Support entry and all the required 
dependencies so that the Google Cloud Storage integration work out of the box.
-          groupId: com.google.cloud
-          artifactId: spring-cloud-gcp-starter-storage
-          links:
-            - rel: reference
-              href: 
https://googlecloudplatform.github.io/spring-cloud-gcp/reference/html/index.html#cloud-storage
-            - rel: guide
-              href: 
https://github.com/GoogleCloudPlatform/spring-cloud-gcp/tree/main/spring-cloud-gcp-samples/spring-cloud-gcp-storage-resource-sample
     - name: Hidden Group
       id: hidden-group
       hide: true
@@ -1481,45 +1411,41 @@ initializr:
     - name: Java
       id: java
       default: true
-    - name: Kotlin
-      id: kotlin
-      default: false
-    - name: Groovy
-      id: groovy
-      default: false
   bootVersions:
-    - name: 3.0.0
-      id: 3.0.0
-    - name: 2.7.6
-      id: 2.7.6
-    - name: 2.6.11
-      id: 2.6.11
+    - name: 3.0.5
+      id: 3.0.5
+      default: true
+    - name: 2.7.10
+      id: 2.7.10
+  dubboVersions:
+    - name: 3.2.0 (beta)
+      id: 3.2.0
+    - name: 3.1.8
+      id: 3.1.8
       default: true
-    - name: 2.4.2
-      id: 2.4.2
-    - name: 2.2.2.RELEASE
-      id: 2.2.2.RELEASE
+    - name: 2.7.21
+      id: 2.7.21
   architecture:
     - id: none
       name: 单模块
-    - id: mvc
-      name: MVC架构
-#       requiredDependency: [ "dependencies to root bom" ]
-      subModules:
-        - name: start
-          description: 入口模块,引导工程启动以及基础配置
-          main: true
-        - name: web
-          description: web 模块,对应 MVC 的 V 概念,存放视图层的逻辑
-        - name: service
-          description: service 模块,对应 MVC 的 M 概念,存放核心业务逻辑代码
-    - id: dubbo
-      name: Dubbo微服务架构
       default: true
+    - id: dubbo
+      name: 多模块
       subModules:
         - name: api
           description: api 模块,对外提供的 API
         - name: service
           description: service 模块,存放核心业务逻辑代码
           main: true
-          dependModules: 'api'
\ No newline at end of file
+          dependModules: 'api'
+#    - id: mvc
+#      name: MVC架构
+##       requiredDependency: [ "dependencies to root bom" ]
+#      subModules:
+#        - name: start
+#          description: 入口模块,引导工程启动以及基础配置
+#          main: true
+#        - name: web
+#          description: web 模块,对应 MVC 的 V 概念,存放视图层的逻辑
+#        - name: service
+#          description: service 模块,对应 MVC 的 M 概念,存放核心业务逻辑与 Dubbo 服务相关代码
\ No newline at end of file
diff --git 
a/initializer-generator/src/main/resources/templates/codes/dubbo/java/DemoServiceImpl.java.mustache
 
b/initializer-generator/src/main/resources/templates/codes/dubbo-idl/java/DemoServiceImpl.java.mustache
similarity index 84%
copy from 
initializer-generator/src/main/resources/templates/codes/dubbo/java/DemoServiceImpl.java.mustache
copy to 
initializer-generator/src/main/resources/templates/codes/dubbo-idl/java/DemoServiceImpl.java.mustache
index b16417d..c10a175 100644
--- 
a/initializer-generator/src/main/resources/templates/codes/dubbo/java/DemoServiceImpl.java.mustache
+++ 
b/initializer-generator/src/main/resources/templates/codes/dubbo-idl/java/DemoServiceImpl.java.mustache
@@ -1,4 +1,4 @@
-package {{basePackage}}.service;
+package {{basePackage}}.dubbo.service;
 
 import org.apache.dubbo.config.annotation.DubboService;
 
diff --git 
a/initializer-generator/src/main/resources/templates/codes/dubbo-zookeeper/resources/application.properties.mustache
 
b/initializer-generator/src/main/resources/templates/codes/dubbo-zookeeper/resources/application.properties.mustache
index 6334cf1..eb58b1d 100644
--- 
a/initializer-generator/src/main/resources/templates/codes/dubbo-zookeeper/resources/application.properties.mustache
+++ 
b/initializer-generator/src/main/resources/templates/codes/dubbo-zookeeper/resources/application.properties.mustache
@@ -1,3 +1,9 @@
 # dubbo zookeeper  
https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/registry/zookeeper/
 # Registry 配置项手册 
https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/config/properties/#registry
-dubbo.registry.address=zookeeper://${zookeeper.address:127.0.0.1}:2181
\ No newline at end of file
+dubbo.registry.address=zookeeper://${zookeeper.address:127.0.0.1}:2181
+# Use the following configuration to stop using registry as metadata and 
config center.
+# dubbo.registry.useAsMetadataCenter=false
+# dubbo.registry.useAsConfigCenter=false
+# Explicitly specify different metadata & config centers will also stop 
reusing the registry cluster.
+# dubbo.metadata-report.address=nacos://host:port
+# dubbo.config-center.address=apollo://host:port
\ No newline at end of file
diff --git 
a/initializer-generator/src/main/resources/templates/codes/dubbo/api/java/DemoService.java.mustache
 
b/initializer-generator/src/main/resources/templates/codes/dubbo/api/java/DemoService.java.mustache
index 4c44e3d..dd5cef3 100644
--- 
a/initializer-generator/src/main/resources/templates/codes/dubbo/api/java/DemoService.java.mustache
+++ 
b/initializer-generator/src/main/resources/templates/codes/dubbo/api/java/DemoService.java.mustache
@@ -1,4 +1,4 @@
-package {{basePackage}}.service;
+package {{basePackage}}.dubbo.api;
 
 public interface DemoService {
 
diff --git 
a/initializer-generator/src/main/resources/templates/codes/dubbo/java/DemoServiceImpl.java.mustache
 
b/initializer-generator/src/main/resources/templates/codes/dubbo/java/DemoServiceImpl.java.mustache
index b16417d..6cc8311 100644
--- 
a/initializer-generator/src/main/resources/templates/codes/dubbo/java/DemoServiceImpl.java.mustache
+++ 
b/initializer-generator/src/main/resources/templates/codes/dubbo/java/DemoServiceImpl.java.mustache
@@ -1,4 +1,6 @@
-package {{basePackage}}.service;
+package {{basePackage}}.dubbo.service;
+
+import {{basePackage}}.dubbo.api.DemoService
 
 import org.apache.dubbo.config.annotation.DubboService;
 
diff --git 
a/initializer-generator/src/main/resources/templates/codes/dubbo/resources/application.properties.mustache
 
b/initializer-generator/src/main/resources/templates/codes/dubbo/resources/application.properties.mustache
index b76f186..8dadfd0 100644
--- 
a/initializer-generator/src/main/resources/templates/codes/dubbo/resources/application.properties.mustache
+++ 
b/initializer-generator/src/main/resources/templates/codes/dubbo/resources/application.properties.mustache
@@ -1 +1 @@
-dubbo.application.name={{appShotName}}-{{module}}
\ No newline at end of file
+dubbo.application.name={{applicationName}}
diff --git a/initializer-page/dev/api.json b/initializer-page/dev/api.json
index 3a5884d..669f65f 100644
--- a/initializer-page/dev/api.json
+++ b/initializer-page/dev/api.json
@@ -1408,6 +1408,15 @@
       { "id": "groovy", "name": "Groovy" }
     ]
   },
+  "dubboVersion": {
+    "type": "single-select",
+    "default": "3.1.8",
+    "values": [
+      { "id": "3.2.0", "name": "3.2.0" },
+      { "id": "3.1.8", "name": "3.1.8" },
+      { "id": "2.7.21", "name": "2.7.21" }
+    ]
+  },
   "bootVersion": {
     "type": "single-select",
     "default": "2.2.0.RELEASE",
diff --git a/initializer-page/public/bootstrap.html 
b/initializer-page/public/bootstrap.html
index 4c18668..08d305c 100644
--- a/initializer-page/public/bootstrap.html
+++ b/initializer-page/public/bootstrap.html
@@ -1 +1 @@
-<!doctype html><html lang="en"><head><meta charset="UTF-8"><meta 
name="viewport" 
content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta 
name="data-spm" content="a2ck6"><meta name="aes-config" 
content="pid=5tYCpT&user_type=6&uid=&username="><title>Cloud Native App 
Initializer</title><link rel="shortcut icon" 
href="/images/dubbo-colorful.png"><meta http-equiv="x-ua-compatible" 
content="ie=edge"><link rel="canonical" 
href="https://github.com/alibaba/dubbo-initializer";><meta nam [...]
\ No newline at end of file
+<!doctype html><html lang="en"><head><meta charset="UTF-8"><meta 
name="viewport" 
content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta 
name="data-spm" content="a2ck6"><meta name="aes-config" 
content="pid=5tYCpT&user_type=6&uid=&username="><title>Cloud Native App 
Initializer</title><link rel="shortcut icon" href="/images/favicon.ico"><meta 
http-equiv="x-ua-compatible" content="ie=edge"><link rel="canonical" 
href="https://github.com/alibaba/dubbo-initializer";><meta name="desc [...]
\ No newline at end of file
diff --git a/initializer-page/src/components/Application.js 
b/initializer-page/src/components/Application.js
index 1ca5af8..007ea9c 100644
--- a/initializer-page/src/components/Application.js
+++ b/initializer-page/src/components/Application.js
@@ -134,26 +134,36 @@ export default function Application() {
         ) : (
           <>
             <Warnings />
-            <Control text='项目构建方式'>
+            {/*<Control text='项目构建方式'>*/}
+            {/*  <RadioGroup*/}
+            {/*    name='project'*/}
+            {/*    selected={get(values, 'project')}*/}
+            {/*    options={get(config, 'lists.project')}*/}
+            {/*    onChange={value => {*/}
+            {/*      update({ project: value })*/}
+            {/*    }}*/}
+            {/*  />*/}
+            {/*</Control>*/}
+            {/*<Control text='开发语言'>*/}
+            {/*  <RadioGroup*/}
+            {/*    name='language'*/}
+            {/*    selected={get(values, 'language')}*/}
+            {/*    options={get(config, 'lists.language')}*/}
+            {/*    onChange={value => {*/}
+            {/*      update({ language: value })*/}
+            {/*    }}*/}
+            {/*  />*/}
+            {/*</Control>*/}
+          <Control text='Dubbo版本'>
               <RadioGroup
-                name='project'
-                selected={get(values, 'project')}
-                options={get(config, 'lists.project')}
-                onChange={value => {
-                  update({ project: value })
-                }}
-              />
-            </Control>
-            <Control text='开发语言'>
-              <RadioGroup
-                name='language'
-                selected={get(values, 'language')}
-                options={get(config, 'lists.language')}
-                onChange={value => {
-                  update({ language: value })
-                }}
+                  name='dubboVersion'
+                  selected={get(values, 'dubboVersion')}
+                  options={get(config, 'lists.dubboVersion')}
+                  onChange={value => {
+                      update({ dubboVersion: value })
+                  }}
               />
-            </Control>
+          </Control>
             <Control text='Spring Boot版本'>
               <RadioGroup
                 name='boot'
diff --git a/initializer-page/src/components/common/builder/Warnings.js 
b/initializer-page/src/components/common/builder/Warnings.js
index faa2146..3571765 100644
--- a/initializer-page/src/components/common/builder/Warnings.js
+++ b/initializer-page/src/components/common/builder/Warnings.js
@@ -42,6 +42,14 @@ function Warnings() {
                   selected.
                 </li>
               )}
+                {get(warnings, 'dubboVersion') && (
+                    <li>
+                        <strong>{get(warnings, 'dubboVersion.value')}</strong> 
is not a
+                        available,{' '}
+                        <strong>{get(warnings, 
'dubboVersion.select')}</strong> has been
+                        selected.
+                    </li>
+                )}
               {get(warnings, 'boot') && (
                 <li>
                   Spring Boot <strong>{get(warnings, 'boot.value')}</strong> is
diff --git 
a/initializer-page/src/components/common/builder/quick-search/QuickSearch.js 
b/initializer-page/src/components/common/builder/quick-search/QuickSearch.js
index 73025bb..d0c31c4 100644
--- a/initializer-page/src/components/common/builder/quick-search/QuickSearch.js
+++ b/initializer-page/src/components/common/builder/quick-search/QuickSearch.js
@@ -121,7 +121,7 @@ const QuickSearch = ({ submit, input }) => {
         <input
           type='text'
           className='control-input'
-          placeholder='Web, Security, JPA, Actuator, Devtools...'
+          placeholder='Zookeeper, Nacos, Metrics, Tracing, HTTP/2, IDL, Web...'
           value={query}
           onBlur={onBlur}
           onFocus={onFocus}
diff --git a/initializer-page/src/components/common/layout/Header.js 
b/initializer-page/src/components/common/layout/Header.js
index 9495f6d..6487a6c 100644
--- a/initializer-page/src/components/common/layout/Header.js
+++ b/initializer-page/src/components/common/layout/Header.js
@@ -6,9 +6,9 @@ const Header = ({ children }) => (
     <h1 className='logo'>
       <a href='/bootstrap.html'>
         <span className='title'>
-          <strong>云原生</strong>应用脚手架
+          <strong>Dubbo</strong>应用脚手架
         </span>
-        <span className='description'>Cloud Native App Initializer</span>
+        <span className='description'>快速创建 Dubbo 应用</span>
       </a>
     </h1>
     {children}
diff --git a/initializer-page/src/components/common/layout/QuickLinks.js 
b/initializer-page/src/components/common/layout/QuickLinks.js
index 27fbdb6..bf8e7b1 100644
--- a/initializer-page/src/components/common/layout/QuickLinks.js
+++ b/initializer-page/src/components/common/layout/QuickLinks.js
@@ -3,7 +3,7 @@ import React, {useContext, useEffect, useRef, useState} from 
'react'
 import {CSSTransition, TransitionGroup} from 'react-transition-group'
 
 import {AppContext} from '../../reducer/App'
-import {IconCaretDown, IconHelp} from '../icons'
+import {IconCaretDown, IconFeedBack, IconHelp, IconHot, IconInitialzrTutorial} 
from '../icons'
 import {Switch} from '../form'
 
 const QuickLinks = () => {
@@ -57,6 +57,28 @@ const QuickLinks = () => {
                     {theme === 'dark' ? '深色' : '浅色'} 主题
                 </span>
             </li>
+            <li>
+                <a
+                    target='_blank'
+                    rel='noopener noreferrer'
+                    href='https://dubbo.apache.org/'
+                    tabIndex='-1'
+                >
+                    <IconInitialzrTutorial/>
+                   访问 Dubbo 官网
+                </a>
+            </li>
+            <li>
+                <a
+                    target='_blank'
+                    rel='noopener noreferrer'
+                    href='https://dubbo.apache.org/zh-cn/contact/books/'
+                    tabIndex='-1'
+                >
+                    <IconHot/>
+                    Dubbo 电子书下载
+                </a>
+            </li>
             <li>
                 <a
                     href='/'
@@ -82,10 +104,10 @@ const QuickLinks = () => {
                                         id='ql-help-projects'
                                         target='_blank'
                                         rel='noopener noreferrer'
-                                        href='https://spring.io/projects'
+                                        href='https://dubbo.apache.org'
                                         tabIndex='-1'
                                     >
-                                        Spring Projects
+                                        Apache Dubbo Website
                                     </a>
                                 </li>
                                 <li>
@@ -94,9 +116,9 @@ const QuickLinks = () => {
                                         target='_blank'
                                         rel='noopener noreferrer'
                                         tabIndex='-1'
-                                        
href='https://spring.io/projects/spring-cloud/'
+                                        href='http://github.com/apache/dubbo'
                                     >
-                                        Spring Cloud
+                                        Apache Github Dubbo-java
                                     </a>
                                 </li>
                                 <li>
@@ -105,9 +127,9 @@ const QuickLinks = () => {
                                         target='_blank'
                                         rel='noopener noreferrer'
                                         tabIndex='-1'
-                                        
href='https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md'
+                                        
href='http://github.com/apache/dubbo-go'
                                     >
-                                        Spring Cloud Alibaba
+                                        Apache Github Dubbo-go
                                     </a>
                                 </li>
                             </ul>
diff --git a/initializer-page/src/components/reducer/Initializr.js 
b/initializer-page/src/components/reducer/Initializr.js
index 9c4e603..f36de1f 100644
--- a/initializer-page/src/components/reducer/Initializr.js
+++ b/initializer-page/src/components/reducer/Initializr.js
@@ -11,6 +11,7 @@ export const defaultInitializrContext = {
     language: '',
     architecture: '',
     boot: '',
+    dubboVersion: '',
     meta: {
       name: '',
       group: '',
diff --git a/initializer-page/src/components/reducer/__tests__/Initializr.js 
b/initializer-page/src/components/reducer/__tests__/Initializr.js
index 1f5ae52..85dcded 100644
--- a/initializer-page/src/components/reducer/__tests__/Initializr.js
+++ b/initializer-page/src/components/reducer/__tests__/Initializr.js
@@ -24,6 +24,7 @@ describe('COMPLETE action', () => {
         language: '',
         architecture: '',
         boot: '',
+        dubboVersion: '',
         meta: {
           name: '',
           group: '',
@@ -48,7 +49,7 @@ describe('COMPLETE action', () => {
       },
     })
     expect(get(result, 'share')).toBe(
-      
'type=maven-project&language=java&architecture=none&platformVersion=2.2.0.RELEASE&packaging=jar&jvmVersion=1.8&groupId=com.example&artifactId=demo&name=demo&description=Demo%20project%20for%20Spring%20Boot&packageName=com.example.demo'
+      
'type=maven-project&language=java&dubboVersion=3.1.8&architecture=none&platformVersion=2.2.0.RELEASE&packaging=jar&jvmVersion=1.8&groupId=com.example&artifactId=demo&name=demo&description=Demo%20project%20for%20Spring%20Boot&packageName=com.example.demo'
     )
     expect(get(result, 'values.project')).toBe('maven-project')
     expect(get(result, 'values.language')).toBe('java')
diff --git a/initializer-page/src/components/utils/ApiUtils.js 
b/initializer-page/src/components/utils/ApiUtils.js
index eef6d6d..994fdd5 100644
--- a/initializer-page/src/components/utils/ApiUtils.js
+++ b/initializer-page/src/components/utils/ApiUtils.js
@@ -8,6 +8,7 @@ import {isInRange, parseReleases, parseVersion} from './Version'
 const PROPERTIES_MAPPING_URL = {
   type: 'project',
   language: 'language',
+  dubboVersion: 'dubboVersion',
   architecture: 'architecture',
   platformVersion: 'boot',
   packaging: 'meta.packaging',
@@ -82,6 +83,7 @@ export const parseParams = (values, queryParams, lists) => {
           case 'language':
           case 'architecture':
           case 'meta.packaging':
+          case 'dubboVersion':
           case 'meta.java': {
             const list = get(lists, key, [])
             const res = list.find(a => a.key.toLowerCase() === value)
@@ -214,6 +216,10 @@ export const getLists = json => {
       key: `${language.id}`,
       text: `${language.name}`,
     })),
+    dubboVersion: get(json, 'dubboVersion.values', []).map(dubboVersion => ({
+      key: `${dubboVersion.id}`,
+      text: `${dubboVersion.name}`,
+    })),
     architecture: get(json, 'architecture.values', []).map(architecture => ({
       key: `${architecture.id}`,
       text: `${architecture.name}`,
@@ -241,6 +247,7 @@ export const getDefaultValues = json => {
   return {
     project: get(json, 'type.default'),
     language: get(json, 'language.default'),
+    dubboVersion: get(json, 'dubboVersion.default'),
     architecture: get(json, 'architecture.default'),
     boot: get(json, 'bootVersion.default'),
     meta: {
@@ -280,6 +287,7 @@ export const getQueryString = function 
getQueryString(values, config) {
     language: get(values, 'language'),
     architecture: get(values, 'architecture'),
     bootVersion: get(values, 'boot'),
+    dubboVersion: get(values, 'dubboVersion'),
     baseDir: get(values, 'meta.artifact'),
     groupId: get(values, 'meta.group'),
     artifactId: get(values, 'meta.artifact'),
diff --git a/initializer-page/src/components/utils/__tests__/ApiUtils.js 
b/initializer-page/src/components/utils/__tests__/ApiUtils.js
index 461d7f6..ff6eb75 100644
--- a/initializer-page/src/components/utils/__tests__/ApiUtils.js
+++ b/initializer-page/src/components/utils/__tests__/ApiUtils.js
@@ -322,6 +322,7 @@ describe('getShareUrl', () => {
       language: 'foo2',
       architecture: 'none',
       boot: 'foo3',
+      dubboVersion: 'fooDubbo',
       meta: {
         packaging: 'foo4',
         java: 'foo5',
@@ -334,7 +335,7 @@ describe('getShareUrl', () => {
       dependencies: ['foo11', 'foo12'],
     })
     expect(result).toBe(
-      
'type=foo1&language=foo2&architecture=none&platformVersion=foo3&packaging=foo4&jvmVersion=foo5&groupId=foo6&artifactId=foo7&name=foo8&description=foo9&packageName=foo10&dependencies=foo11,foo12'
+      
'type=foo1&language=foo2&dubboVersion=fooDubbo&architecture=none&platformVersion=foo3&packaging=foo4&jvmVersion=foo5&groupId=foo6&artifactId=foo7&name=foo8&description=foo9&packageName=foo10&dependencies=foo11,foo12'
     )
   })
 })
@@ -353,6 +354,7 @@ describe('getProject', () => {
       language: 'foo2',
       architecture: 'none',
       boot: 'foo3',
+      dubboVersion: 'fooDubbo',
       meta: {
         packaging: 'foo4',
         java: 'foo5',
@@ -370,7 +372,7 @@ describe('getProject', () => {
     ])
     expect(fetch.mock.calls.length).toEqual(1)
     expect(fetch.mock.calls[0][0]).toEqual(
-      
'http://demo/starter.zip?type=foo1&language=foo2&architecture=none&bootVersion=foo3&baseDir=foo7&groupId=foo6&artifactId=foo7&name=foo8&description=foo9&packageName=foo10&packaging=foo4&javaVersion=foo5&dependencies=foo11,foo12'
+      
'http://demo/starter.zip?type=foo1&language=foo2&architecture=none&bootVersion=foo3&dubboVersion=fooDubbo&baseDir=foo7&groupId=foo6&artifactId=foo7&name=foo8&description=foo9&packageName=foo10&packaging=foo4&javaVersion=foo5&dependencies=foo11,foo12'
     )
   })
 
@@ -379,6 +381,7 @@ describe('getProject', () => {
       project: 'foo1',
       language: 'foo2',
       architecture: 'none',
+      dubboVersion: 'fooDubbo',
       boot: 'foo3',
       meta: {
         packaging: 'foo4',
@@ -394,7 +397,7 @@ describe('getProject', () => {
     getProject('http://demo/starter.zip', values, [{ id: 'foo11' }])
     expect(fetch.mock.calls.length).toEqual(1)
     expect(fetch.mock.calls[0][0]).toEqual(
-      
'http://demo/starter.zip?type=foo1&language=foo2&architecture=none&bootVersion=foo3&baseDir=foo7&groupId=foo6&artifactId=foo7&name=foo8&description=foo9&packageName=foo10&packaging=foo4&javaVersion=foo5&dependencies=foo11'
+      
'http://demo/starter.zip?type=foo1&language=foo2&architecture=none&bootVersion=foo3&dubboVersion=fooDubbo&baseDir=foo7&groupId=foo6&artifactId=foo7&name=foo8&description=foo9&packageName=foo10&packaging=foo4&javaVersion=foo5&dependencies=foo11'
     )
   })
 
@@ -404,6 +407,7 @@ describe('getProject', () => {
       language: 'foo2',
       architecture: 'none',
       boot: 'foo3',
+      dubboVersion: 'fooDubbo',
       meta: {
         packaging: 'foo4',
         java: 'foo5',
@@ -417,7 +421,7 @@ describe('getProject', () => {
     getProject('http://demo/starter.zip', values, [])
     expect(fetch.mock.calls.length).toEqual(1)
     expect(fetch.mock.calls[0][0]).toEqual(
-      
'http://demo/starter.zip?type=foo1&language=foo2&architecture=none&bootVersion=foo3&baseDir=foo7&groupId=foo6&artifactId=foo7&name=foo8&description=foo9&packageName=foo10&packaging=foo4&javaVersion=foo5'
+      
'http://demo/starter.zip?type=foo1&language=foo2&architecture=none&bootVersion=foo3&dubboVersion=fooDubbo&baseDir=foo7&groupId=foo6&artifactId=foo7&name=foo8&description=foo9&packageName=foo10&packaging=foo4&javaVersion=foo5'
     )
   })
 })
diff --git a/initializer-page/src/images/aliyun-icon.png 
b/initializer-page/src/images/aliyun-icon.png
deleted file mode 100644
index bbb50cf..0000000
Binary files a/initializer-page/src/images/aliyun-icon.png and /dev/null differ
diff --git a/initializer-page/src/images/dubbo_colorful.png 
b/initializer-page/src/images/dubbo_colorful.png
new file mode 100644
index 0000000..c48044b
Binary files /dev/null and b/initializer-page/src/images/dubbo_colorful.png 
differ
diff --git a/initializer-page/src/images/dubbo_white.png 
b/initializer-page/src/images/dubbo_white.png
new file mode 100644
index 0000000..21d3d0e
Binary files /dev/null and b/initializer-page/src/images/dubbo_white.png differ
diff --git a/initializer-page/static/bootstrap.html 
b/initializer-page/static/bootstrap.html
index 6830e26..18cabfa 100644
--- a/initializer-page/static/bootstrap.html
+++ b/initializer-page/static/bootstrap.html
@@ -7,7 +7,7 @@
     <meta name="aes-config" content="pid=5tYCpT&user_type=6&uid=&username="/>
     <title><%= htmlWebpackPlugin.options.title %></title>
 
-    <link rel="shortcut icon" href="/images/dubbo-colorful.png"/>
+    <link rel="shortcut icon" href="/images/favicon.ico"/>
 
     <meta http-equiv="x-ua-compatible" content="ie=edge"/>
 
@@ -241,7 +241,7 @@
 <noscript>
     <div class="noscript">
         <strong>
-            <a href="https://start.aliyun.com";>start.aliyun.com</a> can't 
work! </strong
+            <a 
href="https://start.dubbo.apache.org";>start.dubbo.apache.org</a> can't work! 
</strong
         ><br/>
         This app needs JavaScript enabled.
     </div>
diff --git a/initializer-page/static/images/favicon.ico 
b/initializer-page/static/images/favicon.ico
new file mode 100644
index 0000000..eedaf39
Binary files /dev/null and b/initializer-page/static/images/favicon.ico differ
diff --git a/initializer-page/webpack.common.js 
b/initializer-page/webpack.common.js
index 98cad2b..cc7961d 100644
--- a/initializer-page/webpack.common.js
+++ b/initializer-page/webpack.common.js
@@ -83,17 +83,17 @@ const config = {
           },
       template: './static/bootstrap.html',
       filename: 'bootstrap.html',
-      title: 'Cloud Native App Initializer',
-      description: `Initializr generates spring boot project with just what 
you need to start quickly!`,
-      url: 'https://github.com/alibaba/dubbo-initializer',
-      twitter: '@springboot',
+      title: 'Initializer Dubbo',
+      description: `Initializr generates apache dubbo project with just what 
you need to start quickly!`,
+      url: 'https://github.com/apache/dubbo-initializer',
+      twitter: '@apachedubbo',
       theme: `#6db33f`,
     }),
     new WebpackGoogleTagManager(process.env.GOOGLE_TAGMANAGER_ID),
     new WebpackPwaManifest({
-      name: 'alibaba-initializr',
+      name: 'dubbo-initializr',
       short_name: 'Start',
-      description: `Initializr generates spring boot project with just what 
you need to start quickly!`,
+      description: `Initializr generates apache dubbo project with just what 
you need to start quickly!`,
       background_color: '#6db33f',
       inject: true,
       fingerprints: true,
@@ -102,7 +102,7 @@ const config = {
       crossorigin: null,
       icons: [
         {
-          src: path.resolve('src/images/dubbo-colorful.png'),
+          src: path.resolve('src/images/dubbo_colorful.png'),
           sizes: [48, 72, 96, 144, 192, 256, 384, 512],
         },
       ],

Reply via email to