被忽视的 java-D

Java 启动参数 -- 和 -D写法的区别 当我们配置启动1个java 项目通常需要带一些参数例如 -Denv = uat , --spring.profiles.active=dev 这些那么用-D 和 – 的写法区别是什么? 阅读详情

在 nexus-public 项目中,使用了脚本将多个项目进行文件的打包处理,在启动过程中发现少了配置参数,便难以启动,于是顺便做了一个笔记如下:
在 Java 中,命令行参数 -D 用于设置 系统属性(System Properties),其解析和处理由 Java 虚拟机(JVM)自身在启动时直接完成,而不是由 Java 标准库或应用程序代码处理。以下是详细解析:


1. -D 参数的作用

通过 -D 定义的参数会被 JVM 解析为 系统属性,格式为:

java -D<key>=<value> -jar your-app.jar

例如:

java -Dserver.port=8080 -Dlogging.level.root=INFO -jar app.jar

这些属性会存储在 JVM 的全局系统属性表中,应用程序可以通过 System.getProperty() 访问:

String port = System.getProperty("server.port"); // 返回 "8080"

2. -D 参数的解析过程

阶段 1:JVM 启动时解析
  • 责任方:JVM 的本地代码(C/C++ 实现)。
  • 触发时机:在 JVM 初始化阶段解析命令行参数。
  • 解析逻辑:
    1. JVM 遍历所有命令行参数。
    2. 当发现以 -D 开头的参数时,提取其后的 <key>=<value> 对。
    3. 将键值对存入 JVM 内部的系统属性表(System Properties)。
阶段 2:Java 程序访问
  • Java 接口:通过 System.getProperty() 或 System.getProperties() 访问。
  • 底层实现:JVM 通过本地方法(Native Method)从系统属性表中读取值。

3. 关键代码位置(JVM 源码)

虽然 JVM 的具体实现因版本和厂商(如 OpenJDK、Oracle JDK)而异,但核心逻辑在以下文件中:

  • OpenJDK 源码:
    • 文件路径:src/hotspot/share/runtime/arguments.cpp
    • 函数:Arguments::parse_each_vm_init_arg()
    • 代码片段:
      if (match_option(option, "-D", &tail)) {
        // 解析 -Dkey=value
        JavaVMOption option;
        option.optionString = create_string_value(tail);
        add_property(option); // 将属性添加到系统属性表
      }
      

4. 系统属性与程序交互

Java 代码访问系统属性
// 获取单个属性
String value = System.getProperty("key");

// 获取所有属性
Properties props = System.getProperties();
props.list(System.out);
覆盖系统属性
  • 启动时覆盖:
    java -Dkey=new_value -jar app.jar
    
  • 运行时覆盖(不推荐,需安全权限):
    System.setProperty("key", "new_value");
    

5. 与其他参数的区别

参数类型示例解析方用途
JVM 标准参数-Xmx1024mJVM 自身控制 JVM 行为(如内存大小)
-D 系统属性-Dconfig.file=app.propertiesJVM 自身传递应用程序配置
程序自定义参数--port=8080应用程序自行解析业务逻辑参数

6. 常见问题

Q1:为什么 -D 参数在程序启动后才能访问?
  • 因为 JVM 在启动时才会解析命令行参数并初始化系统属性表,程序启动后属性表已固定。
Q2:能否在运行时动态添加 -D 参数?
  • 不能。系统属性在 JVM 启动后不可修改(除非通过 System.setProperty(),但受安全策略限制)。
Q3:-D 参数和环境变量(Environment Variables)的区别?
  • 系统属性:由 JVM 管理,通过 System.getProperty() 访问。
  • 环境变量:由操作系统管理,通过 System.getenv() 访问。

总结

  • -D 参数由 JVM 直接解析,将键值对存入系统属性表。
  • 系统属性通过 System.getProperty() 访问,是 Java 程序配置的常用手段。
  • 底层实现依赖 JVM 的本地代码(C/C++),而非 Java 标准库。
SpringBoot实战——仿b站项目(一) 热部署就是当应用程序这种运行的时候升级冉家或者修改某一部分代码、配置文件时,无需手动启动应用,即可修改的部分生效工具 + IDEA配置。 阅读详情

相关推荐

GPL vs MIT:独立开发者选择开源协议的法律与商业考量

你可能听过这样的故事:某个开发者用业余时间写了个超好用的工具库,开源后被某大厂悄悄集成到闭源产品里赚得盆满钵满,开发者却连杯奶茶钱都没拿到;也可能听说过另一个案例:开发者选了GPL协议,结果用户修改代码后必须开源,反而推动项目社区快速壮大,最终靠技术服务赚到了钱。这些故事的核心矛盾,都源于开源协议的选择。对于独立开发者(尤其是单枪匹马写代码的个人或小团队),开源协议不是“随便选一个就行”的小事——它是代码的“使用说明书”,更是保护自身权益、规划项目未来的关键工具。

AI天才研究院 1181

java -D详解

其次,-D 是属于 [options] 这一块的。而 [options] 又分为如下几类。-D 就属于标准选项(Standard Options)中的一个,其作用是。官方文档对 -D 有明确的解释,具体看。首先,java 命令是这么用的。,官方对其作用及用法描述如下。

杂货铺的小掌柜 5398

5分钟搞定Vivado IP核的VCS仿真:从Export脚本到Verdi波形查看全流程

本文详细介绍了如何利用Vivado的Export Simulation功能,快速搭建Vivado IP核的VCS与Verdi联合仿真环境。通过自动化脚本生成、FSDB波形配置及高效调试技巧,实现从工程导出到波形查看的全流程,大幅提升FPGA验证效率,尤其适合IC验证工程师和竞赛团队。

weixin_29306261的博客 482

java -D简介

很多时候我们需要在项目中读取外部属性文件,用到了System.getProperty("")方法。这个方法需要配置JVM系统属性,那么如何配置呢? 那就是使用java -D 配置系统属性。 使用格式是:java -Dkey=value 比如新建一个测试类,如下: public class Test { public static void main(String[] args){ ...

追逐消失的记忆 1万+

微信小游戏审核避坑指南:如何一次性通过微信审核(附最新审核要求)

本文详细解析微信小游戏审核全流程,提供从开发到上线的关键策略,帮助开发者一次性通过审核。涵盖合规性自查、材料优化、开发环境配置、版本管理、审核材料填写技巧等核心内容,并附最新审核要求和常见驳回问题解决方案,显著提升审核通过率。

weixin_28454475的博客 1411

【G4基础03】2.3 How to Specify Materials in the Detector

定义探测器材料

adelall的博客 490

JVM 参数:`-D`、`-X`、`-XX`,傻傻分不清?

JVM 参数众多,我们常在启动一个 Java 程序时通过命令行指定各种参数选项。很多同学就会对此感到疑惑,为什么有时候要用 -D,有时候却要用 -X,还有些时候用的却是 -XX 呢?

nicholas1328的博客 3281

GNSS数据处理新手避坑:手把手教你用GAMP_GOOD下载IGS/MGEX数据(附.cfg文件详解)

本文详细介绍了如何使用GAMP_GOOD进行GNSS数据处理,从基础配置到高级参数调优,帮助新手避开常见错误。内容包括软件安装、配置文件详解、数据源选择、测站文件配置以及性能优化技巧,特别适合GNSS数据处理初学者快速上手。

weixin_30338481的博客 390

Java程序启动参数 -D详解

概述 java程序启动参数 -D是用来做什么的呢?去查询了一下官方解释: Set a system property value. If value is a string that contains spaces, you must enclose the string in double quotes: java -Dfoo="some string" SomeClass 也就是说-D是用来在启动一个java程序时设置系统属性值的。如果该值是一个字符串且包含空格,那么需要包在一对双引号中。 何为系

抽象的螺旋 8562

【RT-DETR实战】117、华为昇腾CANN部署探索:从模型转换到推理踩坑实录

本文总结了RT-DETR模型在昇腾310B芯片上部署的关键挑战与解决方案。主要遇到四大问题:1)模型转换时需注意ONNX导出设置,建议先固定尺寸验证;2)内存布局差异导致推理异常,需精确匹配NHWC/NCHW格式;3)流水线并发优化中内存复用和异步处理是关键;4)调试阶段需利用专用工具逐层比对。作者提出六条实用建议,包括小尺寸验证、预处理对齐、内存池设计等,强调部署是持续适配过程,需建立完整的测试体系应对工具链迭代。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 193

彻底解决Win11锁屏界面黑屏或者图片不变化

windows锁屏后黑屏

renkai721的专栏 1万+

探索Java String类中那些被忽视的宝藏方法

摘要:深入探索Java String类中的冷门方法 本文揭示了Java String类中常被忽视但功能强大的方法。首先介绍了处理Unicode字符的codePoint系列方法,解决表情符号等特殊字符处理问题。其次探讨了getBytes方法在不同编码转换中的应用。在字符串比较方面,展示了contentEquals方法支持多种字符序列比较的能力,以及regionMatches方法实现灵活局部匹配的技巧。这些方法虽然不常用,但在国际化文本处理、字符编码转换和模糊搜索等场景中能发挥重要作用,帮助开发者更高效地处理字

cx1050306424的博客 364

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【Java程序员必看】:5个被忽视的JavaDoc书写细节,90%的人都写错了

掌握JavaDoc注释规范,提升代码可读性与维护效率。本文揭示5个常被忽略的书写细节,涵盖方法注释、参数说明、异常描述等适用场景,教你写出专业级文档。遵循规范让团队协作更高效,值得收藏。

DebugLoom的博客 930

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【Java专题】容易被忽视的包装类

什么是包装类? 包装类:就是将8种基本数据类型,装换成对应的8种包装引用类型。 为什么需要将8种基本数据类型转换为8中包装类型呢? 原因在于8种基本的数据类型不够用 实例代码举例: /** * @author Jason * @create 2020-04-30 16:10 */ public class StringTest07 { public static void main(String[] args) { MyInt myInt = new MyIn...

王华春_Jason 523

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java开发中容易被忽视的东西

很多时候,习惯了开发的模式,往往会忽视一些基础的东西,而这些基础东西往往是开发有一定技术含量的模块所不能忽视的。 在此记下Java开发中容易被忽视的东西。   1)== 与 equals() 区别       == 既能用于基本数据类型比较又能用于引用类型比较,对于基本数据类型直接比较值是否相等,对于引用类型比较的是引用地址。       equals()用于引用类型比较,默认是当两个对

xinzheng_wang的博客 1300

细节决定成败,浅析一些容易被忽视的Java关键字

一、default关键字 default关键字,并不是访问修饰符中的default(默认的访问权限,不加public、private、protected访问修饰符的情况自动使用,同一包下的类可以访问字段),而是Java8的新特性,default关键字是不能修饰字段的。 Java8以前的认知,Java的接口中的方法只能定义不能有方法体,方法体是由实现类去实现的。但是如果当我们要去扩展接口时,所有

Leeon的博客 1950

Java中一些常被忽视的特性

说明: 1 参考自stackoverflow上的一个帖子以及广大网友的回复: http://stackoverflow.com/questions/15496/hidden-features-of-java?page=4&tab=votes#tab-top 2 在这些回复中,我选择了一些写到这篇博客中,当然也有很多回复我认为没有必要翻译出来. 3 在翻译的过程中,为了快速完成,主要把代码贴过

昨夜星辰的博客 3781

Java编程中容易被忽视的五个性能优化技巧

如果能预估数据量,在创建集合时指定初始容量,可以避免多次扩容带来的性能损耗。这些优化技巧虽然看似微小,但在大规模、高并发的应用场景中,累积的优化效果将十分显著。开发者应在保证代码可读性和可维护性的前提下,合理运用这些优化手段,以提升应用的整体性能表现。访问局部变量比访问成员变量或静态变量更快,因为局部变量存储在栈帧中,而成员变量存储在堆中。应避免在正常的程序流程中使用异常控制,特别是在性能关键的代码路径中。在性能敏感的代码段中,应优先使用基本数据类型而非对应的包装类,特别是在循环和数学计算场景中。

dgEZTrtR的博客 438

Java核心基础之容易被忽视的细节问题——异常处理

不管是工作还是面试,细节决定成败。 1、在try块中声明的变量是局部变量,在catch、finally、以及异常处理外都不能被访问。所以我们要把InputStream/OutputStream一类的变量声明在try块外,以方便在finally块中关闭连接。

Leeon的博客 928

3个被忽视的虚拟线程指标,正悄悄拖垮你的系统吞吐量

掌握微服务的虚拟线程监控,精准定位性能瓶颈。本文揭示3个常被忽视的关键指标,解析其在高并发场景下的影响与监控方法,提升系统吞吐量。通过实时追踪线程状态、任务队列延迟与挂起数,快速发现隐形负载问题,值得收藏。

DebugLoom的博客 967

盘点IntelliJ IDEA中被低估的那些快捷键

本文将为大家盘点IntelliJ IDEA中最被低估的快捷键,欢迎下载最新版体验~

需要界面开发、IDE工具研发中文教程资料的小伙伴,记得私信我~ 585

Android开发中可能被忽视的bug

java.lang.IllegalArgumentException 异常:Receiver not registered 出现情况:偶现 问题原因:广播在没有注册的情况下就调用注销广播方法。 问题场景:平时大多动态注册广播,都是把广播注册写在Activity的onCreate方法里面,把注销写在onDestory里面,这样可以保证调用广播注销方法时,该广播一定是被注册过的,但是在其它地方使用,...

weixin_34268169的博客 152

为什么你的泛型代码总是出错?:3个被忽视的类型约束陷阱

掌握泛型的类型约束技巧,避开常见错误。本文解析3个易忽略的陷阱,涵盖接口约束、构造函数约束和值类型约束的应用场景与正确写法,提升代码健壮性。理解这些核心方法,让泛型更安全高效,值得收藏。

LiteCompile的博客 765

技术迭代加速,传统码农如何逆袭?2个被忽视的高价值转型路径

应对技术迭代带来的传统开发淘汰风险,本文揭示2条被忽视的高价值转型路径:深耕领域驱动设计与转向低代码平台集成。助力码农突破瓶颈,提升不可替代性,实现职业跃迁,值得收藏。

CodeNexus的博客 827

eclipse java使用_Java基础--Eclipse使用

Eclipse是JavaWeb开发最常用的工具,下面详细介绍一下如何下载安装最新版Eclipse。本文eclipse的使用是在JDK安装配置完成的基础上进行的,否则Eclipse安装后可能无法运行程序。JDK的安装配置可以参考文章:一、安装1.1 下载、安装eclipse软件是免安装的,就是只需要下载对应的安装包解压即可使用。根据下载链接:打开eclipse的下载页面,点击下图1中箭头所指的Dow...

weixin_34640289的博客 4251

Java模块化安全配置陷阱:3个被忽视的exploit入口点全揭示

深入解析Java模块化安全配置中的3个隐秘exploit入口,提升系统安全性。结合实际应用场景,揭示权限控制、模块导出与类加载机制中的风险点,提供可落地的防护策略。掌握Java 模块格 安全性关键实践,值得收藏。

InstrWander的博客 915
上一篇: Maven核心包:maven-resolver-api
下一篇: 【容器镜像】从底层开始一秒构建
旷野说
博客等级 码龄9年 361粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值