当SpringBoot项目的War包在外置Tomcat上运行时,无法加载静态资源或者显示404,到底该怎么解决?

当时想要试试集群,不说多的,就像将一个SpringBoot项目同时在两个不同的Tomcat中执行,但是出现了问题?
第一个问题是刚开始运行的时候,显示404,找不到资源;
第二个问题是可以显示基本资源,但是css,js,image等静态资源无法显示;
第三个问题网上很多的博客写的杂七杂八,完全是不知道在讲些什么;

为了解决上面提出的几个问题,这里做一下记录,也顺便为初学者提供一下我的思路;

1. 使用Maven将项目打成war包

下面简单的进行一下介绍,因为重点不在这里;除此之外,这里还有一点需要注意的是,我使用的是外置的Tomcat,为了使得外置的Tomcat能够生效,必须在SpringBoot程序的主入口继承类SpringBootServletInitializer,否则运行tomcat之后会报404;
最好就是直接百度如何将SpringBoot项目打包成war包;但是如果你有些基础,下面进行一下基本路径介绍;

  1. 先将pom.xml文件中的packaging标签里的内容换成war;
  2. 添加如下依赖,保证外置Tomcat可行;
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
  1. 最后就是关于Java程序,必须让SpringBoot的主入口继承SpringBootServletInitializer;这样外置Tomcat运行后,访问才能找到入口程序,否则你只能找到404界面;
@SpringBootApplication
public class BookManagerApplication extends SpringBootServletInitializer {
	@Override
	protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
		return builder.sources(BookManagerApplication.class);
	}
	public static void main(String[] args) {
		SpringApplication.run(BookManagerApplication.class, args);
	}
}
  1. 下面就是打包的图片了,我是使用maven打包的;

    上面就是关于打包的基本知识,重点不在打包,所以不过大篇幅;

2. 当Tomcat启动后,在浏览器访问却显示404找不到资源

找不到资源的原因是什么,我一开始也不是很明白,但是我知道,之前在SpringBoot项目的内置Tomcat中执行的时候,项目路径是可以自己设置的,那么现在是外置的Tomcat,项目路径还可能是之前的那个吗?当然不是,在外置的Tomcat中项目路径就是当前war包的名称;

  1. 先将War包部署在Tomcat的wabapps目录下面如下:

后面所有的介绍都围绕上面的war包进行;

  1. 将War包放入Tomcat后,执行Tomcat;
  2. 执行之后在浏览器上进行访问;我这里必须要访问http://localhost:8081/BookManager-0.0.1-SNAPSHOT;端口号这个8081是我修改的,不然就会冲突,同一个电脑总不能两个Tomcat使用一个端口号;
    刚开始运行时,由于我已经知道了,需要添加一个项目路径所以没有出错,但是在你进行页面跳转时,就比如:你登录界面的时候,要进行跳转;

一旦进行跳转就会导致新跳转出来的界面路径缺少项目路径,这就是它不能找到资源的原因;
那么在这种情况下就只能够去Tomcat的server.xml文件中去设置Host标签;

 <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">		
		<Context path="" docBase="BookManager-0.0.1-SNAPSHOT" reloadable="true"/>
</Host>

在上面的设置中,就是为了保证每一次的访问都自带了项目路径;想要完整的了解Host所有功能,可以百度去看别人的解释,这里直接介绍使用;除此之外样式css,或者说时BootStrap里的样式显示不出来,也是因为加载样式的时候没有项目路径,但是在server.xml中将Host标签修改一下,后面访问的所有路径都会加上项目路径;path是虚拟路径,docBase是实际路径;(基本的解释就是只要访问了8081端口,默认就是从这个这个War包中的项目开始执行,直接跳过Tomcat中的Root初始界面;)
在这里插入图片描述
输入账号密码登录之后:(可以跳转)


下面就是bootstrap的样式;打开的地址是http://localhost:8081/webjars/bootstrap/4.5.0/css/bootstrap.min.css,这是因为我在server.xml里面的设置(就是上面的Host);否则完整的应该是http://localhost:8081/BookManager-0.0.1-SNAPSHOT/webjars/bootstrap/4.5.0/css/bootstrap.min.css

所以归根结底,在Tomcat中启动War项目之所以显示404或者说静态资源,或者说样式无法显示,一般都是由于路径的错误,否则应该是可以完整显示的;上面是解决那些本身路径没有太大问题的项目,只是在tomcat中无法显示;

下面是关于在SpringBoot项目中的需要注意的一些问题;

3. 在SpringBoot项目的资源路径该如何书写

不多说,简单介绍一下静态资源的映射,因为一般都是只要路径上是对的,都可以访问到静态资源,当然前提是你没有使用拦截器屏蔽掉静态资源;

在HTML页面里面,资源路径全部从/static/开始写,然后下面代码就是进行一个映射,将/static/下的文件全部映射到实际位置为classpath:/static/的代码;

@Configuration
public class BookWebConfiguration implements WebMvcConfigurer {
  @Bean
  public WebMvcConfigurer webMvcConfigurer() {
    return new WebMvcConfigurer() {
      //加载资源路径;还可以添加拦截器,视图控制器;
      @Override
      public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
      }
    };
  }
}

然后就是在HTML界面里面,一般都是从/static/比如一张images下的图片/static/images/login_Img/library_icon.png;路径都按着个模式写就不会有问题;

解决方法就是按照上面的步骤就可以了;基本就可以解决一些同类的问题,反正一般情况下都是路径容易出问题,所以出了问题第一个要考虑的就是路径;

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神秘的天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值