文章目录
外部Tomcat
springboot 项目部署到外部tomcat
Spring Boot:内置tomcat启动和外部tomcat部署总结
网上的部署到外部Tomcat的例子足够多,这里精简步骤,方便记忆。
1. 改成war方式打包
在 pom.xml 设置:
<packaging>war</packaging>
<build>
<plugins>
<!-- 把原来的 spring-boot-maven-plugin 注释掉/删掉-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
</plugin>
</plugins>
<finalName>springbootdemo</finalName>
</build>
2. 移除对SpringBoot中的嵌入式Tomcat的依赖
- 需要移除对嵌入式Tomcat的依赖,这样打出的war包中,在lib目录下才不会包含Tomcat相关的jar包,否则将会出现启动错误。
- 因为SpringBootServletInitializer需要依赖 javax.servlet,而tomcat-embed-jasper下面的 tomcat-embed-core 中就有这个 javax.servlet,如果没用provided,最终打好的war里面会有servlet-api这个jar,这样就会跟tomcat本身的冲突了。
还有一个很关键,就是tomcat-embed-jasper中scope必须是provided。
在 pom.xml 添加:
<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>
3. 修改SpringBoot的启动类
- 修改启动类,使其继承SpringBootServletInitializer类,重写configure方法。
- 如果SpringBoot帮我们建立了SpringBootServletInitializer类文件,直接删掉,修改最开始的SpringBootApplication 项目启动类,就是有main方法的那个。
@SpringBootApplication
@ServletComponentScan
@ComponentScan(basePackages = {"com.example.controller", "com.example.service"})
@MapperScan(basePackages = {"com.example.dao"})
public class SpringbootdemoApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(SpringbootdemoApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(SpringbootdemoApplication.class, args);
}
}
注:根据情况,可以在 pom.xml 修改打包名称
<build>
<finalName>springbootdemo</finalName>
</build>
4. 在IDEA里用外部Maven打包,用外部Tomcat运行
4.1 提前设置外部Tomcat
系统已装有Tomcat,平常想在IDEA里边使用这个“外部”的Tomcat,可以先在IDEA设置:
File - Settings - Application Server,新增、添加系统已安装的Tomcat目录
4.2 提前设置外部Maven
在IDEA用Maven打包,我也用的外部Maven,IDEA设置:
注意:IDEA,特别是18年或者19年的新版本,Default Settings 变成了 Settings for New Projects,安装新版的IDEA后先别急着新建工程,先在初始页面的 Settings for New Projects 设置好系统的外部Maven,不然在IDEA里使用的Maven总是被改回IDEA的默认Maven而不是要使用的外部Maven。不然更换编辑器IDE的时候Maven的不同会变得麻烦。
4.3 Maven打包
IDEA,Maven界面,先clean清除已生成的targets,然后package打包war。
注:打包要跳过Maven的测试的话,点击Maven界面按键栏的浅蓝色圆圈按键,鼠标悬停显示“Skip Tests”,可见 Lifecycle下的 test 被标注了删除线:
package后,在控制栏会有 “BUILD SUCCESS”,说明打包成功。
4.4 使用外部Tomcat启动
点击Run旁边的 Edit Configurations,点击加号“+”按键,别去 Templates 里边找!
往下拉,找到 Tomcat Server 并进入,选择Local,默认是Unnamed,提示“No artifacts marked for deployment”
修改Unnamed名称(随意),进入Deployment,看见Nothing to Deploy:
点击右边竖排加号“+”按键,选择Artifact…
选择war,即普通打war包
- 注意这个,根据需要可修改:
选择war exploded,即热部署,修改jsp等文件能直接显示修改:
到这里,外部Tomcat设置基本完成,点击OK完成,Run这里会出现:
可以Run了。
- 注意:要检查项目的 Project Structure
war的输出路径是否为 target:
于是顺便检查一下 Project的SDK版本、language level, Modules,SDKs的JDK 。
遇到问题
- 环境:WIN7 x64
SpringBoot 2.1.7,在IDEA新建的从 start.spring.io 生成,纯净
系统安装的Tomcat版本:8.0.53
用SpringBoot内部Tomcat正常启动;
用IDEA的“外部”Tomcat无法启动,都报错:
failed to extract parameter names for org.apache.ibatis.mapping.resultmap...
Failed to start component [StandardEngine[Catalina].StandardHost[localhost]...
......
想看详细的Tomcat日志,必须去找IDEA自己的项目生成的日志,日志文件在 :
C:\Users\Administrator\.IntelliJIdea2019.1\system\tomcat\Unnamed_springbootdemo\logs
看了日志中报错的部分,应该是连Tomcat都没能启动,然后才导致了接下来一堆问题,各种Bean不能注册等等。
各种尝试,最后发现是Tomcat版本问题!!!
启动一个SpringBoot 2 工程,查看到内部Tomcat版本:9.0.22
于是搜索,带有高版本Tomcat的SpringBoot的war,放到低版本Tomcat运行的话,
要指定Tomcat版本:
<properties>
<!--外部Tomcat版本-->
<tomcat.version>8.0.53</tomcat.version>
</properties>
springboot 项目部署到外部tomcat
SpringBoot应用部署到Tomcat中无法启动问题
依旧不行!
于是搜索 SpringBoot 2+ 的特性,发现至少要 Tomcat 8.5:
What’s New in Spring Boot 2? SpringBoot2新特性
于是,直接安装更合适的Tomcat版本,
或卸载原来的Tomcat后安装更合适的Tomcat版本:
如何安装和配置两个不同版本的tomcat
接着IDEA里使用 Tomcat 9.0.22 启动,运行正常;
把war包扔到webapps目录让其自动部署,运行正常!
可以尝试继续指定外部Tomcat版本:9.0.22
<properties>
<!--外部Tomcat版本-->
<tomcat.version>9.0.22</tomcat.version>
</properties>