X

Spring Boot 在Tomcat容器中的启动办法

使用Spring boot的官方tutorials可以非常方便的完成spring的示例,示例也非常简单,使用注解直接就完成了RESTful API的开发。但是当这个应用使用tomcat来启动的时候,却产生了404错误。加之使用的是淘宝改动过的tomcat(主页地址),使得寻找问题变得复杂起来。最后,在阅读了官方文档后,饶了几个页面,终于找到了问题所在。无论你是使用的Building a RESTful Web Service的代码,还是使用的官方https://start.spring.io/生成的代码,都是同样的解法。

在pom中进行如下修改,请注意红色部分。

<groupId>...</groupId>
<artifactId>...</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging> 
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-tomcat</artifactId>
   <scope>provided</scope>
</dependency>

找到你的运行的入口类,有类级别的注解 @SpringBootApplication,这个类需要继承自SpringBootServletInitializer并且覆写:

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    return application.sources(AdminApplication.class);
}

最终你生成的文件可能看起来如下:
package top.huster;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
@EnableAutoConfiguration
public class AdminApplication  extends SpringBootServletInitializer {


    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(AdminApplication.class);
    }


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

到这里,再打成war包,放到你的tomcat容器里,就能跑起来了。我的IDEA的配置如下:

 

下面我们试着分析下,为什么?

1. Spring boot 项目里已经在内嵌了tomcat容器,所以你如果要使用外部的tomcat容器,则需要在pom文件中,将内嵌的tomcat容器写成provided范围。之所以内嵌容器,spring 是为了一个jar文件也能启动一个http服务,而抛弃了繁杂的配置。同时为了让tomcat能够识别,我们把打成的包改成传统的war,默认是jar。这个是我们修改pom的原因。

2. 打出来的包是war包,tomcat也能启起来,但是总是报404错误。这个是由于我们的主类(入口类)并没有被加载,所以后面所有的Control都无法识别和生效。我们通过继承SpringBootServletInitializer让tomcat的serverlet拉起来。

最终参考答案在这里:http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-create-a-deployable-war-file

找到他不容易啊,最初从这里找到他:http://spring.io/guides/gs/convert-jar-to-war/

利用如上特征,我们使用goolge的zxing写一个动态生成二维码的应用,这个二维码不会生成文件,是一次性的

  @RequestMapping("/barcode")
    public  void getBarcode(HttpServletResponse response) throws  IOException,WriterException {
        String content = "http://www.huster.top";
            BitMatrix matrix = new MultiFormatWriter().encode(content,
                    BarcodeFormat.QR_CODE,
                    200,
                    200
                    );
        try {
            MatrixToImageWriter.writeToStream(matrix, "GIF", response.getOutputStream());
            response.flushBuffer();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

 

 

Categories: 其他
龙安_任天兵: 不忘初心,方得始终!