Spring Boot War部署到Tomcat

我正在尝试将Spring Boot应用程序部署到Tomcat,因为我想部署到AWS。 我创build了一个WAR文件,但它似乎没有在Tomcat上运行,尽pipe它是可见的。

细节:
0.这是我的应用程序:

@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具有以下内容:

 server.port=${port:7777} 
  1. 阅读了一些页面和问题答案后,我添加到我的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. 我运行“mvn包”,并获得了WAR文件(大小250Mb),我把它放到“webapps”文件夹中。

  3. 我开始使用Tomcat,并能看到我的应用程序,在我的情况下“/highlighter-1.0-SNAPSHOT”。
  4. 点击应用程序链接的结果在“状态404”页面。
  5. 当我自己运行Spring Boot应用程序时,如果没有容器,它会在localhost:7777上运行,但是当我在Tomcat中运行时没有任何内容。

更新:还有另外一个参考 。 不知道它是多么有用。

本指南详细介绍了如何在Tomcat上部署Spring Boot应用程序:
http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war-file

基本上我需要添加以下类:

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

此外,我添加以下属性到POM:

 <properties> <start-class>mypackage.App</start-class> </properties> 

我觉得你对这里的不同范例感到困惑。 首先,战争文件和服务器部署 – 这些东西属于Java企业版(Java EE)。 这些概念在Spring引导应用程序中没有真正的地位,它遵循不同的模型。

Spring-Boot负责创build一个embedded式容器,并直接从标准的jar文件中运行你的服务(尽pipe它可以做很多事情)。 我认为这种模式的意图是支持微服务的发展 – 每个服务都有自己的容器,是完全独立的。 你也可以使用你的代码来生成Java EE应用程序,但是考虑到spring-boot(对于某些types的应用程序/服务)要简单得多,那将是愚蠢的。

所以,给出这个信息,你现在必须决定你要遵循什么样的范式,而且你只需要遵循这一点就可以了。

Spring的启动是可执行的 – 你只需要在App类中运行主要的方法,你可以从命令行或者使用你喜欢的IDE或Maven或Gradle(提示:maven是正确的答案)。 这将启动一个tomcat服务器(默认),你的服务将在其中。 考虑到你在服务上面发布的configuration应该在以下位置可用: http://localhost:7777/context/helpcontext被replace为你没有共享的上下文名称。

你不打算创build一个战争,运行tomcat,或部署任何东西。 在春季引导中没有必要。 你的pom中的包装应该是jar而不是war并且spring-boot-starter-tomcat应该被删除 – 当然没有提供。

当你运行你的main方法时,控制台输出应该告诉你你已经注册的上下文; 使用它来获得正确的URL。

说了这么多话,现在弹簧引导必须存在于JEE世界中(直到被广泛采用)。 由于这个原因,spring的人们已经logging了构build战争而不是可执行jar的方法,用于部署到servlet或JEE容器。 这使得许多弹簧启动技术可以用于除了战争(或耳朵)之外的任何其他使用限制的环境中。 但是,这仅仅是对这样一个事实的回应,即这种环境相当普遍,并不是解决scheme中必不可less的一部分。

嘿,确保对pom.xml进行更改

 <packaging>war</packaging> 

在依赖部分确保提供了tomcat,所以你不需要embedded的tomcat插件。

  <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> 

这是整个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> 

而应用程序类应该是这样的

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); } } 

你可以添加一个控制器来testingMyController.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!"; } } 

然后你可以运行tomcat 8版本的项目并像这样访问控制器

HTTP://本地主机:8080 /演示/喜

如果由于某种原因,您不能将项目添加到tomcat中,请在项目中右键单击,然后转到Build Path-> configure build path-> Project Faces

确保只有这3个被选中

dynamic网页模块3.1 Java 1.8 JavaScript 1.0

你的Application.java类应该扩展SpringBootServletInitializer类,例如:

 public class Application extends SpringBootServletInitializer {} 

我有同样的问题,我find解决scheme遵循本指南 。 我在maven运行目标。

干净的包裹

它为我Thanq工作

对使用Gradle的人的解决scheme

添加插件build.gradle

 apply plugin: 'war' 

向tomcat添加提供的依赖项

 dependencies { // other dependencies providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' } 

遵循指南(或使用Spring Initializr)后,我的本地计算机上有一个WAR,但远程工作(在Tomcat上运行)。

没有错误信息,它只是说“发现了Spring servlet初始化程序”,但根本没有做任何事情。

 17-Aug-2016 16:58:13.552 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.5.4 17-Aug-2016 16:58:13.593 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive /opt/tomcat/webapps/ROOT.war 17-Aug-2016 16:58:16.243 INFO [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars 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. 

 17-Aug-2016 16:58:16.301 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log 2 Spring WebApplicationInitializers detected on classpath 17-Aug-2016 16:58:21.471 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Initializing Spring embedded WebApplicationContext 17-Aug-2016 16:58:25.133 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log ContextListener: contextInitialized() 17-Aug-2016 16:58:25.133 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log SessionListener: contextInitialized() 

没有其他发生。 春季启动只是没有运行。

显然我用Java 1.8编译了服​​务器,远程计算机有Java 1.7。

用Java 1.7编译后,开始工作。

 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.7</java.version> <!-- added this line --> <start-class>myapp.SpringApplication</start-class> </properties> 

如果您的目标是将Spring Boot应用程序部署到AWS , Boxfuse将为您提供一个非常简单的解决scheme。

所有你需要做的是:

 boxfuse run my-spring-boot-app-1.0.jar -env=prod 

这会:

  • 为您的应用程序定制一个最小的操作系统映像(比典型的Linux发行版小100倍)
  • 推送到一个安全的在线存储库
  • 在大约30秒内将其转换为AMI
  • 创build并configuration一个新的弹性IP或ELB
  • 为它分配一个新的域名
  • 根据您的新AMI启动一个或多个实例

所有图像都是以秒为单位生成的,是不可变的。 它们可以在VirtualBox(dev)和AWS(test&prod)上保持不变。

所有更新均以零宕机时间的蓝/绿部署执行 ,您还可以使用一个命令启用自动缩放。

Boxfuse也理解你的Spring Bootconfiguration会根据你的application.properties自动configuration安全组和ELB健康检查

以下是一个帮助您入门的教程: https : //boxfuse.com/getstarted/springboot

免责声明:我是Boxfuse的创始人和首席执行官

公共类应用程序扩展SpringBootServletInitializer {}

只是扩展SpringBootServletInitializer。 它将在你的AWS / tomcat中工作