Create Spring Boot App and Deploy to Heroku

Create Spring Boot App and Deploy to Heroku

by John Vincent


Posted on May 6, 2018


This document discusses how to create a very basic Spring Boot application and how to deploy it to Heroku.

Introduction

Spring Boot, Eclipse, Maven and Heroku do not play nice and so I created a structured methodology.

Other topics include

Create Spring Boot App

Create github repository myproject-eclipse

Github repository: git@github.com:johnvincentio/myproject-eclipse.git

Local Development

Create local project

cd /Users/jv/Desktop/MyDevelopment/github/projects-heroku
create-repo myproject-eclipse

Project directory

/Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-eclipse

Create Spring Boot App

Spring Initializr

  • Group: io.johnvincent

  • Artifact: myproject

  • Packaging: Jar

  • Java: 8

  • Dependency: Spring Web

Downloads a zip file to /Users/jv/Downloads

Unzip the file.

Copy myproject to /Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-eclipse

Import into Eclipse

Start eclipse-jee from /Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-eclipse

Open Eclipse at myproject

  • File, Import
  • Maven, Existing Maven Projects

Maven Projects

  • Root directory: /Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-eclipse

Select Finish

Maven Project is Imported.

Code

MyprojectApplication.java

package io.johnvincent.myproject;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.*;
import org.springframework.stereotype.*;

@Controller
@SpringBootApplication
public class MyprojectApplication {

    @RequestMapping("/")
    @ResponseBody
    String home() {
      return "Hello World!";
    }

	public static void main(String[] args) {
		SpringApplication.run(MyprojectApplication.class, args);
	}

}

application.properties

server.port=9517

Commit to repository

git add .
git commit -m "init"
git push

Execute

cd /Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-eclipse/myproject

./mvnw spring-boot:run

Test

http://localhost:9517

Create-package script

cd /Users/jv/Desktop/MyDevelopment/github/projects/springboot-heroku/springboot-heroku

create-package

#!/bin/sh
#
# script to create Jar
#
#
echo "Maven clean and make the package"
./mvnw clean package

echo "Save Jar"
cp target/myproject-0.0.1-SNAPSHOT.jar ../myproject.jar

echo "Completed"

Build Jar file

/Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-eclipse/myproject

./create-package

Execute Jar file

cd /Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-eclipse

java -jar myproject.jar

Test

http://localhost:9517

Deploy Spring Boot App to Heroku

Github repository name: myproject-eclipse

Github repository: git@github.com:johnvincentio/myproject-eclipse.git

Spring Boot Project directory

/Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-eclipse

Heroku Project directory

/Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-heroku

Create Local Development

cd /Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject

mkdir myproject-heroku

Create local git repository

cd myproject-heroku
git init
git add README.md
git commit -m "initial"

Heroku Login

Login to Heroku

cd /Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-heroku

heroku login

Create Heroku App

cd /Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-heroku

heroku create johnvincentio-myproject
https://johnvincentio-myproject.herokuapp.com/ | https://git.heroku.com/johnvincentio-myproject.git
  • Application url: https://johnvincentio-myproject.herokuapp.com/
  • Heroku git repository: https://git.heroku.com/johnvincentio-myproject.git

Check Git

git remote -v

shows

heroku	https://git.heroku.com/johnvincentio-myproject.git (fetch)
heroku	https://git.heroku.com/johnvincentio-myproject.git (push)

Script to copy Spring Boot App

Create script /Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-eclipse/myproject/create-heroku-package

#!/bin/sh
#
# script to create Heroku ready Spring Boot app
#
HEROKU_DIR="/Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-heroku"
CURR_DIR=`pwd`
#
echo " "
echo "Script to copy Spring Boot app files to Heroku project"
echo " "
echo "Current directory: $CURR_DIR"
echo " Heroku directory: $HEROKU_DIR"
echo " "
#
echo "Maven clean and make the package"
./mvnw clean package
#
echo "Copying Spring Boot app files"
cp -r src $HEROKU_DIR
cp -r target $HEROKU_DIR
cp pom.xml $HEROKU_DIR
cp mvnw $HEROKU_DIR
#
echo " "
echo "Completed"

Copy Spring Boot App

cd /Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-eclipse/myproject

./create-heroku-package

Add to repository

cd /Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-eclipse/myproject

git add .
git commit -m "myproject code"

Deploy the Code

/Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-heroku

git push heroku master

Test

https://johnvincentio-myproject.herokuapp.com/

Future Development Cycle

  • Make code changes and test
  • Copy code to Heroku
cd /Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-eclipse/myproject

./create-heroku-package
  • Commit to git
cd /Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-heroku

git add .
git commit -m "updates"
  • Update Heroku
cd /Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-heroku

git push heroku master
  • Test with https://johnvincentio-myproject.herokuapp.com/

Deploy Spring Boot App to Heroku via Procfile

Github repository name: myproject-eclipse

Github repository: git@github.com:johnvincentio/myproject-eclipse.git

Spring Boot Project directory

/Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-eclipse

Heroku Project directory

/Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-heroku

Heroku Procfile Project directory

/Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-procfile

Create Local Development

cd /Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject

mkdir myproject-procfile

Create local git repository

cd myproject-procfile

git init
git add README.md
git commit -m "initial"

Heroku Login

Login to Heroku

cd /Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-procfile

heroku login

Create Heroku App

cd /Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-procfile

heroku create johnvincentio-procfile
https://johnvincentio-procfile.herokuapp.com/ | https://git.heroku.com/johnvincentio-procfile.git
  • Application url: https://johnvincentio-procfile.herokuapp.com/
  • Heroku git repository: https://git.heroku.com/johnvincentio-procfile.git

Check Git

git remote -v

shows

heroku	https://git.heroku.com/johnvincentio-procfile.git (fetch)
heroku	https://git.heroku.com/johnvincentio-procfile.git (push)

Copy Spring Boot App

cd /Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-eclipse

cp myproject.jar /Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-procfile

Create Procfile

/Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-procfile/Procfile

web: java -jar myproject.jar

Add to repository

cd /Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-procfile

git add .
git commit -m "myproject code"

Deploy the Code

/Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-procfile

git push heroku master

Produces error

remote: Building source:
remote: 
remote:  !     No default language could be detected for this app.
remote: 			HINT: This occurs when Heroku cannot detect the buildpack to use for this application automatically.
remote: 			See https://devcenter.heroku.com/articles/buildpacks
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: !	Push rejected to johnvincentio-procfile.
remote: 
To https://git.heroku.com/johnvincentio-procfile.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/johnvincentio-procfile.git'

Heroku does not know how to build the app. It has not picked up Procfile

This apparently should work but it doesn't. I do not know how to proceed from here.

Other

If on deployment to Heroku you get this error

remote:  !     No default language could be detected for this app.
remote: 			HINT: This occurs when Heroku cannot detect the buildpack to use for this application automatically.
remote: 			See https://devcenter.heroku.com/articles/buildpacks

check that pom.xml is in the root directory.

Buildpacks

Not needed for this application but lets describe here.

See https://devcenter.heroku.com/articles/buildpacks

Add Java Buildpack

cd /Users/jv/Desktop/MyDevelopment/github/projects-heroku/myproject/myproject-heroku

heroku buildpacks:set heroku/java

Remove Java Buildpack

heroku buildpacks:remove heroku/java