AWS/EKS中Java应用FrameworkFactory版本加载异常排查求助
我们正在将Kubernetes部署迁移至AWS EKS,其中一个集群运行正常,另一个集群启动时无法正确解析org.osgi.framework.launch.FrameworkFactory的版本:
- 正常集群从
org.eclipse.osgi-3.9.1.jar加载该类,能正确解压并生成lib/配置文件及工作区文件夹 - 异常集群则从
org.osgi.core-4.3.1.jar加载,无法生成配置与工作区,导致主线程启动即报错
我们使用第三方JAR和Eclipse配置,通过Maven构建Docker镜像部署,需要故障原因分析思路。
正常集群 - [Loaded org.osgi.framework.launch.FrameworkFactory from file:/usr/share/pm.health.rating.engine/lib/org.eclipse.osgi-3.9.1.jar] vs 异常集群 - [Loaded org.osgi.framework.launch.FrameworkFactory from file:/usr/share/pm.health.rating.engine/lib/org.osgi.core-4.3.1.jar]
<dependencies> <dependency> <groupId>org.apache.avro</groupId> <artifactId>avro</artifactId> <version>${avro.version}</version> </dependency> <dependency> <groupId>net.logstash.log4j</groupId> <artifactId>jsonevent-layout</artifactId> <version>1.7</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-s3</artifactId> <version>${aws.version}</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-sts</artifactId> <version>${aws.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-server</artifactId> <version>${jetty.version}</version> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-servlet</artifactId> <version>${jetty.version}</version> </dependency> <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>${protobuf.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.eclipse.platform/org.eclipse.osgi --> <dependency> <groupId>org.eclipse.osgi</groupId> <artifactId>org.eclipse.osgi</artifactId> <version>3.9.1</version> </dependency> <dependency> <groupId>com.vendor.pm</groupId> <artifactId>pmrs</artifactId> <version>${pmrs.version}</version> </dependency> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>19.0</version> </dependency> <!-- Eos Runtime Services dependencies --> <dependency> <groupId>com.vendor.pm</groupId> <artifactId>eos-rs</artifactId> <version>4.2.9.4</version> <exclusions> <exclusion> <groupId>com.vendor.pm</groupId> <artifactId>pmrs</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <dependency> <groupId>net.sourceforge.jexcelapi</groupId> <artifactId>jxl</artifactId> <version>2.6.12</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-asl</artifactId> <version>1.9.0</version> </dependency> <dependency> <groupId>com.rackspace.apache</groupId> <artifactId>xerces2-xsd11</artifactId> <version>2.11.2</version> </dependency> <!-- ADDED TO AVOID THE SAX PARSER WARNINGS --> <dependency> <groupId>xalan</groupId> <artifactId>xalan</artifactId> <version>2.7.1</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.15</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.15</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/javax.xml.parsers/jaxp-api --> <dependency> <groupId>javax.xml.parsers</groupId> <artifactId>jaxp-api</artifactId> <version>1.4.5</version> <scope>test</scope> </dependency> <dependency> <groupId>com.vendor.eos.groupref</groupId> <artifactId>com.fja.eos.groupref.formula.lib</artifactId> <version>1.0.0.202005041335</version> </dependency> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>io.confluent</groupId> <artifactId>kafka-avro-serializer</artifactId> <version>5.5.1</version> </dependency> </dependencies>
openjdk version "1.8.0_402" OpenJDK Runtime Environment (build 1.8.0_402-b06) OpenJDK 64-Bit Server VM (build 25.402-b06, mixed mode)
NAME="Red Hat Enterprise Linux" VERSION="9.3 (Plow)" ID="rhel" ID_LIKE="fedora" VERSION_ID="9.3" PLATFORM_ID="platform:el9" PRETTY_NAME="Red Hat Enterprise Linux 9.3 (Plow)" ANSI_COLOR="0;31" LOGO="fedora-logo-icon" CPE_NAME="cpe:/o:redhat:enterprise_linux:9::baseos" HOME_URL="https://www.redhat.com/" DOCUMENTATION_URL="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9" BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_BUGZILLA_PRODUCT="Red Hat Enterprise Linux 9" REDHAT_BUGZILLA_PRODUCT_VERSION=9.3 REDHAT_SUPPORT_PRODUCT="Red Hat Enterprise Linux" REDHAT_SUPPORT_PRODUCT_VERSION="9.3" 5.15.145 x86_64 Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Address sizes: 48 bits physical, 48 bits virtual Byte Order: Little Endian CPU(s): 8 On-line CPU(s) list: 0-7 Vendor ID: AuthenticAMD Model name: AMD EPYC 7R13 Processor CPU family: 25 Model: 1 Thread(s) per core: 2 Core(s) per socket: 4 Socket(s): 1 Stepping: 1
Maven依赖冲突排查
- 执行
mvn dependency:tree分析依赖树,定位org.osgi.core-4.3.1.jar的引入来源(大概率是第三方依赖如eos-rs或pmrs的传递依赖) - 检查Maven依赖调解规则的生效差异:正常集群可能因依赖声明顺序、路径优先级优先加载了
org.eclipse.osgi-3.9.1,异常集群的依赖树可能发生了变化 - 在引入冲突依赖的第三方包中添加显式排除规则,确保仅保留
org.eclipse.osgi-3.9.1
- 执行
Docker镜像一致性验证
- 确认两个集群使用的镜像哈希值、标签完全一致,排除镜像版本差异
- 检查镜像构建时的Maven配置(settings.xml)是否一致,避免仓库源差异导致拉取不同依赖
- 尝试添加
--no-cache参数重新构建镜像,排除构建缓存带来的依赖残留问题
类加载与JVM配置检查
- 对比两个集群的JVM启动参数,查看CLASSPATH中JAR包的顺序是否存在差异,异常集群可能将
org.osgi.core-4.3.1.jar放在了优先级更高的位置 - 检查Eclipse OSGI启动配置文件(如
config.ini)是否一致,确认是否指定了框架实现类,避免JVM自动选择错误的FrameworkFactory实现
- 对比两个集群的JVM启动参数,查看CLASSPATH中JAR包的顺序是否存在差异,异常集群可能将
EKS集群环境差异排查
- 检查Pod的存储卷挂载权限与可写性,异常集群可能因无法写入配置/工作区目录导致框架初始化失败(需注意这可能是类加载错误的后续影响)
- 对比Pod的环境变量,确认是否存在影响OSGI初始化的系统属性配置差异
内容的提问来源于stack exchange,提问作者Marty Spallone

