昨天将springboot打包放到测试平台上面做测试的时候(将项目打成war包),发现这个项目放在tomcat中无法运行,而非常神奇的是,控制台上面居然也不报错。明明在开发环境下是可以启动的。。。
一开始怀疑是因为社区版的idea存在什么功能阉割,所以导致打包出来的war包不能用。沿着这个怀疑的方向,我给社区版的idea装springboot插件,结果发现社区版的idea不能安装SpringBoot生成插件。
再去网上找原因,查到说社区版的是用Spring Assistant插件来生成SpringBoot项目。
安装了Spring Assistant插件以后发现打包出来的war包还是无法在tomcat中运行。
看来不是缺少插件的原因。又继续从网上查找资料。最后发现是因为springboot中内置的tomcat依赖与外部的tomcat容器冲突导致的,解决办法就是在pom文件中给tomcat依赖加上provided域。
这里要科普一个小知识,springboot可以打包成jar和war两种格式。因为war包需要放在tomcat容器中运行,所以我们要把springboot内置的tomcat在打包时排除掉(即加上provided域),而jar包是可以独立运行的,所以我们在打包时要将内置的tomcat也打进jar包里(即不加provided域)。
只是一个很小的小问题,但真的是被坑了好久啊。
在加几个关于打包和运行程序的小tip:
- 用
mvn clean compile package
指令打包的时候,maven默认会先将test包中的所有测试方法都执行一遍,这其实是不必要的,我们可以用mvn clean compile package -Ptest -Dmaven.test.skip=true
指令来跳过测试这一步 - 如果项目是打包成jar包的话,.properties文件会被打包在包里面,这样修改配置文件会很麻烦,我们可以把properties复制一份放在jar包的同级目录下,之后要修改什么配置都可以直接修改外面的那个.properties文件,因为springboot优先是从同级目录下先读取配置文件的。
- 在Linux平台上,我们用
java -jar xxx.jar
指令启动springboot工程的话,程序是在前台运行的,此期间我们无法做其他事情,而且一旦关闭了ssh终端,程序也就关闭了。如果我们要想让程序在后台运行的话就要用指令nohup java -jar XXX.jar &
。nohup
意思是不挂断运行命令,当账户退出或终端关闭时,程序仍然运行。 - 当用
nohup
命令启动程序时,默认情况下该程序的所有屏幕输出都被重定向到nohup.out的文件中,除非另外指定了输出文件,要自己指定输出文件,需要在指令中加上>xxx.log
。比如nohup java -jar XXX.jar >xxx.log &
。