我想为我的 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
parent。 - 我正在 ArchLinux 系统上尝试这个。
- 我没有任何特殊的 iptables 配置,所有端口都应该在配置的 ip 上可用。
- Spring Boot 版本:1.4.1.RELEASE
- Java 版本:
openjdk 版本“1.8.0_112”
我做错了什么,我在哪里可以找到相关帮助的文档?
更新:我添加了一些行来读取和打印传递的 JAVA_OPTS
(如 here 所述)。当我通过 IntelliJ 启动应用程序并将 VM 选项设置为上面的 JAVA_OPTS
值时,它起作用了。传递的选项被打印出来,VM 正在监听端口 1617。当我使用 java -jar my.jar -Dcom.sun....
启动应用程序时,参数没有被打印出来,VM 是仍然没有在端口 1617 上监听。
最佳答案
问题解决了!我仍然不知道为什么它不适用于 JAVA_OPTS
但我知道我在直接传递选项时做错了什么:似乎我总是传递 -jar ...
选项在 -Dcom.sun...
选项之前。但我现在发现:
The order of these options is essential!
What? Really?
Yes!
那么,现在适合我的方式:
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
关于java - 使用 spring boot 重新打包启用 JMX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41682218/