赞
踩
建立了一个springboot
工程作为后端服务,由于springboot
内嵌tomcat
组件,所以在本地IDE进行开发时,直接run
一个main
方法就可以将这个服务跑起来,并提供外部API访问,何其简单方便快捷。
但是在本地爽快地完成开发调试后,将项目打包成war包并部署到线上tomcat
,发现tomcat
确实有解析到项目,但是却一直访问不了,报404错误,这是为什么呢?深陷其久,终发现原因!
将springboot
项目打包成war后,将war包进行解压,得到下面两个目录:
META-INF
WEB-INF
在服务器上某个目录新建文件夹,例如:localservice
,作为项目工程访问根路径目录,然后在tomcat
的server.xml
文件做项目地址虚拟目录映射,配置如下:
<Host name="wxservice.guangzhuiyuantest.cn" appBase="" unpackWARs="true" autoDeploy="true">
<Alias>10.17.1.11</Alias>
<Context path="/localservice" docBase="/home/site/guangzhuiyuan/app/localservice" reloadable="false">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="/home/logs/localservice"
prefix="10.17.1.11_access_log." suffix=".txt"
pattern="%t "%r" %s %b %D %F" />
</Host>
这种方式部署项目跟直接把war包放在tomcat
的webapps
目录下是一样的,都能够将其部署在tomcat
上。
然后启动tomcat
,神奇的是,tomcat
启动后,在work
目录是build
出该项目了的,证明tomcat
已经解析到,但进行访问就是404:
纠结了好久,之前一直以为是tomcat
的server.xml
的context
节点配置错误,一直没往项目本身问题方面考虑,因为自己本地调试时都是正常启动且能够访问的。后来地觉得,如果直接把war放在tomcat
的webapps
目录下会不会就好了呢?结果果然还是太天真。
后来对比了一下以前的旧项目,才发现猫腻。
两步走:
(1)如果你部署项目到tomcat
后,tomcat
启动失败,有可能是tomcat
依赖冲突,移除掉就好;又或者成功,但在项目的pom.xml
下tomcat
依赖的都主要这样处理:
<!-- 移除springboot中web模块的tomcat依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- 这个依赖让你能够在程序入口类:xxxAppAplication中直接执行main方法启动tomcat --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <!-- 但是这里一定要设置为provided --> <scope>provided</scope> </dependency>
(2)原本没有经过任何处理的(即创建springboot
项目时自动生成的)入口类是这样的:
@SpringBootApplication()
public class LocalserviceApplication {
public static void main(String[] args) {
SpringApplication.run(LocalserviceApplication.class, args);
}
}
但是这种方式是以jar包形式执行启动的,如果你要将项目打包成war包放在tomcat
上执行,这个类得继承一下SpringBootServletInitializer
,并重写configure
方法,如下:
@SpringBootApplication()
public class LocalserviceApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(LocalserviceApplication.class, args);
}
// 按照下面的方式重写
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(LocalserviceApplication.class);
}
}
然后再重新打包war包,操作跟之前一样,再访问,不出其他意外情况的话就能够正常访问了。
THE END
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。