从堆栈信息来看,这是一个典型的 `ExceptionInInitializerError` 异常,通常是因为静态初始化块或静态变量初始化时抛出了异常。以下是问题的逐步分析:
---
### 1. **核心异常**
最终的根本原因是:
```
Caused By: java.lang.IllegalArgumentException: Invalid version number: Version number may be negative or greater than 255
```
该异常发生在 `com.ibm.icu.util.VersionInfo.getInstance()` 方法中,表明 ICU(International Components for Unicode)库在解析版本号时遇到了非法值。
---
### 2. **异常传播路径**
异常从底层逐步向上抛出,具体传播路径如下:
#### (1) **ICU库内部问题**
- `com.ibm.icu.impl.ICUResourceBundle.
()` 静态初始化失败。
- 原因是 `VersionInfo.getInstance()` 方法接收到非法版本号,导致 `IllegalArgumentException`。
#### (2) **Spring Bean初始化失败**
- Spring 在尝试实例化 `AgentBatchImportAction` 类时失败。
- 失败的原因是 `AgentBatchImportAction` 的构造函数中依赖了某些需要 ICU 库的功能,而 ICU 库的初始化已经失败。
#### (3) **Web应用启动失败**
- Web 应用的上下文初始化监听器 `WebApplicationContextInitListener` 在初始化 Spring 应用上下文时失败。
- 导致整个应用无法正常启动。
---
### 3. **可能的原因**
根据堆栈信息和异常描述,以下是可能的原因:
#### (1) **ICU库版本冲突**
- 系统中可能存在多个版本的 ICU 库,导致加载时出现版本号冲突。
- 检查项目的依赖树,确认是否有重复的 ICU 库版本。
#### (2) **环境配置问题**
- 如果使用的是 WebLogic 容器,可能是容器自带的 ICU 库与项目中的 ICU 库版本不兼容。
- 检查 WebLogic 的类加载策略,确保项目依赖的 ICU 库优先于容器自带的库加载。
#### (3) **资源文件损坏**
- ICU 库依赖的资源文件(如 `.dat` 文件)可能损坏或缺失。
- 检查 ICU 库的资源文件是否完整。
#### (4) **系统属性问题**
- ICU 库可能会读取系统属性来确定版本号。
- 如果系统属性被错误配置,可能导致版本号解析失败。
- 检查 JVM 启动参数中是否设置了与 ICU 相关的系统属性。
---
### 4. **解决方案**
根据上述原因,可以尝试以下解决方法:
#### (1) **检查依赖冲突**
- 使用工具(如 Maven 的 `dependency:tree` 或 Gradle 的 `dependencies`)检查项目中是否存在多个版本的 ICU 库。
- 确保只保留一个正确的 ICU 版本。
#### (2) **调整类加载策略**
- 如果使用 WebLogic 容器,可以通过 `weblogic.xml` 配置文件设置类加载策略,确保项目依赖的 ICU 库优先加载。
- 示例配置:
```xml
com.ibm.icu.*
```
#### (3) **验证资源文件完整性**
- 检查 ICU 库的资源文件是否完整。
- 如果资源文件损坏,重新下载或替换 ICU 库。
#### (4) **检查系统属性**
- 检查 JVM 启动参数中是否设置了与 ICU 相关的系统属性。
- 如果设置了错误的属性,移除或修正这些属性。
#### (5) **升级 ICU 库**
- 如果问题仍然存在,考虑升级 ICU 库到最新版本,以修复潜在的 Bug。
---
### 5. **总结**
此问题的根本原因是 ICU 库在初始化时遇到非法版本号,导致静态初始化失败,并进一步影响了 Spring Bean 的创建和 Web 应用的启动。通过检查依赖冲突、调整类加载策略、验证资源文件完整性以及检查系统属性,可以有效定位并解决问题。