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


创建成功。
更多推荐



所有评论(0)