SpringCloud启动异常Stopping service [Tomcat]

问题场景:

  新公司的项目有3套服务器环境,SpringCloud框架,之前项目都是打包后手动传到服务器运行jar命令启动,随着微服务越来越多,决定用jenkins实现自动化部署,搭建一套Jenkins,并先把dev服务器的所有项目实现Jenkins自动化部署。这个任务交给我执行,搭建jenkins过程都很顺利,编写shell脚本耗时1天也完成。在配置项目时遇到很多问题。主要问题是由于dev服务器上的配置太老,更新不及时,大部分同事已经习惯于把新代码发到test,uat环境执行了。

  我把所有项目配置上,但至少一半构建失败,异常信息:[main] INFO  o.a.catalina.core.StandardService -Stopping service [Tomcat]

  启动日志的最后一行就是这个,没有任何有用的信息,找了很多资料,耽误了2天时间终于解决了。

  解决思路:首先要明确一点,既然是Tomcat自动停止了,肯定是有代码报错,只是你的项目没有打印错误日志。

  解决办法:

  1.  给启动类加上try..catch...并打印catch的信息。

@SpringBootApplication
public class Application {
    static Logger logger = LoggerFactory.getLogger(Application .class);
    public static void main(String[] args) {
        try {
            SpringApplication.run(Application .class, args);
            logger.info("启动成功!");
        } catch (Exception e) {
            logger.error("启动异常", e);
        }
        
    }
}

  2. 由于Tomcat的默认日志工具和SpringCloud的默认日志工具是不一样的:Tomcat使用的是log4j;SpringBoot使用的是Logback。

  我配置的也是Logback,所以只能输出logback日志,而tomcat的log4j的日志并没有输出。这种情况我们采用Slf4j,Slf4j并不是日志输出工具,他的作用是日志继承接口,用于整合不同的日志工具。

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
</dependency>

  这个依赖可以将log4j输出到slf4j,从而用sl4j输出。

  经过这两个配置就可以看到错误日志了。

  我的错误信息是: java.lang.IllegalArgumentException: Could not resolve placeholder 'kafka.ip' in value "${kafka.ip}"

  配置文件都放在Spring Cloud Config里,我用idea本地使用dev服务器的配置是可以正常启动的。再检查服务器里的配置文件,发现config的文件是读取本地的, 并不是实时从git上来取,如下图:

config-common.properties
config-log.properties
config-mongodb.properties
config-mysql.properties
........

  在服务器上每个项目目录有一个config文件夹,config文件夹有配置:application.properties  bootstrap.properties  logback-spring.xml

  SpringCloud的jar启动原则,如果本地有config和lib文件夹,是不会读取jar包里面的config和lib的。我的问题在于bootstrap.properties不是最新的,重新传一份再执行java命令,启动成功。

猜你喜欢

转载自www.cnblogs.com/huanshilang/p/12975009.html