欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

记一次SpringCloud把SpringBoot项目打成jar包使用java -jar命令执行 命令行参数无效,没有生效的问题

程序员文章站 2022-05-01 12:29:29
...

最近公司也采用了当前炒的比较如火如燎的SpringCloud微服务技术,经过了多方面技术对比选型,还是决定使用了相对比较新的技术
技术主体框架如下:

  • 注册中心:Nacos
  • 配置中心:Nacos
  • SpringBoot 2.2.5.RELEASE
  • SpringCloud Hoxton.SR3
  • spring-cloud-alibaba 2.2.1.RELEASE

使用这套框架在实际开发中也没怎么遇到太多难题。但是当我们开发一个demo准备进行测试环境部署时,出了一个很莫名其妙的问题:
项目在本地开发调试都是正常的,打成jar包进行测试部署时,使用命令java -jar xxx.jar --server.port 发现配置的命令参数server.port并没有生效,又换了一个思路,配置bootstrap.yml文件环境分离的方式去启动,java -jar xxx.jar --spring.profiles.active=test,还是没有如期为我们切换配置文件。

1. 怀疑是配置中心的配置把我们命令参数给覆盖了
查找了官方的一些配置,采用在配置中心配置官方提供的参数对配置优先级进行配置:

spring.cloud.config.override-none=true
spring.cloud.config.allow-override=true
spring.cloud.config.override-system-properties=false

配置过后,发现还是不能正常的使用命令行参数,这个时候就比较大条了,想了一下,既然不是配置中心的问题,那么问题就出在SpringBoot上了,我们的命令行参数是通过Application启动类的main方法的args进行传递的,最后发现果然问题出在启动类上
2. 排查启动类是否收到命令行参数
通过在启动类添加打印args参数内容,发现命令行参数是传递进来了,但是因为博主笔误,args并没有被加载到Spring上下文中

@EnableDiscoveryClient
@SpringBootApplication(scanBasePackages = {"com.yxh.www"})
public class AuthorServerApplication {
    public static void main(String[] args) {
    	// 错误写法:没把args传过去
        // SpringApplication.run(AuthorServerApplication.class);
        SpringApplication.run(AuthorServerApplication.class,args);
    }
}

就因为这几个字符的问题,排查了一个上午,所以决定把这个写出来,并以此为戒,写代码一定要细心细心…