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

使用OpenTelemetry Instrumenter扩展JavaAgent时遇NoClassDefFoundError

问题原因分析

出现NoClassDefFoundError且关联CodeAttributesExtractor类,核心原因通常是类加载路径问题,具体可能是以下情况:

  1. 依赖类未打包进扩展Jar:如果CodeAttributesExtractor是你自定义的工具类,打包时未将其包含在扩展Jar中,导致Agent加载扩展时找不到该类。
  2. 类加载隔离冲突:OpenTelemetry JavaAgent使用独立的类加载器,扩展只能访问Agent暴露的API类、自身打包的类以及目标应用类。若CodeAttributesExtractor依赖了Agent未提供的内部类,或你重复打包了Agent已有的类,会引发加载失败。
  3. 依赖版本不匹配:扩展依赖的OpenTelemetry API/Agent版本与运行时使用的Agent版本不一致,导致类结构不兼容。
解决步骤

1. 检查并修正打包配置

如果使用Maven,确保通过maven-shade-plugin将必要类打包进扩展Jar,同时排除Agent已提供的类避免冲突:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>3.4.1</version>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>shade</goal>
          </goals>
          <configuration>
            <createDependencyReducedPom>false</createDependencyReducedPom>
            <filters>
              <filter>
                <artifact>*:*</artifact>
                <excludes>
                  <!-- 排除Agent自带的扩展API类,避免重复加载 -->
                  <exclude>io/opentelemetry/javaagent/extension/**</exclude>
                  <!-- 排除重复的服务注册文件 -->
                  <exclude>META-INF/services/io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation</exclude>
                </excludes>
              </filter>
            </filters>
          </configuration>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
  • 若CodeAttributesExtractor是自定义类,确认它未被上述过滤规则排除,且在打包后的Jar中存在。

2. 规范依赖配置

扩展需依赖OpenTelemetry Agent扩展API,且将其设为provided scope(由运行时Agent提供):

<dependency>
  <groupId>io.opentelemetry.javaagent</groupId>
  <artifactId>opentelemetry-javaagent-extension-api</artifactId>
  <version>与运行时Agent一致的版本</version>
  <scope>provided</scope>
</dependency>
  • 避免直接依赖OpenTelemetry SDK内部类,仅使用Agent扩展API暴露的公开接口。

3. 确认扩展注册正确

在扩展Jar的META-INF/services/io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation文件中,添加你的TypeInstrumentation实现类全限定名,每行一个:

com.your.package.YourTypeInstrumentation

4. 正确运行配置

启动应用时,指定Agent和扩展的路径:

java -javaagent:/path/to/opentelemetry-javaagent.jar -Dotel.javaagent.extensions=/path/to/your-extension.jar -jar your-app.jar
额外排查点
  • 查看完整错误栈,确认是找不到CodeAttributesExtractor类,还是初始化该类时依赖其他缺失类。
  • 解压扩展Jar,检查CodeAttributesExtractor的类文件是否存在于对应包路径下。
  • 确保扩展Jar的MANIFEST.MF中没有错误的Class-Path配置,OpenTelemetry扩展无需额外配置类路径。

内容的提问来源于stack exchange,提问作者Valeriy K.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:15:41