avatar

十六小站

欢迎来到我的个人主页! 期待与您分享我的经验与故事,一起探索技术的无穷可能!

  • 首页
  • NAS专题
  • 关于
Home Springboot环境下的启动参数说明
文章

Springboot环境下的启动参数说明

Posted 2023-12-20 Updated 2024-10- 19
By 十六
13~17 min read

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    # 覆盖原有内容
>>outlog.log   # 将输出结果追加到文件末尾

# 在Linux系统中0 1 2是一个文件描述符:
标准输入(stdin)  0  # 0表示键盘输入
标准输出(stdout) 1  # 1表示屏幕输出
错误输出(stderr) 2  # 2表示错误输出

2>&1的含义:

将标准错误输出重定向到标准输出。

注意:符号>&是一个整体,不可分开,分开后就不是上述含义了。

cat test 2>&1 >file

错误输出到终端,标准输出被重定向到文件file。

cat test >file 2>&1

标准输出被重定向到文件file,然后错误输出也重定向到和标准输出一样,所以也错误输出到文件file。

command >out.file 2>&1 &

  • **command >out.file ** 是将command的输出重定向到out.file文件,输出内容不打印到屏幕上,而是输出到out.file文件中。
  • **2>&1 ** 是将标准出错重定向到标准输出,因为标准输出已经重定向到了out.file文件,所以标准出错也输出到out.file文件中。
  • 最后一个&, 是让该命令在后台执行。

通俗的说,就是把所有标准输出和标准出错都输出到out.file文件。

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

可以通过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。

菜鸟入坑
Java
License:  CC BY 4.0
Share

Further Reading

Apr 1, 2025

在WEB中子线程可以访问Request上下文

使用RequestContextHolder获取Request和Session对象 在JavaWeb中,可以通过RequestContextHolder类来获取当前线程的Request和Session对象。具体实现方式是先获取ServletRequestAttributes对象,再从中提取Reque

Dec 31, 2024

OpenSearch常用脚本

给数据添加属性 POST /your_index/_update_by_query { "script": { "source": "ctx._source.newField = 'new_value'", "lang": "painless" }, "query": {

Oct 27, 2024

HTML编译成应用程序

如果你想将 HTML 网页包装成 Windows 应用程序,可以使用 Electron。下面是详细步骤: 使用 Electron 创建 Windows 应用程序 1. 安装 Node.js 和 npm - 首先确保你安装了 Node.js 和 npm(Node.js 的包管理器)。你可以从 [Nod

OLDER

WebService接口动态发布

NEWER

Idea热部署插件Rebel

Recently Updated

  • Onlyoffice编译
  • K6+Playwright实现并发测试
  • 简单规则引擎
  • 在WEB中子线程可以访问Request上下文
  • onlyoffice配置

Trending Tags

Java Docker 前端 中间件 数据库 群晖 unraid

Contents

©2025 十六小站. 陕ICP备2023009742号-2