Live is streaming live. Watch now.

Deploy a Spring Boot Application

VMware Tanzu Labs

This lab will walk you through the process of deploying an application to Tanzu Application Service (Tanzu Application Service). This is known as “pushing an app to Tanzu Application Service”.

Learning outcomes

After completing the lab, you will be able to:

  • Use the Tanzu Application Service CLI to push an app

Getting started

  1. You must have completed (or fast-forwarded to) the Building a Spring Boot Application lab.

  2. In a terminal window, make sure you start in the ~/workspace/pal-tracker directory.

  3. Make sure you view the Tanzu Application Service Push slides after completing this lab for more information about how the push process works.

If you get stuck during this lab and need a little more help, please see the Hints section at the end.


In order to deploy a JVM application to Tanzu Application Service you will first need to create a standalone executable jar file. This will be a “fat jar” — a single jar file that contains all of its dependent libraries as well as your application code.

Assemble the jar file

Use Gradle to build the jar file for your application using the bootJar task.

Push the jar file

  1. Use the cf push command to push your code to an application named pal-tracker while making sure that you:

    • Use the -p flag to specify the jar file to push.
    • Add the appropriate option to generate a random route.
    • Add another option so that it does not start immediately when you push it for the first time.

    Use the help for the push command if you need to find the right options to use.

  2. Watch the cf push command output closely. You will see the CF CLI upload the jar file.

  3. When the command completes, look closely at the output after the Waiting for API to complete processing files... line.

    It will look similar (but not identical) to this:

    name:              pal-tracker
    requested state:   stopped
    last uploaded:
    type:           web
    instances:      0/1
    memory usage:   1024M
        state   since                  cpu    memory   disk     details
    #0   down    2021-08-13T19:46:20Z   0.0%   0 of 0   0 of 0
  4. Notice the routes list contains a single route. This is also the DNS host name for your application. The URL for your application will be https://<ROUTE> Remember it, you will need it later in the lab.

  5. Also notice the application is created on Tanzu Application Service, but it is in a down state with no instances (processes) running.

Setting the Java version

Set an environment variable to tell the buildpack to use Java 11.

cf set-env pal-tracker JBP_CONFIG_OPEN_JDK_JRE '{ jre: { version: 11.+ } }'

Start the application

  1. Start the application now that the environment variable is set.

    cf start pal-tracker
  2. Tanzu Application Service begins the staging process. Once staging finishes, Tanzu Application Service will start your application.

    When the command completes, look close at the output after the Waiting for app to start... line.

    name:              pal-tracker
    requested state:   started
    last uploaded:     Fri 13 Aug 14:59:06 CDT 2021
    stack:             cflinuxfs3
    buildpacks:        java
    type:            web
    instances:       1/1
    memory usage:    1024M
    start command:   JAVA_OPTS="-agentpath:$PWD/.java-buildpack/open_jdk_jre/bin/jvmkill-1.16.0_RELEASE=printHeapHistogram=1$TMPDIR
                    -XX:ActiveProcessorCount=$(nproc) -Djava.ext.dirs=$PWD/.java-buildpack/java_security/ $JAVA_OPTS" &&
                    CALCULATED_MEMORY=$($PWD/.java-buildpack/open_jdk_jre/bin/java-buildpack-memory-calculator-3.13.0_RELEASE -totMemory=$MEMORY_LIMIT -loadedClasses=19129
                    -poolType=metaspace -stackThreads=250 -vmOptions="$JAVA_OPTS") && echo JVM Memory Configuration: $CALCULATED_MEMORY && JAVA_OPTS="$JAVA_OPTS
                    $CALCULATED_MEMORY" && MALLOC_ARENA_MAX=2 SERVER_PORT=$PORT eval exec $PWD/.java-buildpack/open_jdk_jre/bin/java $JAVA_OPTS -cp
                    $PWD/.:$PWD/.java-buildpack/container_security_provider/container_security_provider-1.18.0_RELEASE.jar org.springframework.boot.loader.JarLauncher
        state     since                  cpu    memory         disk           details
    #0   running   2021-08-13T19:59:22Z   0.0%   131.9M of 1G   160.9M of 1G

    You should now see your application is running one instance (web process), and is in an up state. You can also see the command that Tanzu Application Service executed to run your pal-tracker application, and it is not the same one you used to run locally.

    You will see more details in the wrap up section.

What if you forgot to suppress the start?

Note that if you accidentally set your application to start when you initially pushed it, it would have failed to start.

You would have to use the restage command instead of start after setting the Java Build Pack environment variable to start the application.

You should be able to explain why this is the case after completing the next module.

Verify your app on Tanzu Application Service

Check that the application is running by visiting its URL in a browser and verifying that you see the correct message.

The application that you have built up to now is minimal, but there is now a solid foundation to build upon.

Learning outcomes

Now that you have completed the lab, you should be able to:

  • Use the Tanzu Application Service CLI to push an app

Wrap up

  • Review the Push an App slides for details of the interactions between the CLI and the Tanzu Application Service foundation components during the push process.
  • Review the Staging an App slides for details about the staging process and the role of buildpacks.


Where can you find the “fat jar” file?

Run the following commands:

cd ~/workspace/pal-tracker

./gradlew bootJar

ls build/libs

You should see a pal-tracker.jar file, and you can run this locally using:

java -jar build/libs/pal-tracker.jar

This is the file that you need to give to cf push.

What happens if the cf push command fails?

First check that you have provided all of the options described in the instructions.

If you see a message something like “An app was not successfully detected by any available buildpack” then you probably omitted the -p option or gave it the wrong argument.

If you saw a message something like “Routes cannot be mapped” then you have probably missed the --random-route option.

If the command hangs with “Instances starting” or fails to start (before setting the JBP_CONFIG_OPEN_JDK_JRE environment variable) then, as described above, you probably forgot the --no-start option.

Your command should look something like this:

cf push pal-tracker -p build/libs/pal-tracker.jar --random-route --no-start

If you are not certain what state your application is in and want to try the push again, it is safe to delete your app first:

cf delete pal-tracker