SpringBoot打包成war包以及遇到的问题

这里就简单写了一个controller,用于测试,如下图所示
在这里插入图片描述
在idea运行的时候可以看到,springboot内置的tomcat,以及端口号和context path
在这里插入图片描述
http://localhost:8080/test
在这里插入图片描述

springboot打包成war包

首先在pom.xml中配置,如下图所示
在这里插入图片描述

<!-- 配置打包方式,这里为war包,默认是jar包 -->
    <packaging>war</packaging>

使用外部的tomcat

 <!--使用外部tomcat-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

这里需要注意了,通过idea创建的springboot项目,默认导入了maven的plugin打包插件的。需要有这个打包的插件,具体看完整的pom.xml文件。为什么提这个呢,是因为我感觉有很多人是通过先建立一个maven项目,然后通过导入springboot坐标的方式,建立springboot项目的,然后就会少了这个打包插件。我这里是使用IDE内置的springboot创建项目的方法
在这里插入图片描述
通过这种方式建立的springboot项目,会自动配置好了maven的plugin打包插件,如下图所示
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.10</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>wartest</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <!-- 配置打包方式,这里为war包,默认是jar包 -->
    <packaging>war</packaging>

    <name>wartest</name>
    <description>wartest</description>
    <properties>
        <java.version>11</java.version>
    </properties>
    <dependencies>

        <!--使用外部tomcat-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

因为打包的时候使用了,外部的tomcat,所以需要为war包配置tomcat的启动配置,这里我在springboot的启动类中配置了,具体配置如下所示:
在这里插入图片描述

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 WartestApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(WartestApplication.class, args);
    }

    // tomcat启动配置
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        // return super.configure(builder);
        return builder.sources(WartestApplication.class);
    }
}

配置好了之后,就可以打包了。
在这里插入图片描述
在这里插入图片描述
打包成功之后,我们就可以看到target目录下的war包了
在这里插入图片描述
将打包得到的war包复制大tomcat的webapps目录下
在这里插入图片描述
启动tomcat
在这里插入图片描述
看到springboot对应的logo,并且没有报错的情况下,说明部署成功了打包的war包,我们到webapps目录下,可以看到生成了对应的war包的文件夹
在这里插入图片描述
http://localhost:8080/wartest-0.0.1-SNAPSHOT/test 注意下图画横线哪里,跟上图的画横线那里对比一下。
在这里插入图片描述
tomcat的webapps目录下可以部署多个war包,如这里我将wartest-0.0.1-SNAPSHOT.war复制一份,并改名为aa.war
在这里插入图片描述
启动tomcat,可以看到启动了两个springboot项目
在这里插入图片描述
启动部署之后
在这里插入图片描述
http://localhost:8080/aa/test
在这里插入图片描述
http://localhost:8080/wartest-0.0.1-SNAPSHOT/test
在这里插入图片描述

部署war包遇到的奇葩问题

打包成war包之后,部署到tomcat的webapps目录下,启动tomcat之后,没有报错,可以正常运行,就是没有成功启动springboot项目打包的war包,也就是说运行过程,springboot的logo就没有出现过(这里排除在配置中关闭springboot的logo的情况)。但是部署其他的war包它又没问题,部署刚打包的springboot的war包就有问题,然后部署出现springboot的logo的项目它又可以,就算把springboot改成同一个版本,跟能正常部署的springboot是同一个版本,也不行。就是不出现对应的logo,而且两个程序的配置都是一样的,一个得一个不得。这里我猜的原因是因为先部署了可以正常运行的war包,然后新的程序打包的war包部署就收到影响了。解决办法,就是拿一个同一版本的纯净版的tomcat进行部署,也就是刚下载,什么都没有设置过的tomcat进行部署。不同版本的tomcat也可以,纯净版的tomcat。下面把过程以截图的形式复现一下。
在这里插入图片描述
如上图所示,都运行完了,就是没有看到spring这个logo,说您springboot项目打包的war包没有部署成功。然后到webapps目录看一下,对应的文件也正常生成了
在这里插入图片描述

在这里插入图片描述
访问对应的接口就是没有
在这里插入图片描述
然后我拿可以正常部署的war包,试了一下,这个就可以看到springboot的logo。可能是因为这里有配置,然后只能部署这个对应的war包,而且这个可以成功部署的war包,我去对应的程序重新打包成war包,然后到这里webapps下进行部署它还是可以的。就是部署其他项目的war包不行,不知道这里改了tomcat的什么配置,反正就是不行,好像这个tomcat认主一样,其他的我就不接受。部署之前能正常运行的包,它就可以,而且是之前能正常运行的war包重新打包也可以,就是其他程序的war包就不行,其他程序的war包改成一样的名字也不可以,一模一样的配置,包括springboot的版本都一样,就是不行。我也不知道,这个tomcat到底配置了什么,简直就是奇葩。浪费了我挺多时间的,后面换了一个tomcat(同一个版本,都是9.0.62)纯净版,它就解决了。可以部署其他程序的war包了。
在这里插入图片描述
换了个同版本的纯净版的tomcat
在这里插入图片描述
在这里插入图片描述
出现了上面的404之后,重新部署了之后,就不要在这个基础上刷新了,不然它一直在那里转圈,光关闭标签页也不行。还是一直在转圈,(可能是浏览器缓存,这个我也不太清楚),这里应该关闭浏览器,然后再从新输入对应的地址,然后就可以正常显示了。
在这里插入图片描述
总结;以后遇到打包这种,tomcat能正常运行的,也没有任何报错,说明war包没有问题,然后springboot就是没有启动成功的。直接去官网下载一个纯净版在部署,尽量不要用以前配置过某个项目的tomcat来部署项目了,如果不想浪费时间排除原因的话。
springboot打包成war包到这里就结束了,后面的可以不看了。

war包部署的详细过程

下面只是把过程记录一下,了解过tomcat部署的,可以直接跳过这里了!

war包的部署需要使用到tomcat,所以这里需要下载tomcat了。
直接百度搜索:tomcat下载就可以去下载tomcat了,我这里直接把tomcat下载的官网写到这里吧。Apache Tomcat® - Apache Tomcat 9 Software Downloads
在这里插入图片描述

Index of /dist/tomcat/tomcat-9 (apache.org) 这里可以下载tomcat的历史版本,具体看自己的需求。

这里为什么要下载tomcat9,是因为下图所示的内容,springboot2.7.10内置的tomcat版本是9.0.73,在运行日志中可以看到
在这里插入图片描述
当然,也可以是其他版本的tomcat,我试过了,使用比它高或者比它低版本的tomcat都可以正常运行这个springboot程序。我甚至使用tomcat8也可以。不过这里最好还是使用跟内置tomcat同一个版本的tomcat。这里我以为之前已经下载好了目前tomcat9的最新版本了,所以就懒得下载了,就用目前最新版本的tomcat9了。这里我是建议,使用springboot内置版本的tomcat或者比它高一点版本的tomcat,版本不要跳跃太大,如这里springboot2.7.10内置的是tomcat9.0.73,最好是使用tomcat9,使用tomcat9.0.73或者比它大的tomcat9版本。不建议使用tomcat10或者tomcat8。有些springboot项目打包成war包的时候,使用tomcat10不一定能运行起来。这里也可以看springboot内置的tomcat版本。
在这里插入图片描述
下载解压好tomcat之后,这里需要配置一下JAVA_HOME的系统环境变量,否则tomcat启动会说找不到JAVA_HOME对应的jdk所在的位置。这里需要注意的是必须是JAVA_HOME,不能是其他的,tomcat中的bin目录下的catalina.bat,在启动tomcat时,会从这里找系统中java的环境变量JAVA_HOME,使用对应的文件编辑器打开可以看到,找的是JAVA_HOME。而不是其他
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述配置好之后,win+R
在这里插入图片描述
输入 java -version确保jdk的系统环境变量JAVA_HOME是否配置成功了。
在这里插入图片描述
配置好系统环境变量之后,进入tomcat的bin目录下
在这里插入图片描述
找到startup.bat,双击它,启动tomcat。这里需要注意了,如果在idea运行了程序的话,而且程序的顿口号的8080的话,需要在idea中停止运行代码程序。免得到时候端口号冲突,导致tomcat启动失败。
停止正在运行的程序,然后再启动tomcat。
在这里插入图片描述
启动tomcat
在这里插入图片描述
我们可以看到tomcat启动成功了
在这里插入图片描述
tomcat启动成功之后,访问http://localhost:8080/
在这里插入图片描述
我们可以看到,tomcat运行的时候是乱码的,我们可以先点击叉号,关闭tomcat
在这里插入图片描述
然后到tomcat目录下的conf目录
在这里插入图片描述
找到conf目录下的logging.properties文件,打开
在这里插入图片描述
将这几个UTF-8全部换成GBK
在这里插入图片描述
如下图所示,全部改成GBK,保存一下
在这里插入图片描述然后再去tomcat的bin目录下,双击startup.bat启动tomcat,可以看到不乱码了
在这里插入图片描述
在这里插入图片描述

将之前打包好的war版,复制到tomcat的webapps目录下,然后启动即可
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
然后,返回上一级目录,进入tomcat的bin目录下
在这里插入图片描述
找到startup.bat,双击它,启动tomcat
在这里插入图片描述
我们可以看到springboot启动成功了
在这里插入图片描述
在这里插入图片描述
访问http://localhost:8080/
在这里插入图片描述
我们到tomcat的webapps目录下,看到
在这里插入图片描述
所以要想访问springboot打包出来的war包中的接口地址,需要加上对应的war包,
http://localhost:8080/wartest-0.0.1-SNAPSHOT/test
在这里插入图片描述
可以看到,对应的接口内容了。点击对应的叉号,关闭tomcat。这个war包可以重命名,然后再部署就是访问重命名的路径了,并且tomcat的webapps目录可以部署多个war包,如我这里复制一份这个war包,并重命名为aa.war,当部署之后就是http://localhost:8080/aa/test了
在这里插入图片描述
在这里插入图片描述
去tomcat的bin目录下,双击startup.bat,运行tomcat。从图中可以看到有两个springboot项目,具体可以看对应截图中的描述
在这里插入图片描述
http://localhost:8080/wartest-0.0.1-SNAPSHOT/test 可以正常访问
在这里插入图片描述
http://localhost:8080/aa/test 也可以正常访问
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当我们将Spring Boot项目打war并部署到Tomcat时,可能会遇到jar冲突的问题。下面是一般的解决方法: 1. 排查冲突的jar:可以使用命令`mvn dependency:tree`来查看项目依赖的所有jar,找到冲突的jar。 2. 排除冲突的jar:在pom.xml文件中,可以使用`<exclusions>`标签来排除冲突的jar。例如: ```xml <dependency> <groupId>com.example</groupId> <artifactId>example</artifactId> <version>1.0</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> </exclusions> </dependency> ``` 3. 使用不同的版本:在pom.xml文件中,可以指定不同的版本来避免冲突。例如: ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.2.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>4.3.7.RELEASE</version> </dependency> ``` 4. 使用maven-shade-plugin插件:可以使用maven-shade-plugin插件来将所有的依赖打包进一个可执行的jar中,避免冲突。例如: ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.example.Application</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> ``` 这些方法中,最好的解决方法是使用maven-shade-plugin插件,因为它可以将所有的依赖打包进一个可执行的jar中,避免冲突。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值