You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加javaagent后Tomcat无法关闭:-javaagent处理失败问题求助

Tomcat结合Prometheus监控时shutdown失败的解决方法

关键信息

  • Tomcat的catalina.bat路径:E:\work-tomcat\apache-tomcat-9.0.71\bin
  • jmx_prometheus_javaagent-0.17.2.jar路径:F:/work-Grafana/jmx_prometheus_javaagent-0.17.2.jar
  • catalina.bat修改内容:
    set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS% -javaagent:F:/work-Grafana/jmx_prometheus_javaagent-0.17.2.jar=2023:F:/work-Grafana/prometheus-2.42.0.windows-amd64/jmx-exporter.yaml"
    
  • Prometheus配置(prometheus.yml):
    job_name: "tomcat"
    static_configs:
    - targets: ["127.0.0.1:2023"]
    
  • 启动状态:Tomcat与Prometheus启动正常,监控功能正常
  • 关闭时报错:
    E:\work-tomcat\apache-tomcat-9.0.71\bin>shutdown.bat
    Using CATALINA_BASE:   "E:\work-tomcat\apache-tomcat-9.0.71"
    Using CATALINA_HOME:   "E:\work-tomcat\apache-tomcat-9.0.71"
    Using CATALINA_TMPDIR: "E:\work-tomcat\apache-tomcat-9.0.71\temp"
    Using JRE_HOME:        "C:\Program Files\Java\jdk1.8.0_201"
    Using CLASSPATH:       "E:\work-tomcat\apache-tomcat-9.0.71\bin\bootstrap.jar;E:\work-tomcat\apache-tomcat-9.0.71\bin\tomcat-juli.jar"
    Using CATALINA_OPTS:   ""
    Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
        at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)
    Caused by: java.net.BindException: Address already in use: bind
        at sun.nio.ch.Net.bind0(Native Method)
        at sun.nio.ch.Net.bind(Net.java:433)
        at sun.nio.ch.Net.bind(Net.java:425)
        at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
        at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
        at sun.net.httpserver.ServerImpl.<init>(ServerImpl.java:100)
        at sun.net.httpserver.HttpServerImpl.<init>(HttpServerImpl.java:50)
        at sun.net.httpserver.DefaultHttpServerProvider.createHttpServer(DefaultHttpServerProvider.java:35)
        at com.sun.net.httpserver.HttpServer.create(HttpServer.java:130)
        at io.prometheus.jmx.shaded.io.prometheus.client.exporter.HTTPServer.<init>(HTTPServer.java:396)
        at io.prometheus.jmx.JavaAgent.premain(JavaAgent.java:31)
        ... 6 more
    FATAL ERROR in native method: processing of -javaagent failed
    

问题原因

shutdown.bat执行时会继承JAVA_OPTS配置,尝试加载jmx_prometheus_javaagent并绑定2023端口,但此时Tomcat主进程已经占用了该端口,导致端口绑定失败,最终抛出错误。

解决方案

将javaagent的配置从JAVA_OPTS迁移到CATALINA_OPTS中。CATALINA_OPTS仅作用于Tomcat的主服务进程,shutdown.bat不会读取该变量,因此不会重复加载agent和绑定端口。

修改catalina.bat中的配置行:

set "CATALINA_OPTS=%CATALINA_OPTS% %JSSE_OPTS% -javaagent:F:/work-Grafana/jmx_prometheus_javaagent-0.17.2.jar=2023:F:/work-Grafana/prometheus-2.42.0.windows-amd64/jmx-exporter.yaml"

修改完成后重启Tomcat,之后执行shutdown.bat即可正常关闭服务。

内容的提问来源于stack exchange,提问作者SleepingBug

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 17:18:22