必须加 -javaagent:/path/to/skywalking-agent/skywalking-agent.jar,推荐设 -Dskywalking.agent.service_name;Agent配置在 agent.config 文件中修改,application.yml 无效;Spring Boot 3+/Java 17+ 需 Agent ≥ 9.4.0。

Java应用接入SkyWalking Agent要改哪些启动参数
必须加 -javaagent 参数指向Agent包,否则JVM根本不会加载探针。Agent路径不能写相对路径,尤其在Docker或systemd里容易因工作目录不一致导致加载失败。
-
-javaagent:/path/to/skywalking-agent/skywalking-agent.jar是唯一必需项 - 可选加
-Dskywalking.agent.service_name=my-service,不设会默认用unnamed_service,后续查链路时根本分不清是哪个服务 - 若应用已用
-Dfile.encoding或其他-D参数,注意用空格分隔,别漏掉空格导致JVM参数解析错乱 - Spring Boot 3+(基于Java 17+)需确认Agent版本 ≥ 9.4.0,旧版Agent在高版本JVM上会静默失败,连日志都不打
application.yml里要不要配SkyWalking配置
不需要。SkyWalking Java Agent完全通过JVM参数和Agent内部的 agent.config 文件驱动,Spring Boot的 application.yml 对它没任何作用——除非你手动集成 skywalking-apm-sdk,但那是另一套手动埋点方案,和Agent自动探针无关。
- 真正要改的是
skywalking-agent/config/agent.config - 重点调
agent.service_name(服务名)、collector.backend_service(后端OAP地址,如oap-server:11800) - 如果OAP启用了gRPC TLS,必须同步开
agent.authentication并配证书路径,否则连接直接被拒绝,错误日志里只显示UNAVAILABLE,不提示缺证书 - 别碰
agent.ignore_suffix默认值,盲目加.jar会导致Spring Boot Fat Jar启动失败
为什么服务起来了却看不到链路数据
大概率是网络通、Agent加载了,但上报被拦截或格式不兼容。SkyWalking不上报HTTP请求,只上报gRPC调用、DB操作、Redis命令等明确的跨进程/跨组件动作;纯内存计算或本地方法调用不会生成Span。
- 先看Agent日志:
logs/skywalking-api.log里有没有Connected to collector,没有就卡在网络或认证 - 检查OAP日志是否收到数据:
grep "receive.*segment" logs/oap-server.log,没输出说明Agent根本没发出去 - Spring Cloud Gateway或Dubbo应用要注意:若用了非标准协议(如自定义序列化),需额外启用对应插件,比如
plugin.dubbo-2.7.x-plugin,否则RPC调用不被识别 - 本地开发时用
localhost当Collector地址,容器部署时得换成K8s Service名,别忘了更新
多模块Maven项目怎么确保所有子模块都生效
Agent是JVM级注入,只要最终运行的JAR/WAR启动时带了 -javaagent,整个JVM里所有类都会被增强——和Maven模块结构无关。但常见陷阱是:只给主模块加了Agent参数,而测试时跑的是另一个子模块的main方法,结果那个子模块没生效。
立即学习“Java免费学习笔记(深入)”;
- IDE里运行前务必检查「Run Configuration」里的VM options,不是pom.xml里写了就自动生效
- Maven Surefire插件跑单元测试时,默认不继承父JVM参数,需显式配置
<jvmArgs>-javaagent:...</jvmArgs> - 如果用了Spring Boot DevTools,注意它会fork新进程,Agent参数必须透传到fork后的JVM,否则热更后链路中断
- Gradle用户容易忽略
bootRun.jvmArgs配置,只改了run.jvmArgs,结果Spring Boot应用起不来
Agent配置本身不复杂,难的是环境上下文匹配:JVM版本、网络策略、容器网络模型、服务发现方式——任何一个环节的隐含假设没对齐,链路就消失得无影无踪。











