如何在tomcat服务器上部署spring boot Web应用程序

时间:2015-12-29 07:45:24

标签: java spring maven spring-mvc tomcat

我创建了spring boot web应用程序,但我无法在tomcat上部署spring boot web应用程序WAR文件,我可以将其作为java应用程序运行。如何在tomcat上将spring boot应用程序作为Web服务运行。我正在使用以下代码。如果可以在tomcat上运行,请在不使用web.xml和使用web.xml的情况下帮助我使用注释。

@SpringBootApplication
public class Application extends SpringBootServletInitializer {

    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
       return application.sources(Application.class);
    }

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

}

以下代码为休息控制器

@RestController
public class HelloWorld{

   @RequestMapping(value = "/hello", method = RequestMethod.GET)
   public ResponseEntity<String> get() {
       return new ResponseEntity<String>("Hello World", HttpStatus.OK);
   }
}

关注Pom.xml我正在使用

<groupId>org.springframework</groupId>
<artifactId>web-service</artifactId>
<version>0.1.0</version>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.0.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>
        </dependency>

        <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
    </dependency>
        <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
    </dependency>
    <dependency>
        <groupId>com.googlecode.json-simple</groupId>
        <artifactId>json-simple</artifactId>
    </dependency>

</dependencies>

<properties>
    <java.version>1.6</java.version>
</properties>


<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

<repositories>
    <repository>
        <id>spring-releases</id>
        <url>https://repo.spring.io/libs-release</url>
    </repository>
</repositories>
<pluginRepositories>
    <pluginRepository>
        <id>spring-releases</id>
        <url>https://repo.spring.io/libs-release</url>
    </pluginRepository>
</pluginRepositories>
<packaging>war</packaging>

5 个答案:

答案 0 :(得分:32)

以下是有关如何将Spring Boot应用程序部署为war文件的两篇优秀文档。

您可以按照此春季启动howto-traditional-deployment文档 -

根据本文档的步骤 -

  1. 您更新应用程序的主类以扩展SpringBootServletInitializer

  2. 下一步是更新构建配置,以便项目生成war文件而不是jar文件。 <packaging>war</packaging>

  3. 标记所提供的嵌入式servlet容器依赖项。

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    
  4. 还有一种方式 -

    请参阅此spring io documentation,其中概述了如何将spring boot应用程序部署到应用程序服务器。

    步骤 -

    1. jar包装更改为war

    2. spring-boot-maven-plugin

    3. 中注释pom.xml插件的声明
    4. 通过扩展SpringBootServletInitializer并覆盖configure方法

    5. ,在您的应用中添加网络入口点
    6. 删除spring-boot-starter-tomcat dependency并修改您的spring-boot-starter-web依赖关系

    7. <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
          <exclusions>
              <exclusion>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-tomcat</artifactId>
              </exclusion>
          </exclusions>
      </dependency>
      

      pom.xml中,删除spring-beansspring-webmvc依赖项。 spring-boot-starter-web依赖项将包括这些依赖项。

答案 1 :(得分:12)

Spring boot提供了将应用程序部署为支持tomcat服务器的servlet 3.x不带web.xml )的传统war文件的选项。请参阅spring boot documentation。我将简要介绍一下你需要做什么。

第1步:修改pom.xml将包装更改为战争:(您已经做过)

<packaging>war</packaging>

第2步:更改您的依赖

    <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-tomcat</artifactId>
   </dependency>

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

第3步:在pom.xml标记下的<build>修改您的战争名称(如果您需要避免附加战争名称的版本详细信息)。

<build>
    <finalName>web-service</finalName>
.....

第4步:运行maven build来创建战争:clean install 步骤5:在tomcat中部署生成的war文件web-service.war,并在浏览器http://<tomcat ip>:<tomcat port>/web-service/hello中请求url

你应该得到Hello World

注意: 此外,您可以删除多余的依赖项,如@Ali Dehghani所说。

答案 2 :(得分:4)

spring-boot-starter-tomcat依赖项标记为provided,如:

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

注1:从您的pom.xml中删除多余的依赖项,如:

<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
</dependency>
<dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
</dependency>

它们是 spring boot starter packages

的一部分

注2:让jar不战争

答案 3 :(得分:0)

将弹簧靴子转换为弹簧靴子战争的过程记录在:http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#build-tool-plugins-maven-packaging 简而言之,按照您在示例中的方式设置启动器类,然后在.pom文件中将包装从jar切换到war。此外,您需要将spring-boot-starter-tomcat依赖项设置为已提供。再一次,该过程在上面的链接中以完整的形式记录。 有关此主题的更多信息,请参见弹簧io指南“将Spring Boot JAR应用程序转换为WAR”,该文档位于https://spring.io/guides/gs/convert-jar-to-war/ 如果我有任何进一步的帮助,请告诉我,我会帮助你。

答案 4 :(得分:0)

我遇到了这个问题。以上大部分都是好建议。我的问题是最初部署在Pivotal TC服务器上。

  1. 将pom中的包装作为WAR。

    <packaging>war</packaging>
    
  2. 向pom添加依赖项

    <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>
    
  3. 我使用Application类来保存main()。 Main有配置代码,因此可以注入EntityManager等。此EntityManager使用来自ApplicationContextpersistence.xml文件的信息来获取持久性信息。在SpringBoot下工作正常,但在Tomcat下没有。事实上,在Tomcat下,Main()未被调用。 Application类扩展了SpringBootServletInitializer

  4. 以下方法添加到Application类:

    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        Application obj = new Application();
        @SuppressWarnings("resource")
        ConfigurableApplicationContext applicationContext = 
             new ClassPathXmlApplicationContext("META-INF/spring/applicationContext.xml");
         applicationContext.registerShutdownHook();
         applicationContext.getBeanFactory().autowireBeanProperties(
             obj, AutowireCapableBeanFactory.AUTOWIRE_NO, false);
        return application.sources(Application.class);
    }
    
  5. 只需要最后一行 - 其他代码之前已在main()中保存,并移至此处以注入EntityManager正在工作。

    1. 所需的注释是:

      @EnableAutoConfiguration
      @ComponentScan
      //@SpringBootApplication will consist of both of these and @Configuration
      
    2. 某些网址现在可能需要更改根上下文以包含

      <artifactId>contextname</artifactId>.
      
    3. 希望有所帮助