Expand Authors Top

If you have a few years of experience in the Java ecosystem and you’d like to share that with the community, have a look at our Contribution Guidelines.

Expanded Audience – Frontegg – Security (partner)
announcement - icon User management is very complex, when implemented properly. No surprise here.

Not having to roll all of that out manually, but instead integrating a mature, fully-fledged solution - yeah, that makes a lot of sense.
That's basically what Frontegg is - User Management for your application. It's focused on making your app scalable, secure and enjoyable for your users.
From signup to authentication, it supports simple scenarios all the way to complex and custom application logic.

Have a look:

>> Elegant User Management, Tailor-made for B2B SaaS

Generic Top

Get started with Spring 5 and Spring Boot 2, through the Learn Spring course:

>> CHECK OUT THE COURSE

1. Overview

Spring Boot, by default, serves content on the root context path (“/”).

While it's usually a good idea to prefer convention over configuration, there are cases when we do want to have a custom path.

In this quick tutorial, we'll cover the different ways of configuring it.

2. Setting the Property

Just like many other configuration options, the context path in Spring Boot can be changed by setting a property, server.servlet.context-path.

Note that this works for Spring Boot 2.x. For Boot 1.x, the property is server.context-path.

There are multiple ways of setting this property, so let's look at them one by one.

2.1. Using application.properties / yml

The most straightforward way of changing the context path is to set the property in the application.properties/yml file:

server.servlet.context-path=/baeldung

Instead of putting the properties file in src/main/resources, we can also keep it in the current working directory (outside of the classpath).

2.2. Java System Property

We can also set the context path as a Java system property before the context is even initialized:

public static void main(String[] args) {
    System.setProperty("server.servlet.context-path", "/baeldung");
    SpringApplication.run(Application.class, args);
}

2.3. OS Environment Variable

Spring Boot can also rely on OS environment variables. On Unix based systems we can write:

$ export SERVER_SERVLET_CONTEXT_PATH=/baeldung

On Windows, the command to set an environment variable is:

> set SERVER_SERVLET_CONTEXT_PATH=/baeldung

The above environment variable is for Spring Boot 2.x.x.  If we have 1.x.x, the variable is SERVER_CONTEXT_PATH.

2.4. Command Line Arguments

We can set the properties dynamically via command line arguments as well:

$ java -jar app.jar --server.servlet.context-path=/baeldung

3. Using Java Config

Now let's set the context path by populating the bean factory with a configuration bean.

With Spring Boot 2, we can use WebServerFactoryCustomizer:

@Bean
public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>
  webServerFactoryCustomizer() {
    return factory -> factory.setContextPath("/baeldung");
}

With Spring Boot 1, we can create an instance of EmbeddedServletContainerCustomizer:

@Bean
public EmbeddedServletContainerCustomizer
  embeddedServletContainerCustomizer() {
    return container -> container.setContextPath("/baeldung");
}

4. Priority Order of Configurations

With this many options, we may end up having more than one configuration for the same property.

Here's the priority order in descending order, which Spring Boot uses to select the effective configuration:

  1. Java Config
  2. Command Line Arguments
  3. Java System Properties
  4. OS Environment Variables
  5. application.properties in Current Directory
  6. application.properties in the classpath (src/main/resources or the packaged jar file)

5. Conclusion

In this brief article, we covered the different ways of setting the context path, or any other configuration property, in a Spring Boot application.

Generic bottom

Get started with Spring 5 and Spring Boot 2, through the Learn Spring course:

>> CHECK OUT THE COURSE
Generic footer banner
2 Comments
Oldest
Newest
Inline Feedbacks
View all comments
Comments are closed on this article!