使用 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-plugin
的repackage
选项。
目前我做了以下事情:
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 Jar 时如何修复压缩错误
Spring Cloud Kubernetes - 启用配置重新加载时 Spring Boot 无法启动
Spring boot Actuator vs prometheus Jmx exporter