Idea 开发java 项目中的各种启动参数配置和获取方式汇总
java启动命令的整体结构
java [-D options] -jar 你打好的jar包名.jar [program args]
[-D options]
是jvm
选项,一般以-D
开头,其他参数必须是jvm
虚拟机能识别的参数 比如-Xms
等,参数之间用空格
分开[program args]
是main
方法中的args
,也就是程序入口main 方法启动时加载 该参数
如果参数是--spring.profiles.active
等,则会被springboot
程序识别和使用
参数之间用空格
分开environment
是操作系统环境参数,在windows 上是path
中的JAVA_HOME
等环境变量配置,参数之间用;
分开yml 配置
是jar
包内部文件中指定的参数 ,远程config server
从git
拉取的优先级要高于 本地的yml
配置
各种配置的优先级如何? 如何配置? 如何获取 这些参数? 参数何时生效 ?
如下4图涵盖了所有情况。本人亲自测试所得,欢迎提问
1. 启动参数优先级: 高优先级的配置,会覆盖低优先级的配置。
优先级,依次是
program args
>VM options
>Environment variables
>远程git 配置
>bootstrap.yml配置
>application.yml
Active profiles
方式,优先级略微高于VM options
如果有多个地方配置了相同的参数,那么 高优先级的配置,会覆盖低优先级的配置。最终系统只认 高优先级的配置
2. 按上图配置:启动测试,可见优先级最高的确实是 program args
3. 启动参数配置的注意事项![在这里插入图片描述](https://img-blog.csdnimg.cn/a8237cdf53e9495a9607ff88b2f83bbd.jpeg)
4. 不同参数的获取方式:
program args
: 直接在main
方法中硬编码 获取 数组类型参数args
。--spring.profiles.active
属于 该类型参数,理论上可以直接在 main 中获取VM options
:System.getProperty("key")
Environment variables
:System.getenv("key")
5. idea 中配置 Active profiles : 会覆盖 VM options
配置 -Dspring.profiles.active
配置
应用例子-配置jvm 给 tomcat 提速
比如,为了使 springboot 内置的 tomcat 提速,就有以下3种方式
-
可以这样直接去操作系统上,找到 jre 的配置文件,修改
打开$JAVA_PATH/jre/lib/security/java.security
这个文件,找到下面的内容:
securerandom.source=file:/dev/random
替换成securerandom.source=file:/dev/./urandom
-
或者在idea中配置 jvm 的参数
-Djava.security.egd="file:/dev/./urandom"
-
也可以在启动的命令行中 指定 该 jvm 参数
nohup java -Djava.security.egd=file:/dev/./urandom -jar server-1.0.0.jar --spring.profiles.active=test >/dev/null 2>&1 &
应用例子-sh脚本方式 启动Java
- 该启动 sh脚本在项目的路径下
xxl-job-executor-sample-springboot.sh
#!/bin/sh
# -server -Xms200m -Xmx200m -XX:MetaspaceSize=10m -XX:MaxMetaspaceSize=40m
# -server, 64位机器默认就是该参数,jdk7机器默认是-client 模式 https://segmentfault.com/a/1190000041114158
# GC 打印最佳实践 https://blog.nowcoder.net/n/baa65a5fe88044398cf65b6375a556c7?from=nowcoder_improve
# JVM参数详解 https://juejin.cn/post/7054567953181704200
JAVA_OPTS="-server -Djava.awt.headless=true \
-Dfile.encoding=UTF-8 \
-Duser.timezone=GMT+08 \
-Dmaven.test.skip=true \
-XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -XX:+PrintGCApplicationStoppedTime \
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=2m -Xloggc:./logs/gc-%t.log \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./logs/dump.hprof -XX:ErrorFile=./logs/fatal-error.log"
PARAMS="--spring.profiles.active=prod"
jar_name=xxl-job-executor-sample-springboot
# sh 其他脚本后台启动-异步执行.sh &
echo '' >> ./logs/startup.log
echo $(date +"%Y-%m-%d %H:%M:%S") 启动中 ${jar_name} >> ./logs/startup.log
java ${JAVA_OPTS} -jar ./target/${jar_name}.jar ${PARAMS}