在JVM(Java虚拟机)参数中,-D
是一个非常重要的选项,用于在启动Java程序时设置系统属性(System Properties)。这些属性可以在程序中通过 System.getProperty()
方法访问,主要用于动态配置应用行为、传递环境变量或自定义参数。
一、核心作用
-D
的作用是在JVM启动时设置系统属性,格式为:
-D<propertyName>=<propertyValue>
例如:
java -Dserver.port=8080 -Dapp.env=prod MainClass
在Java代码中,可以通过以下方式获取这些属性:
String port = System.getProperty("server.port"); // 返回 "8080"
String env = System.getProperty("app.env"); // 返回 "prod"
二、常见应用场景
1. 配置应用参数
- 数据库连接信息:
java -Ddb.url=jdbc:mysql://localhost:3306/mydb \ -Ddb.username=root \ -Ddb.password=secret \ MainClass
在代码中:
String url = System.getProperty("db.url");
2. 控制日志行为
- 设置日志级别:
java -Dlog.level=DEBUG MainClass
在日志配置中引用:
3. 指定文件编码
- 解决中文乱码问题:
java -Dfile.encoding=UTF-8 MainClass
4. 自定义系统行为
- 启用/禁用功能:
java -Dfeature.flag=true MainClass
5. 容器化环境配置
- 从环境变量传递到Java程序:
java -Dserver.port=$PORT MainClass
三、与其他JVM参数的区别
参数类型 | 示例 | 作用范围 | 访问方式 |
---|---|---|---|
-D | -Dname=value |
设置系统属性,应用程序可读取 | System.getProperty("name") |
-X | -Xmx1024m |
设置非标准JVM选项(如堆内存大小) | JVM内部使用 |
-XX | -XX:+UseG1GC |
设置高级JVM选项(如垃圾回收器) | JVM内部使用 |
-classpath | -cp lib/* |
指定类路径 | JVM加载类时使用 |
四、使用注意事项
-
属性名的命名规则
- 建议使用点分格式(如
app.name
)以提高可读性。 - 避免与JVM内置属性冲突(如
java.home
、os.name
)。
- 建议使用点分格式(如
-
空格处理
- 如果值包含空格,需要用引号包裹:
java -Ddescription="Hello World" MainClass
- 如果值包含空格,需要用引号包裹:
-
优先级
- 命令行
-D
参数会覆盖系统环境变量和代码中System.setProperty()
的默认值。
- 命令行
-
安全性
- 敏感信息(如密码)建议通过更安全的方式传递(如环境变量或配置文件),避免在命令行中明文显示。
五、示例代码
以下Java程序演示如何读取 -D
设置的属性:
public class SystemPropertyDemo {
public static void main(String[] args) {
// 获取系统属性
String appName = System.getProperty("app.name", "DefaultApp");
String env = System.getProperty("app.env", "dev");
boolean debug = Boolean.parseBoolean(System.getProperty("debug", "false"));
// 输出属性值
System.out.println("应用名称: " + appName);
System.out.println("运行环境: " + env);
System.out.println("调试模式: " + debug);
// 获取所有系统属性
System.getProperties().forEach((k, v) -> {
System.out.println(k + " = " + v);
});
}
}
运行命令:
java -Dapp.name=MyApp -Dapp.env=prod -Ddebug=true SystemPropertyDemo
六、常见内置系统属性
属性名 | 说明 | 示例值 |
---|---|---|
java.version |
Java版本号 | 17.0.2 |
java.home |
JRE安装目录 | /usr/lib/jvm/java-17-openjdk |
os.name |
操作系统名称 | Linux 或 Windows 10 |
user.dir |
当前工作目录 | /home/user/projects |
user.home |
用户主目录 | /home/user |
file.encoding |
文件编码 | UTF-8 |
通过 -D
参数,你可以在不修改代码的情况下动态调整应用行为,这在不同环境(开发、测试、生产)部署时尤为有用。
注意:SpringBoot 的优先级规则是:命令行参数 > JVM 参数 > 配置文件 > 默认值。
除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接
文章评论