分布式微服务系统架构第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项目中集成验证码功能变得非常简单,只需要添加依赖并进行少量配置即可使用。

相关推荐
数据智能老司机5 分钟前
DevOps 安全与自动化——理解 DevOps 文化与原则
架构·自动化运维·devops
数据智能老司机8 分钟前
DevOps 安全与自动化——开发环境搭建
架构·自动化运维·devops
思辨共悟12 分钟前
Kafka简述及学习课程
分布式·kafka
天下无贼!31 分钟前
【自制组件库】从零到一实现属于自己的 Vue3 组件库!!!
前端·javascript·vue.js·ui·架构·scss
赵文宇(温玉)1 小时前
1.6万 Star 的流行容器云平台停止开源
云原生·容器·开源·容器云·kubespere
范纹杉想快点毕业1 小时前
基于 C 语言视角:流程图中分支与循环结构的深度解析
c语言·stm32·单片机·设计模式·架构·流程图·uml
Code季风1 小时前
从超卖到数据一致:分布式锁的最佳实践与演进历程
分布式·微服务·go
David爱编程1 小时前
K8s 的工作机制原理:控制器如何“自动修复”
云原生·容器·kubernetes
Code季风1 小时前
深入理解 Redis 分布式锁:实现互斥保障的最佳实践
redis·分布式·微服务
David爱编程1 小时前
Kubernetes 中 StorageClass 高级用法与实战
云原生·容器·kubernetes