To start a new project based on Spring or Spring Boot we can use the website start.spring.io. We can easily create a project templates based on Maven or Gradle and define all needed dependencies by clicking on checkboxes in the UI. In a previous post we also learned how to create a project using a URL using the same start.spring.io website. The start.spring.io website is actually a Spring Boot application and we can easily host our own server. With our own server we can for example limit the number of dependencies, force Gradle as the only build tool and set default values for project name, packages and much more.

To get started we must first clone the GitHub project. We need to build the project with Maven to install the libraries in our local Maven repository. After that is done we are reading to use it in our own Spring Boot application that is our customised Spring Initializr server. The easiest way to run the server is to have the Spring CLI tool installed. The easiest way to install it is using SDKMAN!. We type on the command line $ sdk install springboot.

Next we create a new directory and inside the directory we create a new Groovy file initializr.groovy:

package app

@Grab('io.spring.initalizr:initializr-web:1.0.0.BUILD-SNAPSHOT')
@Grab('spring-boot-starter-web')
class InitializerService {}

Next we need a configuration file which all the options for the Spring Initializr server. We can start by copying the file application.yml from the initializr-service project on GitHub to our directory with the file initializr.groovy. This file contains a lot of information. The configuration format is explained on the GitHub wiki, but it is really straight forward. If we open the file we can for example remove dependencies from the dependencies or set default values for the groupId. If we only want to support Gradle we can remove the Maven references from the types section. And of course to have Groovy as the default language we can in the languages section set the default to true for Groovy.

...
  artifactId:
    value: sample
  groupId:
    value: com.mrhaki
  version:
    value: 1.0.0.DEVELOPMENT
  name:
    value: Sample
  description:
    value: Sample Project
  packageName:
    value: com.mrhaki.demo
...
  types:
    - name: Gradle Project
      id: gradle-project
      description: Generate a Gradle based project archive
      sts-id: gradle.zip
      tags:
        build: gradle
        format: project
      default: false
      action: /starter.zip
    - name: Gradle Config
      id: gradle-build
      description: Generate a Gradle build file
      sts-id: build.gradle
      tags:
        build: gradle
        format: build
      default: true
      action: /build.gradle
...
  javaVersions:
    - id: 1.8
      default: true
  languages:
    - name: Java
      id: java
      default: false
    - name: Groovy
      id: groovy
      default: true
...

And that is it! We are ready to start our own Spring Initializr server:

$ spring run initializr.groovy
...

For a finishing touch we can also override the static resources and templates of the server application. For example we can add a new spring.css file in the directory static/css. And place a file home.html in the directory templates. We can take the existing files as sample and change what we want.

The following screenshot shows a customized template with some style changes:

We can even use our server to create a project from IntelliJ IDEA. When we create a new project and select Spring Initializr from the list box on the left we can type in the URL of our server:

Next we see our default values for the project details:

And finally we can select the dependencies we have defined in our application.yml file:

Original blog post

shadow-left