1.背景

        领域驱动设计(Domain-Driven Design,DDD)是一种以业务领域为核心的软件设计方法,强调通过领域模型解决复杂业务问题。随着微服务架构的普及,DDD因其清晰的边界划分和分层设计,成为微服务拆分的有效指导原则。所以,Maven构建的DDD脚手架是技术实践与业务需求结合的产物,为复杂系统的可扩展性和团队协作提供了有效支撑。

2.项目实践

其主要修改的是scaffold-lite模块

2.1新建 archetype-metadata.xml文件

在scaffold-lite/src/main/resource/META-INF/maven下

<?xml version="1.0" encoding="UTF-8"?>
<archetype-descriptor
        xsi:schemaLocation="https://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.1.0 http://maven.apache.org/xsd/archetype-descriptor-1.1.0.xsd"
        name="nmsc-frame-archetype"
        xmlns="https://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.1.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <fileSets>
        <fileSet filtered="true" encoding="UTF-8">
            <directory>docs/dev-ops</directory>
            <includes>
                <include>**/*.yml</include>
            </includes>
        </fileSet>
        <fileSet filtered="true" encoding="UTF-8">
            <directory>docs/dev-ops</directory>
            <includes>
                <include>**/*.sql</include>
                <include>**/*.yml</include>
                <include>**/*.sh</include>
            </includes>
        </fileSet>
        <fileSet encoding="UTF-8">
            <directory/>
            <includes>
                <include>README.md</include>
                <include>__gitignore__</include>
            </includes>
        </fileSet>
    </fileSets>

    <modules>
        <module id="${rootArtifactId}-api" dir="__rootArtifactId__-api"
                name="${rootArtifactId}-api">
            <fileSets>
                <fileSet filtered="true" packaged="true" encoding="UTF-8">
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.java</include>
                    </includes>
                </fileSet>
            </fileSets>
        </module>
        <module id="${rootArtifactId}-app" dir="__rootArtifactId__-app" name="${rootArtifactId}-app">
            <fileSets>
                <fileSet filtered="true" packaged="true" encoding="UTF-8">
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.java</include>
                    </includes>
                </fileSet>
                <fileSet filtered="true" encoding="UTF-8">
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>**/*.xml</include>
                        <include>**/*.yml</include>
                    </includes>
                </fileSet>
                <fileSet filtered="true" packaged="true" encoding="UTF-8">
                    <directory>src/test/java</directory>
                    <includes>
                        <include>**/*.java</include>
                    </includes>
                </fileSet>
                <fileSet filtered="true" encoding="UTF-8">
                    <directory/>
                    <includes>
                        <include>Dockerfile</include>
                        <include>*.sh</include>
                    </includes>
                </fileSet>
            </fileSets>
        </module>
        <module id="${rootArtifactId}-domain" dir="__rootArtifactId__-domain" name="${rootArtifactId}-domain">
            <fileSets>
                <fileSet filtered="true" packaged="true" encoding="UTF-8">
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.java</include>
                    </includes>
                </fileSet>
            </fileSets>
        </module>
        <module id="${rootArtifactId}-infrastructure" dir="__rootArtifactId__-infrastructure"
                name="${rootArtifactId}-infrastructure">
            <fileSets>
                <fileSet filtered="true" packaged="true" encoding="UTF-8">
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.java</include>
                    </includes>
                </fileSet>
            </fileSets>
        </module>
        <module id="${rootArtifactId}-trigger" dir="__rootArtifactId__-trigger" name="${rootArtifactId}-trigger">
            <fileSets>
                <fileSet filtered="true" packaged="true" encoding="UTF-8">
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.java</include>
                    </includes>
                </fileSet>
            </fileSets>
        </module>
        <module id="${rootArtifactId}-types" dir="__rootArtifactId__-types" name="${rootArtifactId}-types">
            <fileSets>
                <fileSet filtered="true" packaged="true" encoding="UTF-8">
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.java</include>
                    </includes>
                </fileSet>
            </fileSets>
        </module>
    </modules>
</archetype-descriptor>

这个文件是Maven Archetype的原型描述文件,告诉Maven,当我用archetype:generate创建新项目时,该把那些模板文件考到用户工程里、咋么重命名、哪些遍历要替换、最终产生什么样的多模块目录结构

2.2 创建对应模块

这边就拿domain来举个例子

创建其具体目录,然后写他的pom文件

<?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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>${groupId}</groupId>
        <artifactId>${rootArtifactId}</artifactId>
        <version>${version}</version>
    </parent>

    <artifactId>${artifactId}</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
        </dependency>
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
        </dependency>
        <!-- 系统模块 -->
        <dependency>
            <groupId>${groupId}</groupId>
            <artifactId>${rootArtifactId}-types</artifactId>
        </dependency>
    </dependencies>

    <build>
        <finalName>${rootArtifactId}-domain</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-archetype-plugin</artifactId>
                <version>3.2.0</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>create-from-project</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <compilerVersion>${java.version}</compilerVersion>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

2.3 书写脚手架创建项目的pom文件

<?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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>io.github.hzw</groupId>
    <artifactId>ddd-scaffold-lite-v2</artifactId>
    <version>2.4</version>
    <packaging>maven-archetype</packaging>
    <!--    <packaging>jar</packaging>-->

    <name>ddd-scaffold-lite-v2</name>

    <properties>
        <java.version>1.8</java.version>
        <maven-javadoc-plugin.version>3.2.0</maven-javadoc-plugin.version>
        <maven-source-plugin.version>3.2.1</maven-source-plugin.version>
        <maven-gpg-plugin.version>1.6</maven-gpg-plugin.version>
        <maven-checksum-plugin.version>1.10</maven-checksum-plugin.version>
    </properties>

    <build>
        <extensions>
            <extension>
                <groupId>org.apache.maven.archetype</groupId>
                <artifactId>archetype-packaging</artifactId>
                <version>3.2.0</version>
            </extension>
        </extensions>

        <plugins>
        

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-release-plugin</artifactId>
                <version>2.5.3</version>
                <configuration>
                    <autoVersionSubmodules>true</autoVersionSubmodules>
                    <useReleaseProfile>false</useReleaseProfile>
                    <releaseProfiles>release</releaseProfiles>
                    <goals>deploy</goals>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <developers>
        <developer>
            <name>hzw</name>
            <email></email>
            <organization>hzw</organization>
        </developer>
    </developers>

    <licenses>
        <license>
            <name>Apache License, Version 2.0</name>
            <url>https://www.apache.org/licenses/LICENSE-2.0</url>
        </license>
    </licenses>


</project>

2.4 具体目录实现图

archetype项目写好之后,通过mvn clean install命令安装到本地的maven仓库中

2.5 通过已有的项目结构生成archetype

在项目的根目录下(即项目的pom.xml文件所在目录)下执行maven命令:

 mvn archetype:create-from-project

这样就可以通过当前项目结构创建一个archetype骨架,生成的archetype的信息,默认是在project根目录下的 target\generated-sources\archetype 目录

然后在archetype的根目录下(即: 项目根目录\target\generated-sources\archetype)执行mvn clean install命令就可以将archetype安装在本地仓库里了。

2.6 通过archetype创建新项目

mvn archetype:generate -DgroupId=com.hzw -DartifactId=supermarker-project -Dpackage=com.hzw.market -Dversion=1.0 -DarchetypeGroupId=com.hzw  -DarchetypeArtifactId=nmsc-frame-archetype-lite-archetype -DarchetypeVersion=1.0 -X -DarchetypeCatalog=local

前面的四个参数是生成的新项目的maven groupId以及package,后面三个参数指定使用的脚手架archetype

archetypeCatalog用来指定maven-archetype-plugin读取archetype-catalog.xml文件的位置:
internal——maven-archetype-plugin内置的
local——本地的,位置为~/.m2/archetype-catalog.xml
remote——指向Maven中央仓库的Catalog

2.7 使用IDEA创建新项目

创建成功。
 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐