摘要:
之前使用java的springboot框架写的一个商城的后端服务,一直运行在本地idea中,但是由于springboot内嵌的有tomcat组件,在idea中运行简直是方便到了极致,只需要点击run运行入口函数就可以。
但是问题来了,我现在想要把项目上架到linux服务器上,由于项目有父子模块,依赖的模块就比较多,自己写了个小羊来玩,把小样打包成war部署到线上tomcat中,发现项目被解析了,但是去访问项目路径却是404,被此问题困扰许久,特记录
问题复现
0.本地目录结构![](/image/aHR0cHM6Ly9pLWJsb2cuY3NkbmltZy5jbi9ibG9nX21pZ3JhdGUvODM2YjA2MGQ1MGNiZDI1YTA0MDJhNDkzNWRlNTMxN2YucG5n)
这是一个父子结构,基础依赖在父项中,打包相关的依赖添加在子模块中
在idea中运行package之后得到war包,并上传到tomcat服务器的webapps目录
1.重启tomcat效果
可以看到刚才上传的demo是已经被解析了的,并且在运行中了没有报错,但是
当我去访问项目的时候,项目下所有路由都是找不到的。
问题解决
0.可能是因为tomcat依赖冲突,在配置中处理一下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 在加载依赖时候,排除掉tomcat-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 执行main方法时启动tomcat-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
1.启动类需要变动
之前的启动类
package cai.a.hao;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
@SpringBootApplication
public class caiahaoApplication {
public static void main(String[] args) {
SpringApplication.run(caiahaoApplication.class,args);
}
}
更改之后的启动类
之前哪种方式时jar包启动方式,使用war包打包时需要继承SpringBootServletInitializer并重写configure方法
package cai.a.hao;
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;
//如果使用war包部署,则需要继承SpringBootServletInitializer并重写configure方法
@SpringBootApplication
public class caiahaoApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(caiahaoApplication.class,args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder){
return builder.sources(caiahaoApplication.class);
}
}
2.效果
访问测试接口caiahao/test
@Controller
public class controllertest {
@RequestMapping("test")
public ResponseEntity<String> test(){
return ResponseEntity.ok("小飞棍来喽");
}
}
结果
运行正常,访问正常