COLA架构初始化DDD项目

创建项目

  • 使用COLA脚手架(Maven)创建COLA项目
    • DgroupId: 公司/组织名称
    • DartifactId:项目名称
    • Dversion:版本号
    • Dpackage:包路径
# 先确认maven正确安装
mvn --version

# Shell(Linux)
mvn archetype:generate \
    -DgroupId=com.xxc \
    -DartifactId=cola-springboot-demo \
    -Dversion=0.0.1 \
    -Dpackage=com.xxc.demo \
    -DarchetypeArtifactId=cola-framework-archetype-web \
    -DarchetypeGroupId=com.alibaba.cola \
    -DarchetypeVersion=5.0.0

# CMD(Windows)使用"^"当做换行符
mvn archetype:generate ^
    -DgroupId=com.xxc ^
    -DartifactId=cola-springboot-demo ^
    -Dversion=0.0.1 ^
    -Dpackage=com.xxc.demo ^
    -DarchetypeArtifactId=cola-framework-archetype-web ^
    -DarchetypeGroupId=com.alibaba.cola ^
    -DarchetypeVersion=5.0.0

# PowerShell(Windows)使用"`"当做换行符,并且参数使用单引号包裹
mvn archetype:generate `
    -DgroupId='com.xxc' `
    -DartifactId='cola-springboot-demo' `
    -Dversion='0.0.1' `
    -Dpackage='com.xxc.demo' `
    -DarchetypeArtifactId='cola-framework-archetype-web' `
    -DarchetypeGroupId='com.alibaba.cola' `
    -DarchetypeVersion='5.0.0'

清理生成代码

  • 清理pom.xml文件(所有模块)
    • 更新Java、SpringBoot依赖的版本
      • java:17
      • SpringBoot: 3.3.0/3.1.12
    • 除了SpringBoot、Cola有关的依赖,其他全部删除
      • 生成代码的依赖版本过于老旧,为了方便先全部删除,后面再自行添加需要的组件
  • 清理代码
    • 删除所有实例代码、单元测试,只保留基础目录
    • java使用"package-info.java"占位
    • 目录使用".gitkeep"文件占位
cola-springboot-demo
├─ .gitignore
├─ cola-springboot-demo-adapter
│	├─ pom.xml
│	└─ src
│	 	└─ main
│	 	 	└─ java
│	 	 	 	└─ com
│	 	 	 	 	└─ xxc
│	 	 	 	 	 	└─ demo
│	 	 	 	 	 	 	└─ package-info.java
├─ cola-springboot-demo-app
│	├─ pom.xml
│	└─ src
│	 	└─ main
│	 	 	└─ java
│	 	 	 	└─ com
│	 	 	 	 	└─ xxc
│	 	 	 	 	 	└─ demo
│	 	 	 	 	 	 	└─ package-info.java
├─ cola-springboot-demo-client
│	├─ pom.xml
│	└─ src
│	 	└─ main
│	 	 	└─ java
│	 	 	 	└─ com
│	 	 	 	 	└─ xxc
│	 	 	 	 	 	└─ demo
│	 	 	 	 	 	 	└─ package-info.java
├─ cola-springboot-demo-domain
│	├─ pom.xml
│	└─ src
│	 	└─ main
│	 	 	└─ java
│	 	 	 	└─ com
│	 	 	 	 	└─ xxc
│	 	 	 	 	 	└─ demo
│	 	 	 	 	 	 	└─ domain
│	 	 	 	 	 	 	 	└─ package-info.java
├─ cola-springboot-demo-infrastructure
│	├─ pom.xml
│	└─ src
│	 	└─ main
│	 	 	├─ java
│	 	 	│	└─ com
│	 	 	│	 	└─ xxc
│	 	 	│	 	 	└─ demo
│	 	 	│	 	 	 	├─ config
│	 	 	│	 	 	 	│	└─ package-info.java
│	 	 	│	 	 	 	└─ package-info.java
│	 	 	└─ resources
│	 	 	 	├─ logback-spring.xml
│	 	 	 	└─ mybatis
│	 	 	 	 	└─ .gitkeep
├─ pom.xml
└─ start
 	├─ pom.xml
 	└─ src
 	 	└─ main
 	 	 	├─ java
 	 	 	│	└─ com
 	 	 	│	 	└─ xxc
 	 	 	│	 	 	└─ demo
 	 	 	│	 	 	 	└─ Application.java
 	 	 	└─ resources
 	 	 	 	├─ application.properties
 	 	 	 	└─ logback-spring.xml
  • 验证是否有遗漏
    • 注意"ERROR"级别的错误,可能是没删完整,删除对应文件即可
mvn clean install

Maven依赖

版本管理

  • 在根目录的pom.xml中,使用"dependencyManagement"节点进行版本管理
  • 在使用的模块才真正引入依赖

Mybatis-plus

  • 数据库操作
    <properties>
        <mybatis-plus-starter.version>3.5.6</mybatis-plus-starter.version>
        <mysql-connector.version>8.3.0</mysql-connector.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatis-plus-starter.version}</version>
            </dependency>
            <dependency>
                <groupId>com.mysql</groupId>
                <artifactId>mysql-connector-j</artifactId>
                <version>${mysql-connector.version}</version>
                <scope>runtime</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
  • 在SpringBoot3.2/3.3使用mybatis报错
  • 如果怕麻烦,SpringBoot版本改为3.1.X
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <!--  排除mybatis  -->
            <exclusions>
                <exclusion>
                    <artifactId>mybatis-spring</artifactId>
                    <groupId>org.mybatis</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--  自定义mybatis版本  -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>3.0.3</version>
        </dependency>

MapStruct

  • 用于对象的映射,主要在infrastructure的convertor使用
  • 由于MapStruct的特殊性,需要修改plugin
    <properties>
        <mapstruct.version>1.5.5.Final</mapstruct.version>
        <mapstruct.binding>0.2.0</mapstruct.binding>
        <projectlombok.version>1.18.32</projectlombok.version>
    </properties>

    <dependencyManagement>
        <dependencies>
          
            <dependency>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct</artifactId>
                <version>${mapstruct.version}</version>
            </dependency>
          
        </dependencies>
    </dependencyManagement>

    <build>
        <pluginManagement>
            <plugins>
              
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.10.1</version>
                    <configuration>
                        <!-- MapStruct依赖 -->
                        <annotationProcessorPaths>
                            <path>
                                <groupId>org.mapstruct</groupId>
                                <artifactId>mapstruct-processor</artifactId>
                                <version>${mapstruct.version}</version>
                            </path>
                            <path>
                                <groupId>org.projectlombok</groupId>
                                <artifactId>lombok</artifactId>
                                <version>${projectlombok.version}</version>
                            </path>
                            <path>
                                <groupId>org.projectlombok</groupId>
                                <artifactId>lombok-mapstruct-binding</artifactId>
                                <version>${mapstruct.binding}</version>
                            </path>
                        </annotationProcessorPaths>
                    </configuration>
                </plugin>

            </plugins>
        </pluginManagement>
    </build>

Swagger

  • 使用Swagger显示文档
  • spring-boot-starter-validation是Spring
    <properties>
        <springdoc.version>2.5.0</springdoc.version>
    </properties>

    <dependencyManagement>
        <dependencies>
          
            <dependency>
                <groupId>org.springdoc</groupId>
                <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
                <version>${springdoc.version}</version>
            </dependency>
          
        </dependencies>
    </dependencyManagement>

打包配置

  • start层,pom.xml增加打包插件
    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
  • 配置后可打包jar文件,使用java命令运行
# 打包jar文件
mvn clean package

# 运行jar文件
java -jar start/target/start.jar

填充代码

  • 代码下载地址:https://gitee.com/XuXiaoCong/cola-springboot-demo
  • 代码中,大部分先使用领域分包,再使用功能分包
    • 领域分包指,用户(User)、订单(Order)、Product(商品)等大方向区分
    • 功能分包指,如下结构图中的"executor","consumer","scheduler"等功能
    • 不使用领域分包的例外
      • Adapter层:控制器包含多个接口,本身按领域区分了
      • Infrastructure层中的"config":因为是全局设置,无法按领域划分

参考文章

posted @ 2024-06-23 11:03  言午日尧耳总  阅读(25)  评论(0编辑  收藏  举报