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和application.yml中存在同名配置项,那么在大多数情况下,application.yml中的配置会覆盖bootstrap.yml中的配置。这是因为application.yml的加载顺序通常晚于bootstrap.yml,意味着它的配置项会覆盖或修改先前加载的配置。
但是,有些配置项可能被标记为只应从bootstrap.yml中读取,这意味着它们不能被子类覆盖。这些配置项通常用于设置一些在应用启动时必须设置的属性,例如nacos配置信息、数据库连接详细信息。 # 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配置文件的变量

当外部定义了/config/bootstrap.yml

在部署Java项目时,指定外部的/config/bootstrap.yml 文件,那么这个外部文件中的配置会优先于内置的 resources/bootstrap.yml文件中的配置被加载和应用。也就是说,如果两者中有任何冲突的配置,外部文件中的配置将会覆盖内置文件中的配置。

Springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件。

java -jar myproject.jar --spring.config.location=classpath:/default.yml,classpath:/override.yml

–file:./config/
–file:./
–classpath:/config/
–classpath:/

优先级由高到低,高优先级的配置会覆盖低优先级的配置。

如果想指定自定义目录的配置文件,则可以使用以下方式:

java -jar myproject.jar --spring.config.location=d://data/application.yml
java -jar myproject.jar --spring.config.location=http://example.com/config.yml # Spring Boot会按照指定的顺序加载配置文件。因此,在覆盖配置时,请确保覆盖的配置文件在指定的位置之后加载。

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

经测试,通过配置启动参数:-Dserver.port=8081 或 --server.port=8081 均无法覆盖nacos属性

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

使用idea设置参数

  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 -jar 启动程序参数说明的更多相关文章

  1. linux 下检查java jar包 程序是否正常 shell

    linux 下检查java jar包 程序是否正常 shell http://injavawetrust.iteye.com BATCH_SERVER="batch.jar" NR ...

  2. SpringBoot(十):读取application.yml下配置参数信息,java -jar启动时项目修改参数

    读取application.yml下配置参数信息 在application.yml文件内容 my: remote-address: 192.168.1.1 yarn: weburl: http://1 ...

  3. linux中启动 java -jar 运行程序

    每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 直接用java -jar xxx.jar,当退出或关闭shell时,程序就会停止掉.以 ...

  4. java jar启动

    linux中启动 java -jar 后台运行程序 直接用java -jar xxx.jar,当退出或关闭shell时,程序就会停止掉.以下方法可让jar运行后一直在后台运行. 1. java -ja ...

  5. SpringBoot整合Mybatis,多数据源,事务,支持java -jar 启动.

    用了一段时间SpringBoot,之前配置MYBATIS ,在打包WAR 放到tomcat下正常,但是WAR已经过时了,现在流行直接打包JAR 丢到DOCKER 里,无奈JAR 启动的时候MAPPER ...

  6. java -jar 启动jar包 带参数

    运行jar包时指定端口:java -jar xxx.jar --server.port=8088 server.port=8081 若命令行传入的server.port没有作用,服务仍然使用8081端 ...

  7. java -jar启动java项目时,引用不同配置文件命令

    java -jar eureka-server.jar --spring.profiles.active=peer1

  8. 【原】无脑操作:Centos 7后台运行及终止jar包程序

    1.后台运行jar包程序,输入:nohup java -jar /路径/程序.jar & 2.后台终止jar包程序,输入:ps -ef | grep java,查看使用java命令的进程,再输 ...

  9. 【监控】jvisualvm之jmx远程连接 jar启动应用

    一.Java -jar启动添加如下参数就可以了 -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=127.0.0.1 -Dcom.su ...

  10. linux_后台启动多个java -jar 程序,及关闭

    启动脚本 startup.sh #!/bin/bash x=$(($)) )) do java -jar /home/chenpenghui/crawler/crawler-hb/StartUpIp. ...

随机推荐

  1. python教程6.1-模块和包

    模块分类 1.内置标准模块(⼜称标准库)执⾏help('modules')查看所有python⾃带模块列表 2.第三⽅开源模块,可通过pip install 模块名 联⽹安装 3.⾃定义模块 模块导入 ...

  2. Atera 用户为最终用户提供对办公计算机的远程访问

    ​一言以蔽之:由 Splashtop 提供支持的 Atera 的客户远程访问功能允许使用 Atera 的 MSP 设置和管理其最终用户对办公计算机的远程访问. 新冠肺炎大流行已加速了全球远程工作的进程 ...

  3. 解密Prompt系列29. LLM Agent之真实世界海量API解决方案:ToolLLM & AnyTool

    很早之前我们就聊过ToolFormer,Gorilla这类API调用的Agent范式,这一章我们针对真实世界中工具调用的以下几个问题,介绍微调(ToolLLM)和prompt(AnyTool)两种方案 ...

  4. 用友u8 使用 api资源管理器新增单据的一些方法

    一般都使用传xml对象的方式.这种方式方便在只需传入正确的视图就行了.但是如果字段不全,或者字段的数据类型与api要求的不服,会报些莫名其妙的错误,比如这些: 项目大类0不存在项目大类0不存在货位不合 ...

  5. C#的奇技淫巧:利用WinRM来远程操控其他服务器上的进程

      前言:有时候远程服务器的进程你想偷偷去围观一下有哪些,或者对一些比较调皮的进程进行封杀,或者对一些自己研发的服务进行远程手动启动或者重启等,又不想打开远程桌面,只想悄咪咪地执行,那也许下面的文章会 ...

  6. 阿里巴巴 MySQL 数据库之 SQL 语句规约 (三)

    SQL 语句规约 强制部分 [强制] 不要使用 count(列名) 或 count(常量) 来替代 count(*),count(*) 是 SQL92 定义的标准统计行数的语法,跟数据库无关,跟 NU ...

  7. Android 13 - Media框架(1)- 总览

    关注公众号免费阅读全文,进入音视频开发技术分享群! 为了加深对Android Media框架的理解,决定在这里记录下学习过程中碰到的问题以及一些个人思考.由于本人水平有限,笔记的内容可能会有一些错误, ...

  8. WPF插件之 - PropertyChanged.Fody使用详解

    总目录文章目录总目录一.PropertyChanged.Fody是什么?二.PropertyChanged.Fody的安装三.PropertyChanged.Fody的功能1. 特性1 实现属性通知的 ...

  9. docker lnmp

    #wiki: https://github.com/2233466866/lnmp/wiki #安装docker wget -O /etc/yum.repos.d/ali_docker-ce.repo ...

  10. vue3+vant 引入Dialog Toast都会失败报错not defined

    今天在封装vant组件的时候,刚好要用到toast提示信息的组件,索性就按照官网提供的引入方法进行正常的引入,嘿,好家伙,一顿操作下来后发现竟然报Toast未定义,这就纳闷了,明明步骤都是对的啊,所以 ...