当时想要试试集群,不说多的,就像将一个SpringBoot项目同时在两个不同的Tomcat中执行,但是出现了问题?
第一个问题是刚开始运行的时候,显示404,找不到资源;
第二个问题是可以显示基本资源,但是css,js,image等静态资源无法显示;
第三个问题网上很多的博客写的杂七杂八,完全是不知道在讲些什么;
为了解决上面提出的几个问题,这里做一下记录,也顺便为初学者提供一下我的思路;
1. 使用Maven将项目打成war包
下面简单的进行一下介绍,因为重点不在这里;除此之外,这里还有一点需要注意的是,我使用的是外置的Tomcat,为了使得外置的Tomcat能够生效,必须在SpringBoot程序的主入口继承类SpringBootServletInitializer,否则运行tomcat之后会报404;
最好就是直接百度如何将SpringBoot项目打包成war包;但是如果你有些基础,下面进行一下基本路径介绍;
- 先将pom.xml文件中的packaging标签里的内容换成war;
- 添加如下依赖,保证外置Tomcat可行;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
- 最后就是关于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);
}
}
- 下面就是打包的图片了,我是使用maven打包的;
上面就是关于打包的基本知识,重点不在打包,所以不过大篇幅;
2. 当Tomcat启动后,在浏览器访问却显示404找不到资源
找不到资源的原因是什么,我一开始也不是很明白,但是我知道,之前在SpringBoot项目的内置Tomcat中执行的时候,项目路径是可以自己设置的,那么现在是外置的Tomcat,项目路径还可能是之前的那个吗?当然不是,在外置的Tomcat中项目路径就是当前war包的名称;
先将War包部署在Tomcat的wabapps目录下面如下:
后面所有的介绍都围绕上面的war包进行;
- 将War包放入Tomcat后,执行Tomcat;
- 执行之后在浏览器上进行访问;我这里必须要访问
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
;路径都按着个模式写就不会有问题;
解决方法就是按照上面的步骤就可以了;基本就可以解决一些同类的问题,反正一般情况下都是路径容易出问题,所以出了问题第一个要考虑的就是路径;