SpringBoot使用IDEA设置的外部Tomcat启动,遇到的问题和解决

JAVA 同时被 2 个专栏收录
5 篇文章 0 订阅
1 篇文章 0 订阅


外部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目录
IDEA Tomcat

4.2 提前设置外部Maven

在IDEA用Maven打包,我也用的外部Maven,IDEA设置:
IDEA MAVEN
注意: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 被标注了删除线:
IDEA MAVEN
package后,在控制栏会有 “BUILD SUCCESS”,说明打包成功。

4.4 使用外部Tomcat启动

点击Run旁边的 Edit Configurations,点击加号“+”按键,别去 Templates 里边找
Edit
往下拉,找到 Tomcat Server 并进入,选择Local,默认是Unnamed,提示“No artifacts marked for deployment”
在这里插入图片描述
修改Unnamed名称(随意),进入Deployment,看见Nothing to Deploy:
Deployment
点击右边竖排加号“+”按键,选择Artifact…
Artifact
选择war,即普通打war包
war

  • 注意这个,根据需要可修改:
    context

选择war exploded,即热部署,修改jsp等文件能直接显示修改:
exploded

到这里,外部Tomcat设置基本完成,点击OK完成,Run这里会出现:
Tom
可以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版本
于是搜索,带有高版本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>
  • 2
    点赞
  • 0
    评论
  • 6
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值