Convert Figma logo to code with AI

spring-cloud logospring-cloud-gateway

An API Gateway built on Spring Framework and Spring Boot providing routing and more.

4,495
3,304
4,495
465

Top Related Projects

13,485

Zuul is a gateway service that provides dynamic routing, monitoring, resiliency, security, and more.

39,056

🦍 The Cloud-Native API Gateway and AI Gateway.

24,693

Cloud-native high-performance edge/middle/service proxy

50,858

The Cloud Native Application Proxy

14,434

The Cloud-Native API Gateway

Quick Overview

Spring Cloud Gateway is a powerful and flexible API Gateway built on top of Spring Framework 5, Spring Boot 2, and Project Reactor. It provides a simple, yet effective way to route to APIs and provides cross-cutting concerns to them such as security, monitoring/metrics, and resiliency.

Pros

  • Easy integration with Spring ecosystem and microservices architecture
  • Highly customizable with predicate and filter factories
  • Non-blocking and supports WebFlux for high performance
  • Built-in support for circuit breaking, rate limiting, and load balancing

Cons

  • Steeper learning curve compared to simpler API gateways
  • Requires Java runtime, which may not be suitable for all environments
  • Configuration can become complex for large-scale deployments
  • Limited support for non-Spring applications

Code Examples

  1. Basic route configuration:
spring:
  cloud:
    gateway:
      routes:
        - id: example_route
          uri: https://example.org
          predicates:
            - Path=/example/**

This example defines a simple route that forwards requests with the path /example/** to https://example.org.

  1. Adding a filter to a route:
spring:
  cloud:
    gateway:
      routes:
        - id: rewrite_route
          uri: https://example.org
          predicates:
            - Path=/rewrite/**
          filters:
            - RewritePath=/rewrite/(?<segment>.*), /$\{segment}

This route uses a RewritePath filter to modify the request path before forwarding it to the destination.

  1. Programmatic route configuration:
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("path_route", r -> r.path("/get")
            .uri("http://httpbin.org"))
        .route("host_route", r -> r.host("*.myhost.org")
            .uri("http://httpbin.org"))
        .build();
}

This Java code demonstrates how to programmatically define routes using the RouteLocatorBuilder.

Getting Started

To get started with Spring Cloud Gateway, add the following dependency to your pom.xml:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

Then, create a Spring Boot application with @EnableDiscoveryClient annotation:

@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

Finally, configure your routes in application.yml or programmatically as shown in the code examples above.

Competitor Comparisons

13,485

Zuul is a gateway service that provides dynamic routing, monitoring, resiliency, security, and more.

Pros of Zuul

  • Mature and battle-tested in production environments
  • Extensive documentation and community support
  • Seamless integration with other Netflix OSS components

Cons of Zuul

  • Limited support for non-JVM languages
  • Slower development cycle and fewer updates
  • Less flexible routing capabilities compared to modern alternatives

Code Comparison

Zuul configuration:

zuul:
  routes:
    users:
      path: /users/**
      serviceId: user-service

Spring Cloud Gateway configuration:

spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/users/**

Spring Cloud Gateway offers more concise and flexible routing configuration, allowing for easier customization of request handling. Zuul's configuration is straightforward but less adaptable to complex routing scenarios.

Both projects serve as API gateways, but Spring Cloud Gateway is built on Spring WebFlux, offering better performance and scalability for reactive applications. Zuul, while reliable, is based on a blocking I/O model, which may limit its performance in high-concurrency scenarios.

Spring Cloud Gateway provides more modern features like support for WebSocket and non-blocking APIs, making it a better choice for microservices architectures. However, Zuul's stability and extensive production use make it a solid option for organizations already invested in the Netflix ecosystem.

39,056

🦍 The Cloud-Native API Gateway and AI Gateway.

Pros of Kong

  • More comprehensive API management features, including authentication, rate limiting, and analytics
  • Supports multiple programming languages and platforms
  • Highly scalable and designed for microservices architectures

Cons of Kong

  • Steeper learning curve due to its extensive feature set
  • Requires more resources to run and maintain
  • Less integrated with the Spring ecosystem

Code Comparison

Kong (Lua):

local kong = kong
local request_uri = ngx.var.request_uri

if string.match(request_uri, "^/api/") then
    kong.service.request.set_path("/v1" .. request_uri)
end

Spring Cloud Gateway (Java):

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("rewrite_route", r -> r.path("/api/**")
            .filters(f -> f.rewritePath("/api/(?<segment>.*)", "/v1/${segment}"))
            .uri("http://example.com"))
        .build();
}

Both examples demonstrate path rewriting functionality, with Kong using Lua and Spring Cloud Gateway using Java. Kong's approach is more low-level, while Spring Cloud Gateway leverages Spring's declarative configuration style.

24,693

Cloud-native high-performance edge/middle/service proxy

Pros of Envoy

  • Language-agnostic: Works with any programming language or framework
  • High performance: Designed for low latency and high throughput
  • Extensive observability features: Built-in support for tracing, logging, and metrics

Cons of Envoy

  • Steeper learning curve: More complex configuration and setup
  • Less Spring ecosystem integration: Requires additional work to integrate with Spring applications

Code Comparison

Spring Cloud Gateway:

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("path_route", r -> r.path("/get")
            .uri("http://httpbin.org"))
        .build();
}

Envoy:

static_resources:
  listeners:
  - address:
      socket_address:
        address: 0.0.0.0
        port_value: 8080
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains:
              - "*"
              routes:
              - match:
                  prefix: "/get"
                route:
                  cluster: httpbin

Spring Cloud Gateway is more concise and integrates seamlessly with Spring Boot applications. Envoy's configuration is more verbose but offers greater flexibility and language-agnostic deployment options.

50,858

The Cloud Native Application Proxy

Pros of Traefik

  • Easier configuration and setup, especially for Docker environments
  • Built-in support for multiple providers (Docker, Kubernetes, etc.)
  • More comprehensive monitoring and observability features

Cons of Traefik

  • Less integration with Spring ecosystem
  • May require more manual configuration for complex routing scenarios
  • Limited support for custom filters and predicates compared to Spring Cloud Gateway

Code Comparison

Spring Cloud Gateway:

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("path_route", r -> r.path("/get")
            .uri("http://httpbin.org"))
        .build();
}

Traefik:

http:
  routers:
    my-router:
      rule: "Path(`/get`)"
      service: my-service
  services:
    my-service:
      loadBalancer:
        servers:
          - url: "http://httpbin.org"

Both Spring Cloud Gateway and Traefik are powerful API gateways, but they cater to different use cases. Spring Cloud Gateway is more tightly integrated with the Spring ecosystem, making it a natural choice for Spring-based microservices. It offers fine-grained control over routing and filtering.

Traefik, on the other hand, excels in container-based environments and offers easier configuration, especially for Docker and Kubernetes deployments. It provides built-in support for service discovery and load balancing across multiple providers.

The choice between the two depends on your specific requirements, existing infrastructure, and development ecosystem.

14,434

The Cloud-Native API Gateway

Pros of APISIX

  • Higher performance and lower latency due to its Lua-based architecture
  • More extensive plugin ecosystem with 50+ built-in plugins
  • Supports multiple protocols (HTTP, HTTPS, TCP, UDP, and more)

Cons of APISIX

  • Steeper learning curve, especially for developers not familiar with Lua
  • Less seamless integration with Spring Boot applications
  • Smaller community compared to Spring ecosystem

Code Comparison

APISIX configuration (YAML):

routes:
  - uri: /test
    upstream:
      type: roundrobin
      nodes:
        "127.0.0.1:1980": 1

Spring Cloud Gateway configuration (Java):

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("test", r -> r.path("/test")
            .uri("http://127.0.0.1:1980"))
        .build();
}

Both APISIX and Spring Cloud Gateway are powerful API gateway solutions, but they cater to different use cases and ecosystems. APISIX excels in high-performance scenarios and offers a wide range of plugins, making it suitable for complex, multi-protocol environments. Spring Cloud Gateway, on the other hand, integrates seamlessly with Spring Boot applications and provides a more familiar Java-based configuration, making it an excellent choice for Spring-centric microservices architectures.

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

//// DO NOT EDIT THIS FILE. IT WAS GENERATED. Manual changes to this file will be lost when it is generated again. Edit the files in the src/main/asciidoc/ directory instead. ////

image::https://github.com/spring-cloud/spring-cloud-gateway/workflows/Build/badge.svg?style=svg["Actions Status", link="https://github.com/spring-cloud/spring-cloud-gateway/actions"] image::https://codecov.io/gh/spring-cloud/spring-cloud-gateway/branch/main/graph/badge.svg["Codecov", link="https://codecov.io/gh/spring-cloud/spring-cloud-gateway/branch/main"]

[[features]] = Features

  • Java 17
  • Spring Framework 6
  • Spring Boot 3
  • Dynamic routing
  • Route matching built into Spring Handler Mapping
  • Route matching on HTTP Request (Path, Method, Header, Host, etc...)
  • Filters scoped to Matching Route
  • Filters can modify downstream HTTP Request and HTTP Response (Add/Remove Headers, Add/Remove Parameters, Rewrite Path, Set Path, Hystrix, etc...)
  • API or configuration driven
  • Supports Spring Cloud DiscoveryClient for configuring Routes

[[building]] = Building

:spring-cloud-build-branch: main

Spring Cloud is released under the non-restrictive Apache 2.0 license, and follows a very standard Github development process, using Github tracker for issues and merging pull requests into main. If you want to contribute even something trivial please do not hesitate, but follow the guidelines below.

[[sign-the-contributor-license-agreement]] == Sign the Contributor License Agreement

Before we accept a non-trivial patch or pull request we will need you to sign the https://cla.pivotal.io/sign/spring[Contributor License Agreement]. Signing the contributor's agreement does not grant anyone commit rights to the main repository, but it does mean that we can accept your contributions, and you will get an author credit if we do. Active contributors might be asked to join the core team, and given the ability to merge pull requests.

[[code-of-conduct]] == Code of Conduct This project adheres to the Contributor Covenant https://github.com/spring-cloud/spring-cloud-build/blob/main/docs/src/main/asciidoc/code-of-conduct.adoc[code of conduct]. By participating, you are expected to uphold this code. Please report unacceptable behavior to spring-code-of-conduct@pivotal.io.

[[code-conventions-and-housekeeping]] == Code Conventions and Housekeeping None of these is essential for a pull request, but they will all help. They can also be added after the original pull request but before a merge.

  • Use the Spring Framework code format conventions. If you use Eclipse you can import formatter settings using the eclipse-code-formatter.xml file from the https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/main/spring-cloud-dependencies-parent/eclipse-code-formatter.xml[Spring Cloud Build] project. If using IntelliJ, you can use the https://plugins.jetbrains.com/plugin/6546[Eclipse Code Formatter Plugin] to import the same file.
  • Make sure all new .java files to have a simple Javadoc class comment with at least an @author tag identifying you, and preferably at least a paragraph on what the class is for.
  • Add the ASF license header comment to all new .java files (copy from existing files in the project)
  • Add yourself as an @author to the .java files that you modify substantially (more than cosmetic changes).
  • Add some Javadocs and, if you change the namespace, some XSD doc elements.
  • A few unit tests would help a lot as well -- someone has to do it.
  • If no-one else is using your branch, please rebase it against the current main (or other target branch in the main project).
  • When writing a commit message please follow https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html[these conventions], if you are fixing an existing issue please add Fixes gh-XXXX at the end of the commit message (where XXXX is the issue number).

[[checkstyle]] == Checkstyle

Spring Cloud Build comes with a set of checkstyle rules. You can find them in the spring-cloud-build-tools module. The most notable files under the module are:

.spring-cloud-build-tools/

└── src    ├── checkstyle    │   └── checkstyle-suppressions.xml <3>    └── main    └── resources    ├── checkstyle-header.txt <2>    └── checkstyle.xml <1>

<1> Default Checkstyle rules <2> File header setup <3> Default suppression rules

[[checkstyle-configuration]] === Checkstyle configuration

Checkstyle rules are disabled by default. To add checkstyle to your project just define the following properties and plugins.

.pom.xml

true <1> true <2> true <3> <4> io.spring.javaformat spring-javaformat-maven-plugin <5> org.apache.maven.plugins maven-checkstyle-plugin
<reporting>
    <plugins>
        <plugin> <5>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-checkstyle-plugin</artifactId>
        </plugin>
    </plugins>
</reporting>
---- <1> Fails the build upon Checkstyle errors <2> Fails the build upon Checkstyle violations <3> Checkstyle analyzes also the test sources <4> Add the Spring Java Format plugin that will reformat your code to pass most of the Checkstyle formatting rules <5> Add checkstyle plugin to your build and reporting phases

If you need to suppress some rules (e.g. line length needs to be longer), then it's enough for you to define a file under ${project.root}/src/checkstyle/checkstyle-suppressions.xml with your suppressions. Example:

.projectRoot/src/checkstyle/checkstyle-suppresions.xml

----

It's advisable to copy the ${spring-cloud-build.rootFolder}/.editorconfig and ${spring-cloud-build.rootFolder}/.springformat to your project. That way, some default formatting rules will be applied. You can do so by running this script:

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

[[ide-setup]] == IDE setup

[[intellij-idea]] === Intellij IDEA

In order to setup Intellij you should import our coding conventions, inspection profiles and set up the checkstyle plugin. The following files can be found in the https://github.com/spring-cloud/spring-cloud-build/tree/main/spring-cloud-build-tools[Spring Cloud Build] project.

.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> Default Checkstyle rules <2> File header setup <3> Default suppression rules <4> Project defaults for Intellij that apply most of Checkstyle rules <5> Project style conventions for Intellij that apply most of Checkstyle rules

.Code style

image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/main/docs/modules/ROOT/assets/images/intellij-code-style.png[Code style]

Go to File -> Settings -> Editor -> Code style. There click on the icon next to the Scheme section. There, click on the Import Scheme value and pick the Intellij IDEA code style XML option. Import the spring-cloud-build-tools/src/main/resources/intellij/Intellij_Spring_Boot_Java_Conventions.xml file.

.Inspection profiles

image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/main/docs/modules/ROOT/assets/images/intellij-inspections.png[Code style]

Go to File -> Settings -> Editor -> Inspections. There click on the icon next to the Profile section. There, click on the Import Profile and import the spring-cloud-build-tools/src/main/resources/intellij/Intellij_Project_Defaults.xml file.

.Checkstyle

To have Intellij work with Checkstyle, you have to install the Checkstyle plugin. It's advisable to also install the Assertions2Assertj to automatically convert the JUnit assertions

image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/main/docs/modules/ROOT/assets/images/intellij-checkstyle.png[Checkstyle]

Go to File -> Settings -> Other settings -> Checkstyle. There click on the + icon in the Configuration file section. There, you'll have to define where the checkstyle rules should be picked from. In the image above, we've picked the rules from the cloned Spring Cloud Build repository. However, you can point to the Spring Cloud Build's GitHub repository (e.g. for the checkstyle.xml : https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/main/spring-cloud-build-tools/src/main/resources/checkstyle.xml). We need to provide the following variables:

  • checkstyle.header.file - please point it to the Spring Cloud Build's, spring-cloud-build-tools/src/main/resources/checkstyle-header.txt file either in your cloned repo or via the https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/main/spring-cloud-build-tools/src/main/resources/checkstyle-header.txt URL.
  • checkstyle.suppressions.file - default suppressions. Please point it to the Spring Cloud Build's, spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml file either in your cloned repo or via the https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/main/spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml URL.
  • checkstyle.additional.suppressions.file - this variable corresponds to suppressions in your local project. E.g. you're working on spring-cloud-contract. Then point to the project-root/src/checkstyle/checkstyle-suppressions.xml folder. Example for spring-cloud-contract would be: /home/username/spring-cloud-contract/src/checkstyle/checkstyle-suppressions.xml.

IMPORTANT: Remember to set the Scan Scope to All sources since we apply checkstyle rules for production and test sources.

[[duplicate-finder]] == Duplicate Finder

Spring Cloud Build brings along the basepom:duplicate-finder-maven-plugin, that enables flagging duplicate and conflicting classes and resources on the java classpath.

[[duplicate-finder-configuration]] === Duplicate Finder configuration

Duplicate finder is enabled by default and will run in the verify phase of your Maven build, but it will only take effect in your project if you add the duplicate-finder-maven-plugin to the build section of the projecst's pom.xml.

.pom.xml [source,xml]

org.basepom.maven duplicate-finder-maven-plugin ----

For other properties, we have set defaults as listed in the https://github.com/basepom/duplicate-finder-maven-plugin/wiki[plugin documentation].

You can easily override them but setting the value of the selected property prefixed with duplicate-finder-maven-plugin. For example, set duplicate-finder-maven-plugin.skip to true in order to skip duplicates check in your build.

If you need to add ignoredClassPatterns or ignoredResourcePatterns to your setup, make sure to add them in the plugin configuration section of your project:

[source,xml]

org.basepom.maven duplicate-finder-maven-plugin org.joda.time.base.BaseDateTime .*module-info changelog.txt

[[contributing]] = Contributing

:spring-cloud-build-branch: main

Spring Cloud is released under the non-restrictive Apache 2.0 license, and follows a very standard Github development process, using Github tracker for issues and merging pull requests into main. If you want to contribute even something trivial please do not hesitate, but follow the guidelines below.

[[sign-the-contributor-license-agreement]] == Sign the Contributor License Agreement

Before we accept a non-trivial patch or pull request we will need you to sign the https://cla.pivotal.io/sign/spring[Contributor License Agreement]. Signing the contributor's agreement does not grant anyone commit rights to the main repository, but it does mean that we can accept your contributions, and you will get an author credit if we do. Active contributors might be asked to join the core team, and given the ability to merge pull requests.

[[code-of-conduct]] == Code of Conduct This project adheres to the Contributor Covenant https://github.com/spring-cloud/spring-cloud-build/blob/main/docs/src/main/asciidoc/code-of-conduct.adoc[code of conduct]. By participating, you are expected to uphold this code. Please report unacceptable behavior to spring-code-of-conduct@pivotal.io.

[[code-conventions-and-housekeeping]] == Code Conventions and Housekeeping None of these is essential for a pull request, but they will all help. They can also be added after the original pull request but before a merge.

  • Use the Spring Framework code format conventions. If you use Eclipse you can import formatter settings using the eclipse-code-formatter.xml file from the https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/main/spring-cloud-dependencies-parent/eclipse-code-formatter.xml[Spring Cloud Build] project. If using IntelliJ, you can use the https://plugins.jetbrains.com/plugin/6546[Eclipse Code Formatter Plugin] to import the same file.
  • Make sure all new .java files to have a simple Javadoc class comment with at least an @author tag identifying you, and preferably at least a paragraph on what the class is for.
  • Add the ASF license header comment to all new .java files (copy from existing files in the project)
  • Add yourself as an @author to the .java files that you modify substantially (more than cosmetic changes).
  • Add some Javadocs and, if you change the namespace, some XSD doc elements.
  • A few unit tests would help a lot as well -- someone has to do it.
  • If no-one else is using your branch, please rebase it against the current main (or other target branch in the main project).
  • When writing a commit message please follow https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html[these conventions], if you are fixing an existing issue please add Fixes gh-XXXX at the end of the commit message (where XXXX is the issue number).

[[checkstyle]] == Checkstyle

Spring Cloud Build comes with a set of checkstyle rules. You can find them in the spring-cloud-build-tools module. The most notable files under the module are:

.spring-cloud-build-tools/

└── src    ├── checkstyle    │   └── checkstyle-suppressions.xml <3>    └── main    └── resources    ├── checkstyle-header.txt <2>    └── checkstyle.xml <1>

<1> Default Checkstyle rules <2> File header setup <3> Default suppression rules

[[checkstyle-configuration]] === Checkstyle configuration

Checkstyle rules are disabled by default. To add checkstyle to your project just define the following properties and plugins.

.pom.xml

true <1> true <2> true <3> <4> io.spring.javaformat spring-javaformat-maven-plugin <5> org.apache.maven.plugins maven-checkstyle-plugin
<reporting>
    <plugins>
        <plugin> <5>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-checkstyle-plugin</artifactId>
        </plugin>
    </plugins>
</reporting>
---- <1> Fails the build upon Checkstyle errors <2> Fails the build upon Checkstyle violations <3> Checkstyle analyzes also the test sources <4> Add the Spring Java Format plugin that will reformat your code to pass most of the Checkstyle formatting rules <5> Add checkstyle plugin to your build and reporting phases

If you need to suppress some rules (e.g. line length needs to be longer), then it's enough for you to define a file under ${project.root}/src/checkstyle/checkstyle-suppressions.xml with your suppressions. Example:

.projectRoot/src/checkstyle/checkstyle-suppresions.xml

----

It's advisable to copy the ${spring-cloud-build.rootFolder}/.editorconfig and ${spring-cloud-build.rootFolder}/.springformat to your project. That way, some default formatting rules will be applied. You can do so by running this script:

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

[[ide-setup]] == IDE setup

[[intellij-idea]] === Intellij IDEA

In order to setup Intellij you should import our coding conventions, inspection profiles and set up the checkstyle plugin. The following files can be found in the https://github.com/spring-cloud/spring-cloud-build/tree/main/spring-cloud-build-tools[Spring Cloud Build] project.

.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> Default Checkstyle rules <2> File header setup <3> Default suppression rules <4> Project defaults for Intellij that apply most of Checkstyle rules <5> Project style conventions for Intellij that apply most of Checkstyle rules

.Code style

image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/main/docs/modules/ROOT/assets/images/intellij-code-style.png[Code style]

Go to File -> Settings -> Editor -> Code style. There click on the icon next to the Scheme section. There, click on the Import Scheme value and pick the Intellij IDEA code style XML option. Import the spring-cloud-build-tools/src/main/resources/intellij/Intellij_Spring_Boot_Java_Conventions.xml file.

.Inspection profiles

image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/main/docs/modules/ROOT/assets/images/intellij-inspections.png[Code style]

Go to File -> Settings -> Editor -> Inspections. There click on the icon next to the Profile section. There, click on the Import Profile and import the spring-cloud-build-tools/src/main/resources/intellij/Intellij_Project_Defaults.xml file.

.Checkstyle

To have Intellij work with Checkstyle, you have to install the Checkstyle plugin. It's advisable to also install the Assertions2Assertj to automatically convert the JUnit assertions

image::https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/main/docs/modules/ROOT/assets/images/intellij-checkstyle.png[Checkstyle]

Go to File -> Settings -> Other settings -> Checkstyle. There click on the + icon in the Configuration file section. There, you'll have to define where the checkstyle rules should be picked from. In the image above, we've picked the rules from the cloned Spring Cloud Build repository. However, you can point to the Spring Cloud Build's GitHub repository (e.g. for the checkstyle.xml : https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/main/spring-cloud-build-tools/src/main/resources/checkstyle.xml). We need to provide the following variables:

  • checkstyle.header.file - please point it to the Spring Cloud Build's, spring-cloud-build-tools/src/main/resources/checkstyle-header.txt file either in your cloned repo or via the https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/main/spring-cloud-build-tools/src/main/resources/checkstyle-header.txt URL.
  • checkstyle.suppressions.file - default suppressions. Please point it to the Spring Cloud Build's, spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml file either in your cloned repo or via the https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/main/spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml URL.
  • checkstyle.additional.suppressions.file - this variable corresponds to suppressions in your local project. E.g. you're working on spring-cloud-contract. Then point to the project-root/src/checkstyle/checkstyle-suppressions.xml folder. Example for spring-cloud-contract would be: /home/username/spring-cloud-contract/src/checkstyle/checkstyle-suppressions.xml.

IMPORTANT: Remember to set the Scan Scope to All sources since we apply checkstyle rules for production and test sources.

[[duplicate-finder]] == Duplicate Finder

Spring Cloud Build brings along the basepom:duplicate-finder-maven-plugin, that enables flagging duplicate and conflicting classes and resources on the java classpath.

[[duplicate-finder-configuration]] === Duplicate Finder configuration

Duplicate finder is enabled by default and will run in the verify phase of your Maven build, but it will only take effect in your project if you add the duplicate-finder-maven-plugin to the build section of the projecst's pom.xml.

.pom.xml [source,xml]

org.basepom.maven duplicate-finder-maven-plugin ----

For other properties, we have set defaults as listed in the https://github.com/basepom/duplicate-finder-maven-plugin/wiki[plugin documentation].

You can easily override them but setting the value of the selected property prefixed with duplicate-finder-maven-plugin. For example, set duplicate-finder-maven-plugin.skip to true in order to skip duplicates check in your build.

If you need to add ignoredClassPatterns or ignoredResourcePatterns to your setup, make sure to add them in the plugin configuration section of your project:

[source,xml]

org.basepom.maven duplicate-finder-maven-plugin org.joda.time.base.BaseDateTime .*module-info changelog.txt