Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring Boot War deployed to Tomcat

I am trying to deploy a Spring Boot app to Tomcat, because I want to deploy to AWS. I created a WAR file, but it does not seem to run on Tomcat, even though it is visible.

Details:
0. Here is my app:

@Configuration @ComponentScan @EnableAutoConfiguration public class App {     public static void main(String[] args) {         SpringApplication.run(SampleController.class, args);     } }  @Controller @EnableAutoConfiguration public class SampleController {     @RequestMapping("/help")     @ResponseBody     String home() {         String input = "Hi! Please use 'tag','check' and 'close' resources.";         return input;     } } 

application.properties has following:

server.port=${port:7777} 
  1. After reading a number of pages and question-answers I added following to my POM:

    http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0

    <groupId>com.niewlabs</groupId> <artifactId>highlighter</artifactId> <version>1.0-SNAPSHOT</version>  <packaging>war</packaging>  <properties>     <java.version>1.8</java.version> </properties>     <parent>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-parent</artifactId>     <version>1.1.9.RELEASE</version> </parent>     <dependencies>     <dependency>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-web</artifactId>     </dependency>     <dependency>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-tomcat</artifactId>         <scope>provided</scope>     </dependency> </dependencies> 

  2. I ran"mvn package"and got WAR file (size 250Mb), which I put into "webapps" folder.

  3. I started Tomcat and am able to see my app listed, in my case "/highlighter-1.0-SNAPSHOT".
  4. Clicking on the link for the app results in "Status 404" page.
  5. When I run Spring Boot app just by itself, without container it runs on localhost:7777, but there is nothing there when I run it in Tomcat.

Update: There is another reference. Not sure how useful it is.

like image 762
Daniil Shevelev Avatar asked Jan 12 '15 14:01

Daniil Shevelev


People also ask

Can we deploy spring boot application in Tomcat?

By using Spring Boot application, we can create a war file to deploy into the web server. In this chapter, you are going to learn how to create a WAR file and deploy the Spring Boot application in Tomcat web server.

Can we deploy war file in Tomcat?

Perhaps the simplest way to deploy a WAR file to Tomcat is to copy the file to Tomcat's webapps directory. Copy and paste WAR files into Tomcat's webapps directory to deploy them. Tomcat monitors this webapps directory for changes, and if it finds a new file there, it will attempt to deploy it.

Where is war file deployed in Tomcat?

Go to your project Directory and inside Dist Folder you will get war file that you copy on your tomcat. webApp Folder.


2 Answers

This guide explains in detail how to deploy Spring Boot app on Tomcat:
http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war-file

Essentially I needed to add following class:

public class WebInitializer extends SpringBootServletInitializer {        @Override     protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {         return application.sources(App.class);     }     } 

Also I added following property to POM:

<properties>             <start-class>mypackage.App</start-class> </properties> 
like image 152
Daniil Shevelev Avatar answered Sep 19 '22 14:09

Daniil Shevelev


Hey make sure to do this changes to the pom.xml

<packaging>war</packaging> 

in the dependencies section make sure to indicated the tomcat is provided so you dont need the embeded tomcat plugin.

    <dependency>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-tomcat</artifactId>         <scope>provided</scope>     </dependency>             <dependency>         <groupId>org.apache.tomcat.embed</groupId>         <artifactId>tomcat-embed-jasper</artifactId>         <scope>provided</scope>     </dependency>        

This is the whole pom.xml

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">     <modelVersion>4.0.0</modelVersion>      <groupId>com.example</groupId>     <artifactId>demo</artifactId>     <version>0.0.1-SNAPSHOT</version>     <packaging>war</packaging>      <name>demo</name>     <description>Demo project for Spring Boot</description>      <parent>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-parent</artifactId>         <version>1.4.0.RELEASE</version>         <relativePath/> <!-- lookup parent from repository -->     </parent>      <properties>         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>         <java.version>1.8</java.version>         <start-class>com.example.Application</start-class>     </properties>      <dependencies>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-web</artifactId>         </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-tomcat</artifactId>             <scope>provided</scope>         </dependency>                 <dependency>             <groupId>org.apache.tomcat.embed</groupId>             <artifactId>tomcat-embed-jasper</artifactId>             <scope>provided</scope>         </dependency>             </dependencies>      <build>         <plugins>             <plugin>                 <groupId>org.springframework.boot</groupId>                 <artifactId>spring-boot-maven-plugin</artifactId>             </plugin>         </plugins>     </build>   </project> 

And the Application class should be like this

Application.java

package com.example;  import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.support.SpringBootServletInitializer;  @SpringBootApplication public class Application extends SpringBootServletInitializer {       /**      * Used when run as JAR      */     public static void main(String[] args) {         SpringApplication.run(Application.class, args);     }      /**      * Used when run as WAR      */     @Override     protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {         return builder.sources(Application.class);     }  } 

And you can add a controller for testing MyController.java

package com.example;  import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;  @Controller public class MyController {      @RequestMapping("/hi")     public @ResponseBody String hiThere(){         return "hello world!";     } } 

Then you can run the project in a tomcat 8 version and access the controller like this

http://localhost:8080/demo/hi

If for some reason you are not able to add the project to tomcat do a right click in the project and then go to the Build Path->configure build path->Project Faces

make sure only this 3 are selected

Dynamic web Module 3.1 Java 1.8 Javascript 1.0

like image 22
Cesar Chavez Avatar answered Sep 21 '22 14:09

Cesar Chavez