3.0.2-SNAPSHOT

本站(springdoc.cn)中的内容来源于 spring.io ,原始版权归属于 spring.io。由 springboot.io - Spring Boot中文社区 进行翻译,整理。可供个人学习、研究,未经许可,不得进行任何转载、商用或与之相关的行为。 商标声明:Spring 是 Pivotal Software, Inc. 在美国以及其他国家的商标。

1. 使用文档

Spring Cloud CircuitBreaker 项目包含 Resilience4J 和 Spring Retry 的实现。Spring Cloud CircuitBreaker 中实现的 API 在 Spring Cloud Commons 中存在。这些API的使用文档位于 Spring Cloud Commons 文档 中。

1.1. 配置 Resilience4J Circuit Breakers

1.1.1. Starter

Resilience4J 的实现有两个 starter,一个用于 Reactive (响应式)应用,一个用于非 Reactive 应用。

  • org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j - 非 Reactive 应用。

  • org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j - Reactive (响应式)应用。

1.1.2. 自动配置

你可以通过将 spring.cloud.circuitbreaker.resilience4j.enabled 设置为 false 来禁用 Resilience4J 的自动配置。

1.1.3. 默认配置

为了给所有的 circuit breakers(熔断器)提供一个默认的配置,创建一个 Customizer bean,它被传递给 Resilience4JCircuitBreakerFactoryReactiveResilience4JCircuitBreakerFactoryconfigureDefault 方法可以用来提供一个默认配置。

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> defaultCustomizer() {
    return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
            .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(4)).build())
            .circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())
            .build());
}
Reactive 示例
@Bean
public Customizer<ReactiveResilience4JCircuitBreakerFactory> defaultCustomizer() {
    return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
            .circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())
            .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(4)).build()).build());
}
自定义 ExecutorService

如果你想配置执行 circuit breaker 的 ExecutorService,你可以使用 Resilience4JCircuitBreakerFactor 进行配置。

例如,如果你想使用一个 context 感知的 ExecutorService,你可以这样做。

@Bean
public Customizer<ReactiveResilience4JCircuitBreakerFactory> defaultCustomizer() {
    return factory -> {
        ContextAwareScheduledThreadPoolExecutor executor = ContextAwareScheduledThreadPoolExecutor.newScheduledThreadPool().corePoolSize(5)
            .build();
        factory.configureExecutorService(executor);
    };
}

1.1.4. 特定的 Circuit Breaker 配置

与提供默认配置类似,你可以创建一个 Customizer bean,它被传递给 Resilience4JCircuitBreakerFactoryReactiveResilience4JCircuitBreakerFactory

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> slowCustomizer() {
    return factory -> factory.configure(builder -> builder.circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())
            .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(2)).build()), "slow");
}

除了配置被创建的 circuit breaker 外,你还可以在 circuit breaker 被创建后但被返回给调用者之前对其进行自定义。要做到这一点,你可以使用 addCircuitBreakerCustomizer 方法。这对于向 Resilience4J circuit breaker 添加 event handler 很有用。

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> slowCustomizer() {
    return factory -> factory.addCircuitBreakerCustomizer(circuitBreaker -> circuitBreaker.getEventPublisher()
    .onError(normalFluxErrorConsumer).onSuccess(normalFluxSuccessConsumer), "normalflux");
}
Reactive 示例
@Bean
public Customizer<ReactiveResilience4JCircuitBreakerFactory> slowCustomizer() {
    return factory -> {
        factory.configure(builder -> builder
        .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(2)).build())
        .circuitBreakerConfig(CircuitBreakerConfig.ofDefaults()), "slow", "slowflux");
        factory.addCircuitBreakerCustomizer(circuitBreaker -> circuitBreaker.getEventPublisher()
            .onError(normalFluxErrorConsumer).onSuccess(normalFluxSuccessConsumer), "normalflux");
     };
}

1.1.5. Circuit Breaker Properties 配置

你可以在你的应用程序的配置 properties 文件中配置 CircuitBreakerTimeLimiter 的配置或实例。属性配置比 Java Customizer 配置具有更高的优先级。

从上到下的优先级递减。

  • Method(id) 配置 - 具体方法或操作上

  • Service(group) 配置 - 特定的应用服务或操作上

  • 全局默认配置

ReactiveResilience4JCircuitBreakerFactory.create(String id, String groupName)
Resilience4JCircuitBreakerFactory.create(String id, String groupName)
全局默认 Properties 配置
resilience4j.circuitbreaker:
    configs:
        default:
            registerHealthIndicator: true
            slidingWindowSize: 50

resilience4j.timelimiter:
    configs:
        default:
            timeoutDuration: 5s
            cancelRunningFuture: true
配置 Properties 配置
resilience4j.circuitbreaker:
    configs:
        groupA:
            registerHealthIndicator: true
            slidingWindowSize: 200

resilience4j.timelimiter:
    configs:
        groupC:
            timeoutDuration: 3s
            cancelRunningFuture: true
实例 Properties 配置
resilience4j.circuitbreaker:
 instances:
     backendA:
         registerHealthIndicator: true
         slidingWindowSize: 100
     backendB:
         registerHealthIndicator: true
         slidingWindowSize: 10
         permittedNumberOfCallsInHalfOpenState: 3
         slidingWindowType: TIME_BASED
         recordFailurePredicate: io.github.robwin.exception.RecordFailurePredicate

resilience4j.timelimiter:
 instances:
     backendA:
         timeoutDuration: 2s
         cancelRunningFuture: true
     backendB:
         timeoutDuration: 1s
         cancelRunningFuture: false
  • ReactiveResilience4JCircuitBreakerFactory.create("backendA")Resilience4JCircuitBreakerFactory.create("backendA") 会应用 instances backendA properties

  • ReactiveResilience4JCircuitBreakerFactory.create("backendA", "groupA")Resilience4JCircuitBreakerFactory.create("backendA", "groupA") 会应用 instances backendA properties

  • ReactiveResilience4JCircuitBreakerFactory.create("backendC")Resilience4JCircuitBreakerFactory.create("backendC") 会应用 global default properties

  • ReactiveResilience4JCircuitBreakerFactory.create("backendC", "groupC")Resilience4JCircuitBreakerFactory.create("backendC", "groupC") 会应用 global default CircuitBreaker properties and config groupC TimeLimiter properties

关于 Resilience4j 属性配置的更多信息,见 Resilience4J Spring Boot 2 配置

1.1.6. Bulkhead pattern 支持

如果 classpath 上有 resilience4j-bulkhead,Spring Cloud CircuitBreaker 将用 Resilience4j Bulkhead 来包装所有方法。你可以通过设置 spring.cloud.circuitbreaker.bulkhead.resilience4j.enabledfalse 来禁用 Resilience4j Bulkhead。

Spring Cloud CircuitBreaker Resilience4j 提供了两种 bulkhead pattern 的实现:

  • 使用 Semaphores 的 SemaphoreBulkhead

  • 一个 FixedThreadPoolBulkhead,它使用一个有界队列和一个固定的线程池。

默认情况下,Spring Cloud CircuitBreaker Resilience4j 使用 FixedThreadPoolBulkhead。要修改默认行为以使用 SemaphoreBulkhead,请将属性 spring.cloud.circuitbreaker.resilience4j.enableSemaphoreDefaultBulkhead 设为 true

关于实现 Bulkhead pattern 的更多信息,见 Resilience4j Bulkhead

Customizer<Resilience4jBulkheadProvider> 可用于提供默认的 Bulkhead 和 ThreadPoolBulkhead 配置。

@Bean
public Customizer<Resilience4jBulkheadProvider> defaultBulkheadCustomizer() {
    return provider -> provider.configureDefault(id -> new Resilience4jBulkheadConfigurationBuilder()
        .bulkheadConfig(BulkheadConfig.custom().maxConcurrentCalls(4).build())
        .threadPoolBulkheadConfig(ThreadPoolBulkheadConfig.custom().coreThreadPoolSize(1).maxThreadPoolSize(1).build())
        .build()
);
}

1.1.7. 特定的 Bulkhead 配置

同样地,为了提供一个默认的 'Bulkhead' 或 'ThreadPoolBulkhead' 配置,你可以创建一个 Customizer Bean,它被传递给 Resilience4jBulkheadProvider

@Bean
public Customizer<Resilience4jBulkheadProvider> slowBulkheadProviderCustomizer() {
    return provider -> provider.configure(builder -> builder
        .bulkheadConfig(BulkheadConfig.custom().maxConcurrentCalls(1).build())
        .threadPoolBulkheadConfig(ThreadPoolBulkheadConfig.ofDefaults()), "slowBulkhead");
}

除了配置被创建的 Bulkhead 外,你还可以在 Bulkhead 和线程池 Bulkhead 被创建后但被返回给调用者之前对其进行自定义。要做到这一点,你可以使用 addBulkheadCustomizeraddThreadPoolBulkheadCustomizer 方法。

Bulkhead 示例
@Bean
public Customizer<Resilience4jBulkheadProvider> customizer() {
    return provider -> provider.addBulkheadCustomizer(bulkhead -> bulkhead.getEventPublisher()
        .onCallRejected(slowRejectedConsumer)
        .onCallFinished(slowFinishedConsumer), "slowBulkhead");
}
线程池 Bulkhead 示例
@Bean
public Customizer<Resilience4jBulkheadProvider> slowThreadPoolBulkheadCustomizer() {
    return provider -> provider.addThreadPoolBulkheadCustomizer(threadPoolBulkhead -> threadPoolBulkhead.getEventPublisher()
        .onCallRejected(slowThreadPoolRejectedConsumer)
        .onCallFinished(slowThreadPoolFinishedConsumer), "slowThreadPoolBulkhead");
}

1.1.8. Bulkhead Properties 配置

你可以在应用程序的配置 properties 文件中配置 ThreadPoolBulkheadSemaphoreBulkhead 实例。属性配置比 Java Customizer 配置具有更高的优先级。

resilience4j.thread-pool-bulkhead:
    instances:
        backendA:
            maxThreadPoolSize: 1
            coreThreadPoolSize: 1
resilience4j.bulkhead:
    instances:
        backendB:
            maxConcurrentCalls: 10

关于 Resilience4j 属性配置的更多信息,见 Resilience4J Spring Boot 2 配置

1.1.9. 收集指标

Spring Cloud Circuit Breaker Resilience4j 包含自动配置功能,只要 classpath上 有正确的依赖项,就可以设置指标收集。要启用指标收集,你必须包括 org.springframework.boot:spring-boot-starter-actuator,以及 io.github.resilience4j:resilience4j-micrometer。关于存在这些依赖时产生的指标的更多信息,请参阅 Resilience4j 文档

你不必直接包括 micrometer-core ,因为它是由 spring-boot-starter-actuator 引入的。

1.2. 配置 Spring Retry Circuit Breakers

Spring Retry为Spring应用程序提供声明式重试支持。这个项目的一个子集包括实现 circuit breaker 功能的能力。Spring Retry 通过它的 CircuitBreakerRetryPolicystateful retry 的组合来提供 circuit breaker 的实现。所有使用 Spring Retry 创建的 circuit breaker 都将使用 CircuitBreakerRetryPolicyDefaultRetryState 创建。这两个类都可以使用 SpringRetryConfigBuilder 进行配置。

1.2.1. 默认配置

为了给所有的 circuit breaker 提供一个默认的配置,创建一个 Customizer bean,它被传递给 SpringRetryCircuitBreakerFactoryconfigureDefault 方法可以用来提供一个默认配置。

@Bean
public Customizer<SpringRetryCircuitBreakerFactory> defaultCustomizer() {
    return factory -> factory.configureDefault(id -> new SpringRetryConfigBuilder(id)
        .retryPolicy(new TimeoutRetryPolicy()).build());
}

1.2.2. 特定的 Circuit Breaker 配置

与提供默认配置类似,你可以创建一个 Customizer bean,它被传递给 SpringRetryCircuitBreakerFactory

@Bean
public Customizer<SpringRetryCircuitBreakerFactory> slowCustomizer() {
    return factory -> factory.configure(builder -> builder.retryPolicy(new SimpleRetryPolicy(1)).build(), "slow");
}

除了配置被创建的 circuit breaker 外,你还可以在 circuit breaker 被创建后但被返回给调用者之前对其进行自定义。要做到这一点,你可以使用 addRetryTemplateCustomizers 方法。这对于向 RetryTemplate 添加 event handler 很有用。

@Bean
public Customizer<SpringRetryCircuitBreakerFactory> slowCustomizer() {
    return factory -> factory.addRetryTemplateCustomizers(retryTemplate -> retryTemplate.registerListener(new RetryListener() {

        @Override
        public <T, E extends Throwable> boolean open(RetryContext context, RetryCallback<T, E> callback) {
            return false;
        }

        @Override
        public <T, E extends Throwable> void close(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {

        }

        @Override
        public <T, E extends Throwable> void onError(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {

        }
    }));
}

2. 构建

2.1. 基本的编译和测试

要构建源代码,你需要安装JDK 17。

Spring Cloud使用Maven进行大多数构建相关的活动,通过克隆你感兴趣的项目并键入以下内容,你应该能很快上手

$ ./mvnw install
你也可以自己安装Maven(>=3.3.3),运行 mvn 命令来代替下面例子中的 ./mvnw。如果你这样做,如果你的本地Maven设置不包含 spring 预发布 artifact 的 repository 声明,你可能还需要添加 -P spring
请注意,您可能需要通过设置 MAVEN_OPTS 环境变量,如 -Xmx512m -XX:MaxPermSize=128m 来增加Maven的可用内存。我们试图在 .mvn 配置中涵盖这一点,所以如果你发现你必须这样做才能使构建成功,请提出一个raise,将设置添加到 source control 中。

需要中间件(如,Redis)进行测试的项目一般需要安装和运行 Docker 的本地实例。

2.2. 文档

spring-cloud-build 模块有一个 "docs" profile,如果你打开它,它将尝试从 src/main/asciidoc 构建 asciidoc 源。作为该过程的一部分,它将寻找 README.adoc,并通过加载所有内容来处理它,但不对其进行解析或渲染,只是将其复制到 ${main.basedir}(默认为 $C:\Users\KevinBlandy\Desktop\springdoc\spring-cloud-circuitbreaker-doc\docs,即项目的根目录)。如果README有任何改动,在Maven构建后就会以修改过的文件出现在正确位置。提交并推送修改内容即可。

2.3. 使用代码工作

如果你没有IDE的偏好,我们建议你在处理代码时使用 Spring Tools SuiteEclipse。我们使用 m2eclipse eclipse插件来支持maven。其他IDE和工具只要使用Maven 3.3.3或更高版本,也应能顺利工作。

2.3.1. 激活 Spring Maven profile

Spring Cloud 项目需要激活 "spring" Maven profile,以解决spring里程碑和快照库的问题。使用你喜欢的IDE将该 profile 设置为 active 状态,否则你可能会遇到构建错误。

2.3.2. 用 m2eclipse 导入到 eclipse 中

在使用eclipse时,我们推荐使用 m2eclipse eclipse插件。如果你还没有安装m2eclipse,它可以从 "eclipse marketplace" 获得。

旧版本的m2e不支持Maven 3.3,所以一旦项目被导入Eclipse,你还需要告诉m2eclipse为项目使用正确的profile。如果你看到项目中与POMs有关的许多不同的错误,请检查你是否有一个最新的安装。如果你不能升级m2e,把 "spring" profile加入你的 settings.xml。或者你可以从父pom的 "spring" profile 中复制版本库设置到你的 settings.xml 中。

2.3.3. 在没有 m2eclipse 的情况下导入 eclipse 中

如果你不愿意使用 m2eclipse,你可以用以下命令生成 eclipse 项目元数据。

$ ./mvnw eclipse:eclipse

生成的 eclipse 项目可以通过在 file 菜单中选择 import existing projects 来导入。

3. 贡献

Spring Cloud在非限制性的Apache 2.0许可下发布,并遵循非常标准的Github开发流程,使用Github tracker 处理 issue,并将 pull request 合并到 master。如果你想做出贡献,哪怕是一些微不足道的事情,请不要犹豫,但要遵循以下准则。

3.1. 签署贡献者许可协议

在我们接受一个补丁或 pull request 之前,我们需要你签署 贡献者许可协议。签署贡献者协议并不授予任何人对主仓库的提交权,但这意味着我们可以接受你的贡献,如果我们接受你的贡献,你将获得作者的荣誉。积极的贡献者可能会被要求加入核心团队,并被赋予合并 pull request 的能力。

3.2. 行为准则

本项目遵守 《贡献者公约》 的行为准则。通过参与,你被期望维护这一准则。请将不可接受的行为报告给 spring-code-of-conduct@pivotal.io

3.3. 准则公约和内部管理

这些都不是 pull request 的必要条件,但它们都会有帮助。它们也可以在原始 pull request 之后、合并之前添加。

  • 使用Spring框架的代码格式约定。如果你使用Eclipse,你可以使用 Spring Cloud Build 项目中的 eclipse-code-formatter.xml 文件导入格式化设置。如果使用IntelliJ,你可以使用 Eclipse Code Formatter Plugin 来导入相同的文件。

  • 确保所有新的 .java 文件都有一个简单的 Javadoc 类注释,至少有一个 @author 的标签来标识你,最好至少有一段关于类的用途。

  • 在所有新的 .java 文件中添加ASF license header 注释(从项目中的现有文件中复制)。

  • 在你大量修改的 .java 文件中加入自己作为 @author(不仅仅是外观上的修改)。

  • 添加一些 Javadocs,如果你改变了命名空间,则添加一些XSD doc元素。

  • 一些单元测试也会有很大的帮助—​总得有人来做。

  • 如果没有人在使用你的分支,请将其与当前的主干分支(或主项目中的其他目标分支)重新建立基线。

  • 在写提交信息时,请遵循 这些惯例,如果你要修复一个现有的问题,请在提交信息的末尾加上 Fixes gh-XXXX(其中XXXX是 issue 编号)。

3.4. 检查风格(Checkstyle)

Spring Cloud Build自带一套检查风格(checkstyle)的规则。你可以在 spring-cloud-build-tools 模块中找到它们。该模块下最值得注意的文件是。

spring-cloud-build-tools/
└── src
    ├── checkstyle
    │   └── checkstyle-suppressions.xml (3)
    └── main
        └── resources
            ├── checkstyle-header.txt (2)
            └── checkstyle.xml (1)
1 默认的检查风格规则
2 文件头设置
3 默认的 suppression 规则

3.4.1. Checkstyle 配置

Checkstyle 规则默认是禁用的。要在你的项目中添加 checkstyle,只需定义以下属性和插件。

pom.xml
<properties>
<maven-checkstyle-plugin.failsOnError>true</maven-checkstyle-plugin.failsOnError> (1)
        <maven-checkstyle-plugin.failsOnViolation>true
        </maven-checkstyle-plugin.failsOnViolation> (2)
        <maven-checkstyle-plugin.includeTestSourceDirectory>true
        </maven-checkstyle-plugin.includeTestSourceDirectory> (3)
</properties>

<build>
        <plugins>
            <plugin> (4)
                <groupId>io.spring.javaformat</groupId>
                <artifactId>spring-javaformat-maven-plugin</artifactId>
            </plugin>
            <plugin> (5)
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-checkstyle-plugin</artifactId>
            </plugin>
        </plugins>

    <reporting>
        <plugins>
            <plugin> (5)
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-checkstyle-plugin</artifactId>
            </plugin>
        </plugins>
    </reporting>
</build>
1 构建时出现 Checkstyle error 而失败
2 违反Checkstyle规定时,不合格。
3 Checkstyle还分析了test sources
4 添加Spring Java Format 插件,它将重新格式化你的代码,以通过大多数Checkstyle格式化规则。
5 在你的构建和报告阶段添加checkstyle插件

如果你需要抑制某些规则(例如,行长需要更长),那么你只需在 ${project.root}/src/checkstyle/checkstyle-suppressions.xml 下定义一个文件,写上你的抑制措施即可。例子。

projectRoot/src/checkstyle/checkstyle-suppresions.xml
<?xml version="1.0"?>
<!DOCTYPE suppressions PUBLIC
        "-//Puppy Crawl//DTD Suppressions 1.1//EN"
        "https://www.puppycrawl.com/dtds/suppressions_1_1.dtd">
<suppressions>
    <suppress files=".*ConfigServerApplication\.java" checks="HideUtilityClassConstructor"/>
    <suppress files=".*ConfigClientWatch\.java" checks="LineLengthCheck"/>
</suppressions>

建议将 ${spring-cloud-build.rootFolder}/.editorconfig${spring-cloud-build.rootFolder}/.springformat 复制到你的项目。这样一来,一些默认的格式化规则就会被应用。你可以通过运行这个脚本来做到这一点。

$ curl https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/.editorconfig -o .editorconfig
$ touch .springformat

3.5. IDE设置

3.5.1. Intellij IDEA

为了设置Intellij,你应该导入我们的编码惯例、检查配置文件并设置checkstyle插件。在 Spring Cloud Build 项目中可以找到以下文件。

spring-cloud-build-tools/
└── src
    ├── checkstyle
    │   └── checkstyle-suppressions.xml (3)
    └── main
        └── resources
            ├── checkstyle-header.txt (2)
            ├── checkstyle.xml (1)
            └── intellij
                ├── Intellij_Project_Defaults.xml (4)
                └── Intellij_Spring_Boot_Java_Conventions.xml (5)
1 默认的Checkstyle规则
2 文件头的设置
3 默认的 suppression 规则
4 Intellij的项目默认值,适用于大多数Checkstyle规则
5 适用于Intellij的项目风格惯例,适用于大多数Checkstyle规则
Code style
Figure 1. Code style

进入 FileSettingsEditorCode style。在那里点击 Scheme 部分旁边的图标。在那里,点击 Import Scheme,选择 Intellij IDEA code style XML 选项。导入 spring-cloud-build-tools/src/main/resources/intellij/Intellij_Spring_Boot_Java_Conventions.xml 文件。

Code style
Figure 2. Inspection profiles

进入 FileSettingsEditorInspections。在那里点击 Profile 部分旁边的图标。在那里,点击 Import Profile 并导入 spring-cloud-build-tools/src/main/resources/intellij/Intellij_Project_Defaults.xml 文件。

Checkstyle

为了让Intellij与Checkstyle一起工作,你必须安装 Checkstyle 插件。建议同时安装 Assertions2Assertj 来自动转换JUnit断言。

Checkstyle

进入 FileSettingsOther settingsCheckstyle。在那里点击 Configuration file 部分的 + 图标。在那里,你必须定义检查风格规则应该从哪里提取。在上图中,我们从克隆的Spring Cloud Build资源库中挑选规则。不过,你也可以指向Spring Cloud Build的GitHub仓库(例如,对于 checkstyle.xml : raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle.xml )。我们需要提供以下变量。

记住将扫描范围设置为所有来源,因为我们对生产和测试来源应用检查式规则。

3.6. Duplicate Finder(重复搜索器)

Spring Cloud Build带来了 basepom:duplicate-finder-maven-plugin,它可以标记java classpath上重复和冲突的类和资源。

3.6.1. Duplicate Finder 配置

Duplicate finder 默认是启用的,会在Maven构建的 verify 阶段运行,但只有当你在项目的pom.xml build 部分添加了 duplicate-finder-maven-plugin,它才会在项目中生效。

pom.xml
<build>
    <plugins>
        <plugin>
            <groupId>org.basepom.maven</groupId>
            <artifactId>duplicate-finder-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

对于其他属性,我们已经设置了 插件文档 中列出的默认值。

你可以通过设置以 double-finder-maven-plugin 为前缀的选定属性的值来轻松覆盖它们。例如,将 double-finder-maven-plugin.skip 设为 true,以便在构建中跳过重复检查。

如果你需要在你的设置中添加 ignoredClassPatternsignoredResourcePatterns,请确保在你项目的 plugin configuration 部分添加它们。

<build>
    <plugins>
        <plugin>
            <groupId>org.basepom.maven</groupId>
            <artifactId>duplicate-finder-maven-plugin</artifactId>
            <configuration>
                <ignoredClassPatterns>
                    <ignoredClassPattern>org.joda.time.base.BaseDateTime</ignoredClassPattern>
                    <ignoredClassPattern>.*module-info</ignoredClassPattern>
                </ignoredClassPatterns>
                <ignoredResourcePatterns>
                    <ignoredResourcePattern>changelog.txt</ignoredResourcePattern>
                </ignoredResourcePatterns>
            </configuration>
        </plugin>
    </plugins>
</build>