Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to deploy Spring Boot to Cloud Foundry?

I tried to deploy my spring boot app to CF with the following pom.xml

       <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cloud-connectors</artifactId>
        </dependency>
    </dependencies>

UPDATED

My application

@SpringBootApplication
public class EdollarApplication {

    @Autowired
    private DataSource dataSource;

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

DataSourceConfiguration.java

@Configuration
@Profile("cloud")
public class DataSourceConfiguration {

  @Bean
  public Cloud cloud() {
    return new CloudFactory().getCloud();
  }

  @Bean
  @ConfigurationProperties(DataSourceProperties.PREFIX)
  public DataSource dataSource() {
    return cloud().getSingletonServiceConnector(DataSource.class, null);
  }

}

There's no error in the logs however I am not able to access the URLs that I have defined in the application. Sample logs shown below

Updated app with guid 8b167ac9-11bb-483e-be0a-3dd8c8991a84 ({"state"=>"STARTED"})
-----> Downloaded app package (20K)

-----> Downloading Open Jdk JRE 1.8.0_45 from https://download.run.pivotal.io/openjdk/trusty/x86_64/openjdk-1.8.0_45.tar.gz (2.5s)
       Expanding Open Jdk JRE to .java-buildpack/open_jdk_jre (1.3s)
-----> Downloading Tomcat Instance 8.0.21 from https://download.run.pivotal.io/tomcat/tomcat-8.0.21.tar.gz (0.5s)
       Expanding Tomcat to .java-buildpack/tomcat (0.1s)
-----> Downloading Tomcat Lifecycle Support 2.4.0_RELEASE from https://download.run.pivotal.io/tomcat-lifecycle-support/tomcat-lifecycle-support-2.4.0_RELEASE.jar (0.0s)
-----> Downloading Tomcat Logging Support 2.4.0_RELEASE from https://download.run.pivotal.io/tomcat-logging-support/tomcat-logging-support-2.4.0_RELEASE.jar (0.0s)
-----> Downloading Tomcat Access Logging Support 2.4.0_RELEASE from https://download.run.pivotal.io/tomcat-access-logging-support/tomcat-access-logging-support-2.4.0_RELEASE.jar (0.0s)
-----> Uploading droplet (51M)
[CONTAINER] org.apache.catalina.core.StandardService           INFO    Starting service Catalina
[CONTAINER] org.apache.catalina.startup.Catalina               INFO    Initialization processed in 514 ms
[CONTAINER] org.apache.coyote.http11.Http11NioProtocol         INFO    Initializing ProtocolHandler ["http-nio-61187"]
[CONTAINER] org.apache.catalina.core.StandardEngine            INFO    Starting Servlet Engine: Apache Tomcat/8.0.21
[CONTAINER] org.apache.catalina.startup.HostConfig             INFO    Deploying web application directory /home/vcap/app/.java-buildpack/tomcat/webapps/ROOT
[CONTAINER] org.apache.jasper.servlet.TldScanner               INFO    At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
[CONTAINER] org.apache.coyote.http11.Http11NioProtocol         INFO    Starting ProtocolHandler ["http-nio-61187"]
[CONTAINER] org.apache.tomcat.util.net.NioSelectorPool         INFO    Using a shared selector for servlet write/read
[CONTAINER] org.apache.catalina.startup.Catalina               INFO    Server startup in 507 ms

What did I miss here ?

like image 237
abiieez Avatar asked May 06 '15 02:05

abiieez


1 Answers

Here's an example of a minimal Spring Boot project which is configured to run in Cloud Foundry: https://github.com/gratiartis/super-mini

I got it running in Cloud Foundry by putting the following manifest.yml into the root directory of the project.

---
applications:
- name: super-mini
  # Fork of https://github.com/cloudfoundry/java-buildpack
  # For stability, keep your own fork.
  buildpack: https://github.com/gratiartis/java-buildpack
  memory: 512M
  instances: 1
  # Because the URL will be http://super-mini.cfapps.io/
  host: super-mini
  domain: cfapps.io
  path: target/super-mini-1.0.0-SNAPSHOT.jar

Note that the following can be added to activate a profile (i.e. "cloud"):

  env:
    SPRING_PROFILES_ACTIVE: cloud

The path is based on me running the deploy from the root directory of my project. As I'm sure you will have guessed, it's a Maven build, so a .jar is created in a target directory.

To deploy, cd into the root directory of the project and run:

cf push

The above will create an application running at http://super-mini.cfapps.io/hello

Take a look - it's running at the moment. Of course, I have now created that application name, so you can't use that!

like image 181
Steve Avatar answered Oct 03 '22 01:10

Steve