• Java jar 启动程序参数说明


    Springboot环境下的启动参数说明

    # Java启动命令语法:
    java [options] -jar file.jar [arguments]
    java -jar [options] file.jar [arguments]
    javaw [options] -jar file.jar [arguments] #javaw不会启动一个控制台窗口(启动失败的时候会弹出附有错误信息的窗口)
    # 可选项(options)
    # 程序参数(arguments)
    # -jar 指定以 jar 包的形式执行一个应用程序
    
    # 1、标准可选项(Standard options)
    java -Dserver.port=8081 -jar app.jar     #(系统参数)-Dxxx是java运行参数的语法,作用是配置一些环境变量
    
    # -D 是java用来设置全局参数的,可覆盖yaml文件中的变量,但无法覆盖远程Nacos变量值
    # --key=value 可覆盖Nacos,优先级最高
    
    -Dspring.profiles.active
    -Dspring.config.location                 # 指定打包后配置文件的路径
    -Dfile.encoding=utf=8                    # 设置字符集
    -Djava.security.egd=file:/dev/./urandom  # 可以一定程度上加快应用启动
    -Dspring.config.additional-location=./application-dev.yml      # 加载服务器配置文件
    
    # 2、非标准可选项(Nonstandard Options)
    java -Xms512m -Xmx1024m -jar app.jar
    
    -Xms512m             # JVM初始堆内存
    -Xmx1024m            # JVM最大堆内存
    -XX:PermSize=256m       # JVM初始非堆内存
    -XX:MaxPermSize=512m      # JVM最大非堆内存
    
    # 3、程序参数(arguments)
    java -jar app.jar a b c                # (非选项参数)a,b,c参数就是jar包里主启动类中main方法的args参数,按顺序来
    java -jar app.jar --server.port=8081   # (选项参数)其作用等价于在application.properties中的server.port=8081
    
    --server.port=8081
    --spring.profiles.active=dev
    --spring.cloud.bootstrap.name=bootstrap-dev
    --spring.cloud.nacos.config.server-addr=127.0.0.3:8848
    

    查看更多启动命令
    查看三种参数形式(系统参数/选项参数/非选项参数)

    后台运行jar包且指定输出文件

    # nohup 不挂断地运行命令;& 在后台运行,一般两个一起用:nohup command &
    nohup java -jar app.jar >outlog.log 2>&1 &
    
    # >outlog.log 2>&1 这条命令其实分为两命令,一个是>outlog.log,另一个是2>&1
    # >outlog.log 将标准输出1重定向到outlog.log中
    # 2>&1 这条命令用到了重定向绑定,采用&将错误输出绑定到标准输出上,作用是错误输出将和标准输出同用一个文件描述符
    

    程序参数(选项/非选项参数)

    可以通过ApplicationArguments接口获取,选项参数也可以通过@Value在类中获取。

    具体获取方法直接在使用参数的类中注入该接口即可

    @RestController
    public class ArgumentsController {
      @Resource
      private ApplicationArguments arguments;
    
      @GetMapping("/args")
      public void getArgs() {
          System.out.println("# 非选项参数数量: " + arguments.getNonOptionArgs().size());
          System.out.println("# 选项参数数量: " + arguments.getOptionNames().size());
          System.out.println("# 非选项具体参数:");
          arguments.getNonOptionArgs().forEach(System.out::println);
    
          System.out.println("# 选项参数具体参数:");
          arguments.getOptionNames().forEach(optionName -> {
              System.out.println("--" + optionName + "=" + arguments.getOptionValues(optionName));
          });
      }
    }
    

    可选项(系统参数)

    (-Dproperty=value)可以通过@Value或java.lang.System提供的方法获取

    @RestController
    public class ParamController {
    
      @Value("${property}")
      private String serverPort;
    
      public void test(){
         String systemServerPort = System.getProperty("property"); // -Dproperty
      }
    }
    

    配置文件的优先级

    # 启动服务后,各个配置文件的加载顺序为:
    先加载本地符合的配置文件(bootstrap.yml的读取优先级最高),再加载nacos上面的配置文件
    
    (本地)bootstrap.yml > (本地)application.yml > (本地)application-dev.yml > (nacos)order-service.yaml >
    (nacos)order-service-dev.yaml
    
    重点:后加载的配置会覆盖前面加载的配置内容
    
    注意:bootstrap.yml配置的属性值不会被覆盖,即优先级最高
    
    # Springboot加载参数的优先级:(优先级高的会覆盖优先级低的配置)
    [程序参数]Program arguments (--priority=program-agrs) >
    [JVM系统变量]VM options (-Dpriority=vm-options) >
    [环境变量]Environment variable (priority=environment-variables) >
    [配置文件变量]
    
    # 这里不是指加载顺序,就是优先级
    即:如果VM options 有一个变量和 Environment variable中的变量的key相同,则以VM options 中为准。
    即:程序参数会覆盖Yaml配置文件的变量
    
    

    无法覆盖远程配置中心(Nacos)问题

    方式一:通过启动时配置程序参数:--priority=program-agrs
    
    方式二:通过选项参数传入变量值:-DPORT=50101
    server:
      port: ${PORT:50101}
    
    方式三:修改nacos配置序号,使之采用addLast加载而非addFirst,从而实现命令行参数优先级大于远程配置中心。
    PS:该方案直接修改了nacos中所有配置优先级,使之从first变为last,可能存在风险,请慎用!
    在远程Nacos配置中心添加:(本地配置覆盖远程 本地配置优先)
    spring:
      cloud:
        config:
          override-none: true
          allow-override: true
          override-system-properties: false
    

    使用idea设置参数

    image

    1. VM options 需要以 -D 或 -X 或 -XX 开头,每个参数最好使用空格隔开。

    2. Program arguments 每个参数需要以空格隔开。否则将会被识别成一个参数,自己用的时候还得手动处理。

    3. Environment variable 没有前缀,优先级低于 VM options ,即如果VM options 有一个变量和 Environment variable中的变量的key相同,则以VM options 中为准,(如果用命令行启动,这个参数需要在运行java类以前使用 set JAVA_HOME=D:\jdk1.8.0_05 这种方式进行临时修改,这种方式只在当前cmd窗口有效,点击看详情 设置临时的java环境变量)。

    获取系统参数的方法

    java提供了System类的静态方法getenv()和getProperty()用于返回系统相关的变量与属性。

    • getProperty() 方法返回的变量大多与java程序有关。

    • System.getenv() 方法是获取指定的环境变量的值。

    • System.getenv(String name) 接收参数为任意字符串,当存在指定环境变量时即返回环境变量的值,否则返回null。

    • System.getProperty() 是获取系统的相关属性,包括文件编码、操作系统名称、区域、用户名等,此属性一般由jvm自动获取,不能设置。

    • System.getProperty(String key) 接收参数为任意字符串,当存在指定属性时即返回属性的值,否则返回null。

  • 相关阅读:
    搞懂分布式技术7:负载均衡概念与主流方案
    搞懂分布式技术6:Zookeeper典型应用场景及实践
    Django学习系列之django分页
    Python学习系列之format用法
    Python进阶系列之怎么写出pythonic的代码
    Python学习系列之内置函数
    域名添加HTTPS
    zabbix学习系列之QQ消息报警
    zabbix学习系列之配置邮件告警
    zabbix学习系列之触发器
  • 原文地址:https://www.cnblogs.com/zhaojinhui/p/16693758.html
Copyright © 2020-2023  润新知