create-spring-boot-project

star 968

Creates a new Spring Boot project by downloading it from start.spring.io using curl, then extracting it into the target directory. Use this when a user asks to create, generate, initialize, or scaffold a new Spring Boot project.

spring-projects By spring-projects schedule Updated 5/5/2026

name: create-spring-boot-project description: Creates a new Spring Boot project by downloading it from start.spring.io using curl, then extracting it into the target directory. Use this when a user asks to create, generate, initialize, or scaffold a new Spring Boot project. arguments: [project_description] allowed-tools: Bash, View

You are creating a new Spring Boot project based on the user's request: $ARGUMENTS[0]

Step 1: Detect the available JDK version

Before choosing parameters, detect the major version of the JDK available in the environment, and use it as the default javaVersion:

java -version 2>&1 | head -n 1

Parse the major version (e.g. 21, 17, 11, 8) from the output. If no JDK is available, stop and inform the user.

Step 2: Gather project parameters

Determine the following from the user's request (use defaults where not specified):

Parameter Default Notes
type maven-project maven-project or gradle-project
language java java, kotlin, or groovy
bootVersion (omit) Omit to use the latest stable version automatically
groupId com.example
artifactId demo Derived from project name if given
name same as artifactId Becomes the main class name (<Name>Application)
description Demo project
packageName com.example.demo groupId + . + artifactId
packaging jar jar or war
javaVersion (detected in Step 1) Override only if user explicitly asked
dependencies (none) Comma-separated IDs from start.spring.io

Note that name is also used to derive the main application class file. A hyphenated artifactId like my-service will produce MyServiceApplication.java. If the user wants a specific class name, set name independently from artifactId.

Finding Dependency IDs

Common IDs:

  • Web: web (Spring Web / REST), webflux (Reactive Web), graphql, thymeleaf
  • Data: data-jpa, data-mongodb, data-redis, jdbc
  • Database drivers: h2, postgresql, mysql
  • Security: security, oauth2-client, oauth2-resource-server
  • Messaging: amqp (RabbitMQ), kafka, mail
  • Validation / DevTools / Ops: validation, devtools, actuator, lombok, docker-compose, testcontainers
  • Cloud: cloud-config-client, cloud-eureka (Eureka client), cloud-eureka-server (Eureka server)
  • AI: Spring AI dependency IDs (e.g. for OpenAI, Ollama, Anthropic, vector stores) change frequently between Boot versions. ALWAYS verify them via the /dependencies endpoint below rather than guessing.

If the user requested a technology not listed above, or you have any doubt about the exact ID, you MUST look up the correct ID by running:

curl -sS "https://start.spring.io?bootVersion=<bootVersion>" | grep -i -A1 '<search-term>'

(If no specific Boot version was requested, omit the ?bootVersion=... query parameter.)

When called by curl without an Accept: application/json header, start.spring.io returns a human-readable text page that includes a table of every supported dependency with columns Id, Description, and Required version. This is far simpler than parsing the JSON /dependencies endpoint — do NOT write a Python/jq/sed script to parse JSON. Just curl the URL and grep for the technology name (e.g. kafka, openai, eureka). Read the matching Id value directly from the table.

The bootVersion query parameter is accepted but does not filter rows out of the table; instead, use the Required version column on the matched row to confirm the dependency is compatible with the requested Boot version (e.g. >=3.5.0 and <4.1.0-M1). If the requested Boot version falls outside that range, do not use the dependency.

Step 3: Determine the target directory

  • If the user specified a path, use that.
  • Otherwise, create a new folder named after the artifactId in the current working directory.
  • If the target directory already exists and is non-empty, STOP and ask the user whether to overwrite, choose a different name, or abort. Do not extract on top of existing files.

Step 4: Download and extract the project

Note: The commands below are designed for macOS and Linux-based systems. If you are running on Windows, you MUST adapt these commands appropriately for your environment (e.g., downloading a .zip to a temporary file and extracting it using PowerShell, rather than piping binary data). Note that older Windows builds may ship a tar that does not support -z; bsdtar from Windows 10+ does.

Use a POST request to start.spring.io/starter.tgz and pipe it directly into tar. This avoids URL encoding issues for the URL itself and avoids temporary files.

Run the following command. Add -d bootVersion=<bootVersion> only if the user explicitly requested a Boot version, and omit any other -d parameters that are not specified:

set -o pipefail
mkdir -p <target-directory>
curl -fsS https://start.spring.io/starter.tgz \
  -d type=<type> \
  -d language=<language> \
  -d groupId=<groupId> \
  -d artifactId=<artifactId> \
  --data-urlencode "name=<name>" \
  --data-urlencode "description=<description>" \
  -d packageName=<packageName> \
  -d packaging=<packaging> \
  -d javaVersion=<javaVersion> \
  -d dependencies=<dep1,dep2,...> | tar -xzf - -C <target-directory>

Use --data-urlencode for any free-text field that may contain spaces or special characters (name, description). Plain -d does NOT URL-encode values, which can corrupt the request body. The -f flag on curl makes HTTP errors (e.g. 400 from start.spring.io for an invalid dependency ID) return a non-zero exit code instead of streaming an error body into tar. Combined with set -o pipefail, this surfaces the real failure cause.

Step 5: Confirm success

After extraction, verify the project was created correctly by checking for a build file:

ls -la <target-directory>
test -f <target-directory>/pom.xml \
  || test -f <target-directory>/build.gradle \
  || test -f <target-directory>/build.gradle.kts

If no build file is present, treat the operation as failed and report the issue (typically a curl/tar pipeline error from Step 4) instead of claiming success.

On rare environments, the Maven/Gradle wrapper scripts may not retain their executable bit after extraction. If ./mvnw or ./gradlew reports "permission denied", run chmod +x mvnw gradlew inside the project directory.

Step 6: Switch the working directory into the new project

Once Step 5 confirms success, change the shell's working directory into the newly created project directory so that any subsequent commands (build, run, edits, follow-up tool calls) operate inside the project:

cd <target-directory>
pwd

Run pwd afterwards and confirm the output matches the expected project directory. This cd MUST happen as the final action of the skill (after success verification, before reporting back to the user) so that the user's next instruction starts inside the project.

If you also have access to a tool that changes Claude Code's persistent working directory (e.g. a dedicated cwd / project-root tool exposed by the host), use it in addition to the shell cd so that all tools — not just Bash — operate from the new location.

Step 7: Report back to the user

Report:

  • The directory where the project was extracted (and confirm that the working directory is now set to it)
  • The selected dependencies
  • The resolved javaVersion (and how it was detected)
  • Any next steps (e.g., ./mvnw spring-boot:run or ./gradlew bootRun — note that cd is no longer needed because Step 6 already moved into the project)
Install via CLI
npx skills add https://github.com/spring-projects/spring-tools --skill create-spring-boot-project
Repository Details
star Stars 968
call_split Forks 229
navigation Branch main
article Path SKILL.md
More from Creator
spring-projects
spring-projects Explore all skills →