使用Tomcat部署Springboot项目

1,848 阅读1分钟

项目背景

项目需要将war包部署到Tomat,然后在网络上踩了许多坑,记录一下

(12条消息) SpringBoot War包形式部署到外部Tomcat_zhuyu19911016520-CSDN博客_springboot打war包部署到tomcat

(12条消息) Win10环境Tomcat安装及环境变量配置教程_LL_Leung的博客-CSDN博客_tomcat windows10

1.配置window下 tomcat环境

  • 配置jdk环境
  • CATALINA_HOME: 路放置tomcat文件夹的完整路径。D:\apache-tomcat-8.5.73
  • 在path后配置:%CATALINA_HOME%\lib 、%CATALINA_HOME%\bin

2.在spring boot中打包

public class Application extends SpringBootServletInitializer  {


    public static void main(String[] args) {
        SpringApplication app=new SpringApplication(Application.class);
        ApplicationContext context = app.run(args);
        String serverPort=context.getEnvironment().getProperty("server.port");
        log.info("start at http:localhost:"+serverPort);
    }


    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Application.class);
    }

}

3.pom引入

<packaging>war</packaging>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!--提供阻塞和非阻塞机制-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-undertow</artifactId>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
<build>
    <finalName>SE</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
</build>

注意:如果希望使用外置tomcat需要将原来的tomcat排除,如果希望在正常的项目中使用,需要添加spring-boot-starter-undertow或者tomcat,其中 provided代表在开发环境下存在,打包不包含; javax.servlet-api不引用将无法打包;SE用于确定包的名字;war打包为war包,默认为jar

3.在tomcat中配置

  • 如果乱码,将conf/logging.properties 改为java.util.logging.ConsoleHandler.encoding = GBK
  • 在server.xml配置
<Service name="testWar">  
     <Connector port="8088"    maxHttpHeaderSize="8192"  maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="true" redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true"  URIEncoding="utf-8"/>   
     <Engine name="hnswzy" defaultHost="localhost">
     <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
     <Host name="localhost" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> 
         <Context path="" reloadable="true" docBase="F:\project\crash\SEquipment\SE_Video_DATA\target\SE">
         </Context>
     </Host>
     </Engine>
     </Service>

其中docBase="F:\project\crash\SEquipment\SE_Video_DATA\target\SE"为包的绝对路径(在F:\project\crash\SEquipment\SE_Video_DATA\target\SE.war存在该文件)开启两个服务

  • 或者在原service直接修改host标签下添加
<Context path="" reloadable="true" docBase="F:\project\crash\SEquipment\SE_Video_DATA\target\SE">
         </Context>