我有个spring boot项目,在intellij idea里运行得好地地,结果发布成war包,部署到tomcat里,报404,死活无法访问。
原因是,代码还少了点东西。在项目的启动类里,需要重载SpringBootServletInitializer.configure
。原因是spring boot默认情况下使用了嵌入容器,支持项目的运行。但发布成war包,扔到tomcat里,就没有这个天然支持了,需要在代码里显式使用?
/**
* 默认情况下是自带的嵌入式容器,如果需要构建war文件并进行部署时
* 修改启动类,继承 SpringBootServletInitializer 并重写 configure 方法
* 打成war包放到tomcat中启动必须要这个类才行
*/
@SpringBootApplication
public class BattleManagerApplication extends SpringBootServletInitializer{
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(BattleManagerApplication.class);
}
//原本我的代码只有这个方法,并无上面的重载。这个在开发环境里是没有问题的
public static void main(String[] args) {
SpringApplication.run(BattleManagerApplication.class, args);
}
}
参考文章:
Spring Boot修改启动类
开始时我以为是发布WAR包不得法,但其实发布过程没有问题:
补充说明:
发布成war包,我感觉是一个升华的过程,迫使我们的代码变得严谨。比如,含有汉字内容的文件,必须显式指定字符编码读取;URL中的大小写问题;URL的相对路径问题,等等,这些在开发环境中都不是事,结果发布成WAR包以后,放到服务器一跑,就到处报错,到处漏水了。只能一一修正。但是,修正了之后,就让人放心多了。
另外,发布成war包再部署到服务器比较繁琐,以此来发现问题,一来一回,太耗时。可以在开发环境中用tomcat来跑: