Java 启动参数 -- 和 -D写法的区别

当我们配置启动1个java 项目通常需要带一些参数

例如 -Denv = uat , --spring.profiles.active=dev 这些

那么用-D 和 – 的写法区别是什么?



双横线写法

其中这种写法基本上是spring 和 spring 框架独有

最常用的无非是就是上面提到的 --spring.profiles.active=dev 啦
这种写法必须写在 java xxx.jar 的后面

例如:

java xxx.jar --spring.profiles.active=dev

如果我们想自己在java 程序里自定义1个custom的 用-- 指定的参数
可以参考下面代码

@SpringBootApplication
@PropertySource("classpath:query.properties")
@Slf4j
public class Application {
   
   

    public static void main(String[] args) {
   
   
        SpringApplication.run(
<think>我们正在处理用户的问题:如何在Dockerfile中添加JVM参数 -Djava.awt.headless=true 根据引用,我们知道这个参数的作用是让Java在无图形界面的环境下运行(比如服务器环境),避免因缺少显示设备而报错。 在Dockerfile中,我们通常通过设置环境变量来传递JVM参数,或者直接在启动命令中添加。 常见的方式有两种: 1. 通过环境变量JAVA_OPTS来设置,然后在启动命令中使用这个环境变量。 2. 直接在启动Java应用的命令中添加参数。 下面分别给出两种方法的示例: 方法一:使用环境变量JAVA_OPTS 在Dockerfile中,我们可以这样设置: ``` ENV JAVA_OPTS="-Djava.awt.headless=true" ``` 然后在启动命令中引用: ``` CMD java ${JAVA_OPTS} -jar your-application.jar ``` 方法二:直接在启动命令中添加参数 ``` CMD java -Djava.awt.headless=true -jar your-application.jar ``` 但是,通常我们可能会需要设置多个参数,所以使用环境变量会更为灵活。另外,如果使用环境变量,我们还可以在运行容器时覆盖这个环境变量来改变参数。 因此,推荐使用环境变量的方式。 注意:如果你的应用是Spring Boot应用,并且使用外部配置文件,也可以考虑在application.properties中设置,但这里用户要求的是在Dockerfile中设置。 所以,我们可以在Dockerfile中这样写: 示例Dockerfile: ``` FROM openjdk:8-jre-alpine # 复制应用程序jar包 COPY target/your-app.jar /app/your-app.jar # 设置JVM参数 ENV JAVA_OPTS="-Djava.awt.headless=true" # 启动命令 CMD java $JAVA_OPTS -jar /app/your-app.jar ``` 注意:如果使用Alpine镜像,确保你使用的是包含glibc的镜像(如果应用需要),或者使用openjdk:8-jre(非Alpine)作为基础镜像。 另外,如果用户有多个参数,可以这样写: ``` ENV JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8" ``` 如果用户使用的是Spring Boot,并且使用了内嵌服务器,那么这种方式是有效的。 但是,请注意,如果启动命令中已经包含了其他参数,那么需要将JAVA_OPTS放在合适的位置。通常,JVM参数应该放在`java`命令主类(或-jar)之间。 因此,我们给出一个通用的Dockerfile片段。 另外,根据引用[2],我们可能还需要其他参数,比如设置编码、内存等,都可以在JAVA_OPTS中设置。 所以,最终回答:在Dockerfile中设置环境变量JAVA_OPTS,并在启动命令中使用该环境变量。 如果用户使用的是Docker Compose,也可以在compose文件中设置环境变量,但这里用户要求的是Dockerfile。 注意:在Dockerfile中使用环境变量JAVA_OPTS时,如果变量值包含空格,需要确保在CMD中使用时被正确解析。上面的写法在shell形式的CMD中是可行的,因为shell会解析变量并分割参数。如果使用exec形式,则需要注意,因为exec形式不会调用shell,所以不会解析环境变量中的空格。因此,我们通常使用shell形式(即不带中括号的CMD)。 因此,我们使用: ``` CMD java $JAVA_OPTS -jar /app/your-app.jar ``` 如果必须使用exec形式,可以写成: ``` CMD ["sh", "-c", "java $JAVA_OPTS -jar /app/your-app.jar"] ``` 这样就能正确解析环境变量中的多个参数。 总结:在Dockerfile中添加环境变量JAVA_OPTS,并在启动命令中引用。 现在,我们按照要求生成相关问题。</think>### 如何在 Dockerfile 中添加 JVM 参数 `-Djava.awt.headless=true` 在 Dockerfile 中添加 JVM 参数 `-Djava.awt.headless=true` 的目的是让 Java 应用在无图形界面的容器环境中正常运行,避免因缺少显示设备而报错(如 `java.awt.HeadlessException`)。以下是两种推荐方法: --- #### **方法 1:通过环境变量传递参数(推荐)** 在 Dockerfile 中定义 `JAVA_OPTS` 环境变量,并在启动命令中引用: ```dockerfile # 使用 OpenJDK 基础镜像 FROM openjdk:11-jre-slim # 设置环境变量(包含 headless 参数) ENV JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8" # 复制应用 JAR 包 COPY target/app.jar /app/app.jar # 启动时引用环境变量 CMD java ${JAVA_OPTS} -jar /app/app.jar ``` **优点**: - 灵活性强,可通过 `docker run -e JAVA_OPTS="..."` 动态覆盖参数[^2][^3]。 - 支持添加多个 JVM 参数(如编码设置、内存配置等)。 --- #### **方法 2:直接嵌入启动命令** 在 `CMD` 指令中硬编码参数: ```dockerfile FROM openjdk:11-jre-slim COPY target/app.jar /app/app.jar CMD java -Djava.awt.headless=true -Dfile.encoding=UTF-8 -jar /app/app.jar ``` **适用场景**: - 参数固定且无需变更的简单应用。 --- #### **关键说明** 1. **作用**:`-Djava.awt.headless=true` 强制 Java 使用无图形模式,适用于服务器/容器环境[^3][^4]。 2. **常见错误**: 若未添加此参数,在容器中运行图形相关操作(如图表生成)可能抛出: ```java java.awt.HeadlessException: No X11 DISPLAY variable was set ``` 3. **扩展配置**: 可组合其他参数,如内存限制(`-Xmx1g`)或编码设置(`-Dfile.encoding=UTF-8`)[^2]。 --- #### **验证是否生效** 运行容器后检查 JVM 参数: ```bash docker exec <container-id> java -XX:+PrintFlagsFinal -version | grep "headless" ``` 输出应包含: ```plaintext java.awt.headless = true ``` --- ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nvd11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值