美文网首页SpringBoot极简教程 · Spring Boot
springboot 部署到独立的tomcat中运行 jar改

springboot 部署到独立的tomcat中运行 jar改

作者: lconcise | 来源:发表于2018-12-03 22:38 被阅读51次

    有时间一些需求,需要我们把springboot项目jar包的形式改为war包的形式,在独立的tomcat中部署项目。

    很简单,主要有4步。

    1. 在 pom.xml 里设置打包格式为 war。
    2. 注册启动类
    3. pom.xml 文件修改
    4. 打包发布

    1. 在 pom.xml 里设置打包格式为 war

    <packaging>war</packaging>
    

    2. 注册启动类

    外部容器部署的话,就不能依赖于Application的main函数了,而是要以类似于web.xml文件配置的方式来启动Spring应用上下文,此时我们需要在启动类中继承SpringBootServletInitializer并实现configure方法:

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
    
    @SpringBootApplication
    public class Application extends SpringBootServletInitializer {
    
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(Application.class);
        }
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

    3. 排除内嵌的Tomcat依赖

    方法一:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <!-- 排除内置容器,排除内置容器导出成 war 包可以让外部容器运行spring-boot项目-->
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>
    

    spring-boot-starter-tomcat 依赖中有tomcat,排除掉,避免jar冲突

    tomcat-embed-jasper为privided,因为SpringBootServletInitializer需要依赖 javax.servlet,而tomcat-embed-jasper下面的tomcat-embed-core中就有这个javax.servlet,如果没用provided,最终打好的war里面会有servlet-api这个jar,这样就会跟tomcat本身的冲突了。

    maven中scope 的依赖范围有三种:

    • compile 如果没有指定,就默认使用该依赖范围。此依赖范围对编译、测试、运行三种classpath都有效。
    • test 测试依赖范围,只对于测试有效,运行,编译过程中无效。
    • provided 此依赖范围对编译、测试有效,但运行时候无效。

    方法二:

            <!--部署成war包时开启-->
            <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>
            <!--部署成war包时开启-->
    

    两个依赖都为provided,这种方式的好处是,打包的war包同时适合java -jar命令启动以及部署到外部容器中。

    4. 打包发布

    mvn clean package
    

    注意事项

    打包的包名称应该和application.properties的
    server.context-path=/demo 中的路径一致

    因为项目部署到tomcat中,需要包名和项目访问路径一致,方便访问。
    就需要下面这两个配置文件一致:

    #访问路径
    server.context-path=/demo
    
    <build>
        <finalName>demo</finalName>
    </build>
    

    参考文档:https://blog.csdn.net/fanshukui/article/details/80258793

    相关文章

      网友评论

        本文标题:springboot 部署到独立的tomcat中运行 jar改

        本文链接:https://www.haomeiwen.com/subject/uzfgzftx.html