一、简介
Spring Boot Starter是一系列约定的集合,它通过提供预定义的配置和依赖管理,简化了Spring应用的搭建和开发过程,自定义Starter使得开发者能够封装特定的业务逻辑或技术实现,创建可重用的模块。这不仅有助于减少重复代码,还能确保配置的最佳实践。
二、自定义 springboot starter
1.梳理starter目录
整体目录
├──x86-framework-parent ├── x86-framework-dependencies 公共依赖(版本管理) ├── x86-framework-core 核心工具 ├── x86-framework-starter 模块starter
2. 模块说明
2.1 x86-framework-parent
pom.xml
<?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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 基础信息 --> <groupId>com.chopin</groupId> <artifactId>x86-framework-parent</artifactId> <packaging>pom</packaging> <version>${revision}</version> <name>x86-framework-parent</name> <!-- lookup parent from repository --> <!-- 所有模块 --> <modules> <module>x86-framework-dependencies</module> <module>x86-framework-core</module> <module>x86-framework-starter</module> </modules> <!-- 开源协议 apache 2.0 --> <licenses> <license> <name>Apache 2</name> <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url> <distribution>repo</distribution> <comments>A business-friendly OSS license</comments> </license> </licenses> <!-- 一些属性 --> <properties> <revision>1.0.0</revision> <jdk.version>21</jdk.version> <project.build.sourceEncoding>utf-8</project.build.sourceEncoding> <project.reporting.outputEncoding>utf-8</project.reporting.outputEncoding> </properties> <!-- 仓库依赖 --> <dependencies> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>com.rayin</groupId> <artifactId>x86-framework-dependencies</artifactId> <version>${project.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!-- 项目构建 --> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.10.1</version> <configuration> <source>21</source> <target>21</target> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- 统一版本号管理 --> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>flatten-maven-plugin</artifactId> <version>1.2.7</version> <configuration> <updatePomFile>true</updatePomFile> <flattenMode>resolveCiFriendliesOnly</flattenMode> </configuration> <executions> <execution> <id>flatten</id> <phase>process-resources</phase> <goals> <goal>flatten</goal> </goals> </execution> <execution> <id>flatten.clean</id> <phase>clean</phase> <goals> <goal>clean</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
2.2 x86-framework-dependencies
pom.xml
<?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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.3.1</version> <relativePath /> <!-- lookup parent from repository --> </parent> <groupId>com.chopin</groupId> <artifactId>x86-framework-dependencies</artifactId> <version>${revision}</version> <packaging>pom</packaging> <name>x86-framework-dependencies</name> <description>x86-framework-dependencies</description> <properties> <revision>1.0.0</revision> <!-- 统一定义依赖版本号 --> <spring-boot.version>3.3.1</spring-boot.version> <lombok.version>1.18.32</lombok.version> <spring.version>6.1.10</spring.version> <okhttp.version>4.12.0</okhttp.version> <java.version>21</java.version> <junixsocket.version>2.9.1</junixsocket.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencyManagement> <dependencies> <!-- lombok support --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId> <version>4.4.0</version> </dependency> <!-- Spring Boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>${spring-boot.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> <version>${spring-boot.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>${spring-boot.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <version>${spring-boot.version}</version> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> <version>${spring-boot.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>${spring-boot.version}</version> </dependency> <!-- 添加Spring框架核心库 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <!-- 添加Spring框架上下文库 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>${okhttp.version}</version> </dependency> <!-- 添加unix套接字依赖框架上下文库 --> <dependency> <groupId>com.kohlschutter.junixsocket</groupId> <artifactId>junixsocket-rmi</artifactId> <version>${junixsocket.version}</version> </dependency> <dependency> <groupId>com.kohlschutter.junixsocket</groupId> <artifactId>junixsocket-native-common</artifactId> <version>${junixsocket.version}</version> </dependency> </dependencies> </dependencyManagement> <!-- 项目构建 --> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> </plugins> </build> </project>
2.3 x86-framework-core
pom.xml
<?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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.chopin</groupId> <artifactId>x86-framework-parent</artifactId> <version>${revision}</version> <relativePath>../pom.xml</relativePath> </parent> <packaging>jar</packaging> <name>x86-framework-core</name> <artifactId>x86-framework-core</artifactId> <dependencies> <!-- Zero dependence --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> </plugins> </build> <distributionManagement> <snapshotRepository> <id>isd-snapshot</id> <name>maven-isd-snapshot</name> <url>http://af.hikvision.com.cn/artifactory/maven-isd-snapshot</url> </snapshotRepository> <repository> <id>isd-release</id> <name>maven-isd-release</name> <url>http://af.hikvision.com.cn/artifactory/maven-isd-release</url> </repository> </distributionManagement> </project>
2.4 x86-framework-starter
pom.xml
<?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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.chopin</groupId> <artifactId>x86-framework-parent</artifactId> <version>${revision}</version> <relativePath>../pom.xml</relativePath> </parent> <packaging>pom</packaging> <name>x86-framework-starter</name> <artifactId>x86-framework-starter</artifactId> <description>x86-framework starters</description> <!-- 所有子模块 --> <modules> <module>x86-framework-conf-starter</module> <module>x86-framework-unix-starter</module> </modules> </project>
子模块
x86-framework-unix-starter<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.chopin</groupId> <artifactId>x86-framework-starter</artifactId> <version>${revision}</version> <relativePath>../pom.xml</relativePath> </parent> <artifactId>x86-framework-unix-starter</artifactId> <name>x86-framework-unix-starter</name> <description>x86-framework-unix-starter</description> <packaging>jar</packaging> <properties> <java.version>21</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <skipTests>true</skipTests> </properties> <dependencies> <!-- lombok support --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> <!-- Spring Boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <artifactId>json-path</artifactId> <groupId>com.jayway.jsonpath</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> <!-- <dependency>--> <!-- <groupId>jakarta.servlet</groupId>--> <!-- <artifactId>jakarta.servlet-api</artifactId>--> <!-- </dependency>--> <!-- <dependency>--> <!-- <groupId>jakarta.validation</groupId>--> <!-- <artifactId>jakarta.validation-api</artifactId>--> <!-- </dependency>--> <!-- 添加Spring框架核心库 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </dependency> <!-- 添加Spring框架上下文库 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> <dependency> <groupId>com.kohlschutter.junixsocket</groupId> <artifactId>junixsocket-rmi</artifactId> </dependency> <dependency> <groupId>com.kohlschutter.junixsocket</groupId> <artifactId>junixsocket-native-common</artifactId> </dependency> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <encoding>${project.build.sourceEncoding}</encoding> </configuration> </plugin> </plugins> </build> <distributionManagement> <snapshotRepository> <id>isd-snapshot</id> <name>maven-isd-snapshot</name> <url>http://af.hikvision.com.cn/artifactory/maven-isd-snapshot</url> </snapshotRepository> <repository> <id>isd-release</id> <name>maven-isd-release</name> <url>http://af.hikvision.com.cn/artifactory/maven-isd-release</url> </repository> </distributionManagement> </project>
3. spring.factories 声明
spring.factories 文件声明要注入的bean
# Auto Configuration org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.chopin.x86.core.handler.GlobalExceptionHandler,\ com.chopin.x86.core.handler.GlobalResponseHandler,\ com.chopin.x86.core.filter.LogBackFilter
4. ServiceLoader扫描
ServiceLoader会扫描java.class.path(类路径)下所有/META-INF/services文件夹下的xxx接口对应的实现ConversionHandlerManager.javapublic class ConversionHandlerManager { private static List<ConversionHandler> handlerList = new ArrayList<>(); /** * spi实现,拿到ConversionHandler接口的所有实现 * ServiceLoader会扫描java.class.path(类路径)下所有/META-INF/services文件夹下的ConversionHandler接口对应的实现 */ public static List<ConversionHandler> getHandlerList(){ ServiceLoader loader = ServiceLoader.load(ConversionHandler.class); Iterator<ConversionHandler> handlerIterator = loader.iterator(); while (handlerIterator.hasNext()) { ConversionHandler conversionHandler = handlerIterator.next(); handlerList.add(conversionHandler); } return handlerList; } }
ConversionHandler.java 接口实现初始化读取数据
5. starter 打入中央仓库
配置仓库地址
<distributionManagement> <!-- snapshot 仓库 --> <snapshotRepository> <id>isd-snapshot</id> <name>maven-isd-snapshot</name> <url>http://af.xxx.com.cn/artifactory/maven-isd-snapshot</url> </snapshotRepository> <!-- 正式版本 --> <repository> <id>isd-release</id> <name>maven-isd-release</name> <url>http://af.xxx.com.cn/artifactory/maven-isd-release</url> </repository> </distributionManagement>
在 Maven 的
pom.xml
文件中,distributionManagement
部分定义了项目的分发管理,包括快照版本(Snapshot)和发布版本(Release)的存储位置。根据您提供的 XML 配置片段,snapshotRepository
和repository
分别定义了快照版本和发布版本的远程仓库地址。
快照版本(Snapshot):快照版本是开发过程中的中间产物,通常用于持续集成和开发测试。它们是不稳定的,可能会频繁更新。在 Maven 中,快照版本的版本号通常会包含
-SNAPSHOT
后缀,例如1.0.0-SNAPSHOT
。当您执行mvn deploy
或mvn install
命令时,快照版本会被部署到在pom.xml
中snapshotRepository
指定的仓库地址。发布版本(Release):发布版本是经过测试并准备发布的稳定版本。它们不包含
-SNAPSHOT
后缀,例如1.0.0
。当您准备将项目发布为正式版本时,会执行mvn clean deploy
命令,此时 Maven 会将包部署到pom.xml
中repository
指定的仓库地址。推送到中央仓库通常是通过以下步骤完成的:
准备发布:确保您的代码、文档和所有资源都准备就绪,并且通过了所有测试。
更新版本号:在
pom.xml
文件中更新项目的版本号,移除-SNAPSHOT
后缀。配置发布:确保
distributionManagement
部分正确配置了中央仓库的repository
。执行部署:执行
mvn clean deploy
命令,将发布版本部署到远程仓库。验证:检查发布版本是否成功部署到远程仓库,并验证其可用性。
更新中央仓库:如果您有权限,可以进一步将发布版本推送到 Maven 中央仓库,以便其他开发者可以访问和使用。
请注意,推送到 Maven 中央仓库通常需要遵循特定的流程,包括签署具有正确 GPG 密钥的工件,以及在
pom.xml
中配置正确的scm
(源代码管理)信息等。此外,中央仓库可能有特定的发布流程和要求,因此在执行之前应仔细阅读相关文档。如果出现 发布包时401
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:3.1.1:deploy (default-deploy) on project x86-framework-core: Failed to deploy artifacts: Could not transfer artifact com.chopin:x86-framework-core:pom:1.0.0-20240823.062341-1 from/to isd-snapshot (http://af.xxx.com.cn/artifactory/maven-isd-snapshot): status code: 401, reason phrase: (401) -> [Help 1]