使用 Spring Boot 重新打包启用 JMX

Posted

技术标签:

【中文标题】使用 Spring Boot 重新打包启用 JMX【英文标题】:Enable JMX with spring boot repackage 【发布时间】:2017-05-31 15:15:20 【问题描述】:

我想为我的 Spring Boot 应用程序启用 JMX,并尝试了所有方法但没有成功。我认为,问题在于,我正在使用spring-boot-maven-pluginrepackage 选项。

目前我做了以下事情:

export JAVA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1617 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1"
java -jar target/myapp-1.0.0.jar

但是当我启动应用程序时,它没有侦听端口 1617。我无法从 JMX 客户端连接,ss -tulpen 也没有列出该端口。

我也试过直接传递-D...参数。我还用--com.sun... 尝试过,并认为Spring boot 可以这样处理它们。我还在多台机器上尝试了许多其他的东西,但没有成功。

一些进一步的信息:

我的应用程序使用任何spring-boot 父级。 我正在 ArchLinux 系统上尝试这个。 我没有任何特殊的 iptables 配置,所有端口都应该在配置的 ip 上可用。 Spring Boot 版本:1.4.1.RELEASE Java 版本:openjdk version "1.8.0_112"

我做错了什么,在哪里可以找到相关帮助的文档?

更新:我添加了一些用于读取和打印传递的JAVA_OPTS 的行(如here 所述)。当我通过 IntelliJ 启动应用程序并将 VM 选项设置为上面的 JAVA_OPTS 值时,它可以工作。打印传递的选项,VM 正在侦听端口 1617。当我使用 java -jar my.jar -Dcom.sun.... 启动应用程序时,未打印参数,VM 仍未侦听端口 1617。

【问题讨论】:

我认为您正在使用 wrong way 来传递 JMX 参数。尝试在java 命令之后直接传递它们。 “它不监听 1617 端口”是指无法连接还是在 netstat 中查找过? @MaximDobryakov 如前所述。我已经这样做了。我也用java -Dcom.sun.... -jar ... 运行了java 命令。 @chrylis ss 是新的netstat。所以无法连接,netstat/ss 没有列出来 当内核 13.0 删除 proc 条目时,我将切换到 ss。离开我的草坪! 【参考方案1】:

问题解决了!我仍然不知道为什么它不适用于JAVA_OPTS,但我知道直接传递选项时我做错了什么:似乎我总是通过-jar ... 选项之前 @987654323 @ 选项。但我现在发现:

这些选项的顺序很重要!

什么?真的吗?

是的!

所以,现在适合我的方式:

java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1617 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar my.jar

而这个不起作用

java -jar my.jar -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1617 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false

【讨论】:

非常感谢!我整天都在找这个! 这是因为您正在运行一个 jar:-jar my.jar 之后的所有内容都作为参数传递给您的 main 方法 (String[] args),而不是作为 JVM 选项。

以上是关于使用 Spring Boot 重新打包启用 JMX的主要内容,如果未能解决你的问题,请参考以下文章

如何运行 spring boot 重新打包目标

重新打包 Spring Boot Jar 时如何修复压缩错误

Spring Cloud Kubernetes - 启用配置重新加载时 Spring Boot 无法启动

Spring boot Actuator vs prometheus Jmx exporter

Spring Boot Multi-Module maven 项目重新打包失败

允许在立即启用 JMX 监控的情况下重新启动 Java 应用程序