在外部tomcat中运行spring boot应用

默认,Springboot使用内嵌的tomcat来运行springboot应用。如果你想使用外部tomcat来运行,需要做一些修改。

在pom.xml中将应用修改为war

这个应该没什么疑问,默认springboot是当做一个jar来运行的。

应用启动类修改

需要继承SpringBootServletInitializer,并重写configure方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@SpringBootApplication
@MapperScan("com.ybf.activity.web.mapper")
public class Application extends SpringBootServletInitializer {
private final static Logger logger = LoggerFactory.getLogger(Application.class);
@Bean
public ServletRegistrationBean statViewServlet () {
ServletRegistrationBean reg = new ServletRegistrationBean();
reg.setServlet (new StatViewServlet());
reg.addUrlMappings ("/druid/*");
return reg;
}
@Override
protected SpringApplicationBuilder configure(
SpringApplicationBuilder application) {
return application.sources(Application.class);
}
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
logger.info("Application [activity-web] started!");
}
}

添加spring-boot-starter-tomcat依赖。

1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>

在项目的根目录执行mvn clean package -DskipTests=true

这样会自动处理模块间的依赖关系,并且会将该项目的每个模板都进行打包。

打包完毕后,将WAR丢到tomcat就可以跑了。

问题记录

1.系统环境变量的JDK版本要和你的项目保持一致。

我就是因为不一致找了很久的原因。我的项目是JDK1.8,系统环境变量是JDK1.7,丢到tomcat日志只有logback初始化的打印,再没有其他信息,后面就提示已经启动。但访问controller之类的都是404.

2.我的工程使用了mybatis,要打印SQL。在mybatis-config.xml中配置的logImpl位log4j。

1
<setting name="logImpl" value="LOG4J"/>

但我的依赖中没有引入log4j,导致报错。
Caused by: java.lang.NoClassDefFoundError: org/apache/log4j/Priority.我的日志输出组件是logback,mybatis是不支持的,所以配置的STDOUT_LOGGING就OK了。但用idea集成的tomcat跑没问题。

Donny wechat
欢迎关注我的个人公众号
打赏,是超越赞的一种表达。
Show comments from Gitment