Setting Up a Modern Spring Boot Web Server with REST API & Web Content (2025 Guide)
Software engineer, founder, and leadership background in finance/tech. Based in San Francisco.
Software engineer, founder, and leadership background in finance/tech. Based in San Francisco.

This guide covers creating a Spring Boot application. Key aspects:
JAVA_HOME/M2_HOME) are covered in the Core Java & Build Tools Setup Guide. While this article primarily demonstrates a Maven-based Spring Boot project, Gradle is a well-supported alternative, and the linked guide provides details for both.application.properties and environment variables.src/main/java: Application code (MySpringBootAppApplication.java).src/main/resources/static: Static assets (HTML, CSS, JS).src/main/resources/application.properties: Configuration for the application.pom.xml: Maven configuration and dependency management.Edit src/main/resources/application.properties to configure your application:
# Server configuration
server.port=8080
server.servlet.context-path=/api
# Logging configuration
logging.level.root=INFO
logging.level.com.example=DEBUG
# Spring devtools
spring.devtools.restart.enabled=true
For different environments, create profile-specific properties:
application-dev.propertiesapplication-prod.propertiesFor sensitive data like API keys, use environment variables.
pom.xml:<dependency>
<groupId>me.paulschwarz</groupId>
<artifactId>spring-dotenv</artifactId>
<version>4.0.0</version>
</dependency>
.env.example file:SERVER_PORT=8080
CUSTOM_API_KEY=your-api-key-here
.env file (don't commit to git):SERVER_PORT=8080
CUSTOM_API_KEY=actual-api-key-value
application.properties:server.port=${SERVER_PORT:8080}
api.key=${CUSTOM_API_KEY}
Create src/main/java/com/example/myspringbootapp/HelloController.java:
package com.example.myspringbootapp;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String sayHello(
@RequestParam(defaultValue = "World") String name
) {
return String.format("Hello, %s!", name);
}
}
main methodmvn spring-boot:run
Visit http://localhost:8080/hello and http://localhost:8080/hello?name=Spring or use:
curl http://localhost:8080/hello
curl http://localhost:8080/hello?name=Developer
src/main/resources/static/index.html:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Static Page</title></head>
<body>
<h1>Welcome to My Static Page!</h1>
</body>
</html>
static/ automatically.Refer to the Core Maven Guide for general Maven commands. Specific to Spring Boot (using the Spring Boot Maven Plugin, typically included):
# Run the Spring Boot application (dev mode with hot reload if DevTools is present)
./mvnw spring-boot:run
# Package the application into an executable JAR
./mvnw clean package
# (The spring-boot-maven-plugin's repackage goal runs by default during the package phase)
# Build an OCI image (e.g., Docker image) if configured
./mvnw spring-boot:build-image
The spring-boot:run goal is particularly useful for development. For other standard Maven lifecycle commands like clean, compile, test, install, use them as described in the Core Maven Guide.
Spring Boot DevTools (spring-boot-devtools dependency) enables automatic restart/hot reload by default when files change. To optimize:
For IntelliJ IDEA:
For CLI:
mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Dspring.devtools.restart.enabled=true"
./mvnw spring-boot:run -Dspring-boot.run.profiles=dev # For Maven
# For Gradle: ./gradlew bootRun --args='--spring.profiles.active=dev'
Spring Boot automatically configures your application based on the JAR dependencies you have added. For example, if spring-boot-starter-web is on the classpath, it auto-configures Tomcat and Spring MVC.
Spring Boot "Starters" are convenient dependency descriptors that you can include in your application. For example, spring-boot-starter-data-jpa for JPA/Hibernate, spring-boot-starter-security for security.
If port 8080 is in use, change it in application.properties (e.g., server.port=8081) or via command line:
./mvnw spring-boot:run -Dspring-boot.run.arguments="--server.port=8081"
Maven Central (central.sonatype.com) is the primary public repository for Java libraries (dependencies). Spring Boot dependencies are typically fetched from here or other configured repositories (like Spring Milestones/Snapshots).
# Using Maven
./mvnw clean package
# This creates an executable JAR in target/your-app-name.jar
# Using Gradle
./gradlew clean bootJar
# This creates an executable JAR in build/libs/your-app-name.jar
java -jar target/myspringbootapp-0.0.1-SNAPSHOT.jar (adjust filename).java -jar target/*.jar --spring.profiles.active=prod
When running in production, set environment variables externally:
export SERVER_PORT=80
export CUSTOM_API_KEY=production-key
java -jar target/*.jar
Dockerfile:FROM eclipse-temurin:21-jre
WORKDIR /app
COPY target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
docker build -t myspringbootapp .
docker run -p 8080:8080 --env-file .env myspringbootapp