分布式微服务系统架构第143集:pom文件

加群联系作者vx:xiaoda0423

仓库地址:https://webvueblog.github.io/JavaPlusDoc/

https://1024bat.cn/

https://github.com/webVueBlog/fastapi_plus

https://webvueblog.github.io/JavaPlusDoc/

✅ 各字段说明及是否可改

字段名 说明 是否可修改 修改建议
modelVersion Maven POM 的版本,目前固定为 4.0.0,不能改为其他 ❌ 不建议改
groupId 项目组 ID,通常代表公司或组织域名反写,如 com.mycompany.project ✅ 可以改 建议与组织、项目命名一致
artifactId 工件 ID,即模块名,构成 jar 包名 ✅ 可以改 命名清晰、唯一性强
version 当前项目版本 ✅ 可以改 生产建议使用正式版本如 1.0.0
packaging 打包方式,pom 表示父模块(非代码模块) ✅ 可以改 需与实际用途匹配

✅ 示例:将你的父项目改为你公司项目结构

假设你公司叫做 example.com,你正在开发一个验证码服务,准备正式发布。

go 复制代码
<!-- Maven项目定义 -->
<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">

    <!-- 模型版本:固定为4.0.0 -->
    <modelVersion>4.0.0</modelVersion>

    <!-- 组织或公司名称 -->
    <groupId>com.example.captcha</groupId>
    
    <!-- 模块名称:验证码父模块 -->
    <artifactId>captcha-parent</artifactId>
    
    <!-- 版本号:即将发布正式版 -->
    <version>1.0.0</version>
    
    <!-- 打包类型:父项目用pom -->
    <packaging>pom</packaging>

✅ 子模块中引用方式

例如 core/captcha-spring-boot-starter/pom.xml

go 复制代码
<parent>
    <groupId>com.example.captcha</groupId>
    <artifactId>captcha-parent</artifactId>
    <version>1.0.0</version>
</parent>

✅ 常见组合建议(命名规范)

类型 建议命名
公司 com.example
项目 captcha
父模块 captcha-parent
Starter模块 captcha-spring-boot-starter
Core模块 captcha-core
Web模块 captcha-webcaptcha-service

✅ 特别注意

  • 如果你只改了 groupIdartifactId,需要 同步修改子模块引用的 <parent>,否则会构建失败。

  • 如果你准备上传到公司私有 Nexus 仓库,建议 version 使用正式版如:1.0.01.0.1-RELEASE 等,而不是 SNAPSHOT

✅ 各字段说明及是否可改

字段名 说明 是否可修改 修改建议
modelVersion Maven POM 的版本,目前固定为 4.0.0,不能改为其他 ❌ 不建议改
groupId 项目组 ID,通常代表公司或组织域名反写,如 com.mycompany.project ✅ 可以改 建议与组织、项目命名一致
artifactId 工件 ID,即模块名,构成 jar 包名 ✅ 可以改 命名清晰、唯一性强
version 当前项目版本 ✅ 可以改 生产建议使用正式版本如 1.0.0
packaging 打包方式,pom 表示父模块(非代码模块) ✅ 可以改 需与实际用途匹配

✅ 示例:将你的父项目改为你公司项目结构

假设你公司叫做 example.com,你正在开发一个验证码服务,准备正式发布。

go 复制代码
<!-- Maven项目定义 -->
<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">

    <!-- 模型版本:固定为4.0.0 -->
    <modelVersion>4.0.0</modelVersion>

    <!-- 组织或公司名称 -->
    <groupId>com.example.captcha</groupId>
    
    <!-- 模块名称:验证码父模块 -->
    <artifactId>captcha-parent</artifactId>
    
    <!-- 版本号:即将发布正式版 -->
    <version>1.0.0</version>
    
    <!-- 打包类型:父项目用pom -->
    <packaging>pom</packaging>

✅ 子模块中引用方式

例如 core/captcha-spring-boot-starter/pom.xml

go 复制代码
<parent>
    <groupId>com.example.captcha</groupId>
    <artifactId>captcha-parent</artifactId>
    <version>1.0.0</version>
</parent>

✅ 常见组合建议(命名规范)

类型 建议命名
公司 com.example
项目 captcha
父模块 captcha-parent
Starter模块 captcha-spring-boot-starter
Core模块 captcha-core
Web模块 captcha-webcaptcha-service

✅ 特别注意

  • 如果你只改了 groupIdartifactId,需要 同步修改子模块引用的 <parent>,否则会构建失败。

  • 如果你准备上传到公司私有 Nexus 仓库,建议 version 使用正式版如:1.0.01.0.1-RELEASE 等,而不是 SNAPSHOT

go 复制代码
package com.anji.captcha.storage.impl;

import com.anji.captcha.core.service.CaptchaCacheService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;

import java.util.concurrent.TimeUnit;

public class RedisCacheServiceImpl implements CaptchaCacheService {

    @Autowired
    private StringRedisTemplate redisTemplate;

    @Override
    public void set(String key, String value, long expiresInSeconds) {
        redisTemplate.opsForValue().set(key, value, expiresInSeconds, TimeUnit.SECONDS);
    }

    @Override
    public String get(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    @Override
    public void delete(String key) {
        redisTemplate.delete(key);
    }
}
go 复制代码
package com.anji.captcha.storage.impl;

import com.anji.captcha.core.service.CaptchaCacheService;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class LocalCacheServiceImpl implements CaptchaCacheService {

    private final Map<String, CacheValue> CACHE_MAP = new ConcurrentHashMap<>();

    @Override
    public void set(String key, String value, long expiresInSeconds) {
        long expireTime = System.currentTimeMillis() + expiresInSeconds * 1000;
        CACHE_MAP.put(key, new CacheValue(value, expireTime));
    }

    @Override
    public String get(String key) {
        CacheValue cacheValue = CACHE_MAP.get(key);
        if (cacheValue == null) {
            return null;
        }
        if (cacheValue.isExpired()) {
            CACHE_MAP.remove(key);
            return null;
        }
        return cacheValue.getValue();
    }

    @Override
    public void delete(String key) {
        CACHE_MAP.remove(key);
    }

    private static class CacheValue {
        private final String value;
        private final long expireTime;

        public CacheValue(String value, long expireTime) {
            this.value = value;
            this.expireTime = expireTime;
        }

        public String getValue() {
            return value;
        }

        public boolean isExpired() {
            return System.currentTimeMillis() > expireTime;
        }
    }
}
go 复制代码
package com.anji.captcha.core.util;

public class StringUtils {

    public static boolean isBlank(String str) {
        return str == null || str.trim().isEmpty();
    }

    public static boolean isNotBlank(String str) {
        return !isBlank(str);
    }

    public static String trim(String str) {
        return str == null ? null : str.trim();
    }
}
go 复制代码
package com.anji.captcha.core.service.impl;

import com.anji.captcha.core.model.common.ResponseModel;
import com.anji.captcha.core.model.vo.CaptchaVO;
import com.anji.captcha.core.service.CaptchaCacheService;
import com.anji.captcha.core.service.CaptchaService;

import java.util.Properties;
import java.util.UUID;

public class DefaultCaptchaServiceImpl implements CaptchaService {

    private final Properties config;
    private final CaptchaCacheService captchaCacheService;

    public DefaultCaptchaServiceImpl(Properties config) {
        this.config = config;
        this.captchaCacheService = CaptchaServiceFactory.getCache(config.getProperty("captcha.cache.type", "local"));
    }

    @Override
    public ResponseModel get(CaptchaVO captchaVO) {
        // 生成验证码
        String captchaId = UUID.randomUUID().toString();
        String token = UUID.randomUUID().toString();
        
        // 缓存验证码
        captchaCacheService.set(captchaId, token, 300);
        
        // 返回验证码信息
        CaptchaVO respVO = new CaptchaVO();
        respVO.setCaptchaId(captchaId);
        respVO.setToken(token);
        
        return ResponseModel.success(respVO);
    }

    @Override
    public ResponseModel check(CaptchaVO captchaVO) {
        // 校验验证码
        String token = captchaCacheService.get(captchaVO.getCaptchaId());
        if (token == null) {
            return ResponseModel.error("9999", "验证码已失效");
        }
        
        if (token.equals(captchaVO.getToken())) {
            // 验证通过,删除缓存
            captchaCacheService.delete(captchaVO.getCaptchaId());
            return ResponseModel.success();
        } else {
            return ResponseModel.error("9999", "验证码错误");
        }
    }
}
go 复制代码
package com.anji.captcha.core.service.impl;

import com.anji.captcha.core.service.CaptchaCacheService;
import com.anji.captcha.core.service.CaptchaService;
import com.anji.captcha.storage.impl.LocalCacheServiceImpl;
import com.anji.captcha.storage.impl.RedisCacheServiceImpl;

import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public class CaptchaServiceFactory {

    private static final Map<String, CaptchaService> instances = new HashMap<>();
    private static final Map<String, CaptchaCacheService> cacheInstances = new HashMap<>();

    public static CaptchaService getInstance(Properties config) {
        String captchaType = config.getProperty("captcha.type", "default");
        if (!instances.containsKey(captchaType)) {
            synchronized (CaptchaServiceFactory.class) {
                if (!instances.containsKey(captchaType)) {
                    // 根据类型创建不同的验证码服务实现
                    CaptchaService instance = new DefaultCaptchaServiceImpl(config);
                    instances.put(captchaType, instance);
                }
            }
        }
        return instances.get(captchaType);
    }

    public static CaptchaCacheService getCache(String cacheType) {
        if (!cacheInstances.containsKey(cacheType)) {
            synchronized (CaptchaServiceFactory.class) {
                if (!cacheInstances.containsKey(cacheType)) {
                    // 根据类型创建不同的缓存服务实现
                    CaptchaCacheService instance;
                    if ("redis".equalsIgnoreCase(cacheType)) {
                        instance = new RedisCacheServiceImpl();
                    } else {
                        instance = new LocalCacheServiceImpl();
                    }
                    cacheInstances.put(cacheType, instance);
                }
            }
        }
        return cacheInstances.get(cacheType);
    }
}
go 复制代码
<?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>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.5.RELEASE</version>
    </parent>

    <groupId>com.anji</groupId>
    <artifactId>captcha-service</artifactId>
    <version>1.0.0</version>
    <name>captcha-service</name>
    <description>验证码服务单体应用</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <dependencies>
        <!-- Spring Boot Web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <!-- Spring Boot 配置处理 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        
        <!-- Redis 支持 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <optional>true</optional>
        </dependency>
        
        <!-- 测试 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        
        <!-- Lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

项目概述

验证码服务项目,提供滑动拼图、点选文字等多种验证码类型。项目采用模块化设计,主要包含核心模块和多种集成方式。

项目结构

项目主要分为以下几个部分:

1. 核心模块

1.1 captcha 模块
  • 路径:core/captcha

  • 版本:1.3.1

  • 功能:提供验证码的核心实现

  • 依赖:仅依赖 SLF4J API

1.2 captcha-spring-boot-starter 模块
  • 路径:core/captcha-spring-boot-starter

  • 版本:1.3.1

  • 功能:Spring Boot 自动配置,简化验证码集成

  • 主要类:

    • AjCaptchaAutoConfiguration:主配置类

    • AjCaptchaServiceAutoConfiguration:服务配置

    • AjCaptchaStorageAutoConfiguration:存储配置

    • CaptchaController:提供验证码接口

    • AjCaptchaProperties:配置属性类

2. 服务模块

2.1 springboot 服务
  • 路径:service/springboot

  • 功能:基于 Spring Boot 的验证码服务实现

2.2 springmvc 服务
  • 路径:service/springmvc

  • 功能:基于 Spring MVC 的验证码服务实现

后端项目搭建步骤

1. 基于 Spring Boot 搭建

  1. 创建 Spring Boot 项目
  • 使用 Spring Initializr 或 IDE 创建项目

  • 添加 Web 依赖

  • 添加验证码依赖

    go 复制代码
    <dependency>
        <groupId>com.anji-plus</groupId>
        <artifactId>spring-boot-starter-captcha</artifactId>
        <version>1.3.1</version>
    </dependency>
  • 配置验证码属性application.propertiesapplication.yml 中添加:

    go 复制代码
    aj:
      captcha:
        # 验证码类型:默认(default)、滑动拼图(blockPuzzle)、点选文字(clickWord)
        type:blockPuzzle
        # 水印设置
        water-mark:水印文字
        # 水印字体
        water-font:WenQuanZhengHei.ttf
        # 字体类型
        font-type:WenQuanZhengHei.ttf
        # 缓存类型:local/redis
        cache-type:local
  • 使用验证码接口项目自动注册了以下接口:

    • /captcha/get:获取验证码

    • /captcha/check:验证验证码

    2. 基于 Spring MVC 搭建

    1. 创建 Spring MVC 项目

    2. 添加验证码核心依赖

      go 复制代码
      <dependency>
          <groupId>com.anji-plus</groupId>
          <artifactId>captcha</artifactId>
          <version>1.3.1</version>
      </dependency>
    3. 手动配置验证码服务 需要手动配置 CaptchaService 和相关组件

    3. 基于 Go 搭建

    参考 service/go 目录下的实现,包含:

    • 配置管理

    • 常量定义

    • 模型定义

    • 服务实现

    • 工具类

    核心功能说明

    1. 验证码类型
    • 滑动拼图(blockPuzzle)

    • 点选文字(clickWord)

  • 存储方式

    • 本地缓存(local)

    • Redis 缓存(redis)

  • 主要接口

    • 获取验证码:生成验证码图片和校验信息

    • 校验验证码:验证用户输入是否正确

  • 配置选项

    • 水印设置

    • 字体设置

    • 缓存类型

    • 干扰选项

    • 请求频率限制

    我发现项目中有一个名为captcha-spring-boot-starter的目录,这很可能就是用户在寻找的spring-boot-starter-captcha。我将查看该目录下的pom.xml文件以确认。

    toolName: view_files

    status: success

    filePath: c:\Users\23979\Downloads\captcha\core\captcha-spring-boot-starter\pom.xml

    我已经找到了spring-boot-starter-captcha,它位于core/captcha-spring-boot-starter目录下。我将继续查看该目录下的src目录结构,以便提供更详细的信息。

    toolName: view_files

    status: success

    filePath: c:\Users\23979\Downloads\captcha\core\captcha-spring-boot-starter\src

    我需要查看src目录的结构,因为它是一个目录而不是文件。

    toolName: view_folder

    status: success

    c:\Users\23979\Downloads\captcha\core\captcha-spring-boot-starter\src

    继续深入查看src目录的结构,特别是Java代码部分。

    toolName: view_folder

    status: success

    c:\Users\23979\Downloads\captcha\core\captcha-spring-boot-starter\src\main\java\com

    我还需要查看resources目录,了解配置文件等内容。

    toolName: view_folder

    status: success

    c:\Users\23979\Downloads\captcha\core\captcha-spring-boot-starter\src\main\resources

    我需要查看spring.factories文件,这是Spring Boot自动配置的关键文件。

    toolName: view_files

    status: success

    filePath: c:\Users\23979\Downloads\captcha\core\captcha-spring-boot-starter\src\main\resources\META-INF\spring.factories

    我需要查看自动配置类AjCaptchaAutoConfiguration,了解它的功能和配置方式。

    toolName: view_files

    status: success

    filePath: c:\Users\23979\Downloads\captcha\core\captcha-spring-boot-starter\src\main\java\com\anji\captcha\config\AjCaptchaAutoConfiguration.java

    我需要查看AjCaptchaProperties类,了解可配置的属性。

    toolName: view_files

    status: success

    filePath: c:\Users\23979\Downloads\captcha\core\captcha-spring-boot-starter\src\main\java\com\anji\captcha\properties\AjCaptchaProperties.java

    我需要查看CaptchaController类,了解如何使用这个验证码组件。

    toolName: view_files

    status: success

    filePath: c:\Users\23979\Downloads\captcha\core\captcha-spring-boot-starter\src\main\java\com\anji\captcha\controller\CaptchaController.java

    我需要查看AjCaptchaServiceAutoConfiguration类,了解服务配置。

    toolName: view_files

    status: success

    filePath: c:\Users\23979\Downloads\captcha\core\captcha-spring-boot-starter\src\main\java\com\anji\captcha\config\AjCaptchaServiceAutoConfiguration.java

    我需要查看AjCaptchaStorageAutoConfiguration类,了解存储配置。

    toolName: view_files

    status: success

    filePath: c:\Users\23979\Downloads\captcha\core\captcha-spring-boot-starter\src\main\java\com\anji\captcha\config\AjCaptchaStorageAutoConfiguration.java

    我需要查看项目的主pom.xml文件,了解整个项目的结构和依赖关系。

    toolName: view_files

    status: success

    filePath: c:\Users\23979\Downloads\captcha\pom.xml

    我需要查看captcha核心模块的pom.xml文件,了解核心功能的依赖关系。

    toolName: view_files

    status: success

    filePath: c:\Users\23979\Downloads\captcha\core\captcha\pom.xml

    spring-boot-starter-captcha位于项目的core/captcha-spring-boot-starter目录下。这是一个Spring Boot的自动配置模块,用于简化验证码功能的集成。

    具体结构如下:

    1. 位置core/captcha-spring-boot-starter

    2. 主要文件

    • pom.xml:定义了模块的Maven配置,artifactId为"spring-boot-starter-captcha",版本为1.3.1

    • src/main/java/com/anji/captcha/:包含了自动配置的Java代码

    • src/main/resources/META-INF/spring.factories:Spring Boot自动配置的入口文件

  • 核心类

    • AjCaptchaAutoConfiguration:主要的自动配置类

    • AjCaptchaServiceAutoConfiguration:验证码服务的自动配置

    • AjCaptchaStorageAutoConfiguration:验证码存储的自动配置

    • CaptchaController:提供验证码接口的控制器

    • AjCaptchaProperties:验证码配置属性类

  • 功能

    • 提供了验证码的自动配置功能

    • 支持滑动拼图、点选文字等多种验证码类型

    • 提供了验证码获取和验证的REST接口

    • 支持本地缓存和Redis缓存两种存储方式

  • 依赖关系

    • 依赖于core/captcha模块,这是验证码的核心实现

    • 依赖Spring Boot Web和自动配置相关组件

    这个starter模块使得在Spring Boot项目中集成验证码功能变得非常简单,只需要添加依赖并进行少量配置即可使用。

相关推荐
贵慜_Derek1 天前
《从零实现 Agent 系统》连载 32|闭集 IE 与小模型:分类、意图与字段抽取
人工智能·架构·agent
江米小枣tonylua1 天前
译:设计生产级 RAG 架构
架构
怕浪猫2 天前
领域特定语言(Domain-Specific Language, DSL)
设计模式·程序员·架构
怕浪猫2 天前
哪些软件对 Chrome DevTools Protocol 频繁使用
人工智能·架构·前端框架
Jack202 天前
HarmonyOS APP事件驱动大揭秘
架构
米丘2 天前
微前端之 Web Components 完全指南
微服务·html
秋播2 天前
国内本地WSL2编译rancher源码
云原生
Colin草率地做慢慢地改2 天前
关于QuickStore这个项目的重构(2)- 数据库建表文件
后端·面试·架构
candyTong3 天前
RTK 技术原理:一次典型会话里,80% 上下文是怎么省下来的
javascript·后端·架构
唐某人丶3 天前
从画架构图开始:架构分析与进阶指南
架构