java.lang.ClassNotFoundException: com.google.common.base.MoreObjects

在使用SpringCloud和Swagger 2.7.0时遇到项目无法启动的问题,错误提示为java.lang.ClassNotFoundException:com.google.common.base.MoreObjects。通过将guava-19.0.jar放置到JAVA_HOME/jre/lib/ext目录下,成功解决了类加载问题。

前几天搞一个SpringCloud,配置swagger,用swagger2.7.0无法成功启动项目,一直报java.lang.ClassNotFoundException: com.google.common.base.MoreObjects,快被搞疯了。最后在网上搜到一篇文章,解决了。(我这找不到guava-r09.jar,只有guava-19.0.jar,按照博主的方法放到jre/lib/ext中,就能成功启动了)。先留个坑,以后有时间再来研究一下。原文如下:

报这个错com/google/common/base/MoreObjects原因是缺少包,但是我项目里是有的啊,然后找到了JAVA_HOME目录下的/jre/lib/ext目录下,里面没有这个包,于是把guava-19.0.jar,和guava-r09.jar CP到这个目录下,顺利搞定,做一个记录,以免再掉坑里。记得Grpc都是依赖于java编译环境,类加载时ExtClassLoader会加载jre/lib/ext里面的jar。
--------------------- 
作者:weixin_41520990 
来源:优快云 
原文:https://blog.youkuaiyun.com/weixin_41520990/article/details/79892566 
版权声明:本文为博主原创文章,转载请附上博文链接!

<think>我们遇到了一个特定的ClassNotFoundException:`java.lang.ClassNotFoundException: org.apache.poi.common.Duplicatable`。这个异常通常发生在使用Apache POI库时,尤其是在版本不兼容或依赖缺失的情况下。根据引用[3]和引用[4]的类似问题,我们可以推断出这可能是由于POI库的版本问题或缺少必要的依赖项。 ### 问题分析 `org.apache.poi.common.Duplicatable`是Apache POI 4.0及以上版本中引入的接口。这个异常表明: 1. 项目中使用的EasyPOI或直接依赖的Apache POI版本较高(>=4.0),但运行时缺少对应的POI依赖。 2. 或者,项目中的POI依赖版本不统一,部分模块版本较低,没有含这个类。 ### 解决方案 #### 1. **检查并统一POI依赖版本** 在项目的构建文件(如Maven的pom.xml)中,确保所有POI相关依赖使用**相同的版本**(推荐4.0.0以上)。根据引用[3],4.0.0版本引入了`getCellType()`方法的变更,而`Duplicatable`接口也是在这个版本之后引入的。 ```xml <properties> <poi.version>5.2.3</poi.version> <!-- 使用较新稳定版本 --> </properties> <dependencies> <!-- Apache POI 核心 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>${poi.version}</version> </dependency> <!-- POI OOXML --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>${poi.version}</version> </dependency> <!-- POI 模式(可选,但推荐) --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>${poi.version}</version> </dependency> </dependencies> ``` #### 2. **排除冲突的旧版本POI** 如果项目中其他依赖(如EasyPOI)引入了低版本POI,需要在依赖中排除它们: ```xml <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>4.4.0</version> <exclusions> <!-- 排除EasyPOI自带的低版本POI --> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> </exclusion> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> </exclusion> </exclusions> </dependency> ``` #### 3. **添加`commons-collections4`依赖(如果缺失)** 引用[2]和[4]指出,缺少`commons-collections4`也会导致类似异常。虽然本错误不是直接关于`ListValuedMap`,但高版本POI可能间接依赖它: ```xml <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.4</version> </dependency> ``` #### 4. **清理并重新构建项目** 执行Maven命令清理并重新下载依赖: ```bash mvn clean install -U ``` ### 验证步骤 1. 使用`mvn dependency:tree`检查依赖树,确认没有低版本POI残留: ```bash mvn dependency:tree -Dincludes=org.apache.poi ``` 2. 在IDE中检查项目依赖,确保`org.apache.poi.common.Duplicatable`类存在于`poi-XXX.jar`中。 ### 补充说明 - **EasyPOI兼容性**:EasyPOI 4.4.0支持POI 5.2.3,但需按上述方式排除旧版本[^1]。 - **Java版本要求**:POI 5.x需要Java 8或更高版本。 > 通过统一POI版本和排除冲突依赖,99%的`ClassNotFoundException`问题可解决。若仍存在问题,检查项目类加载机制(如Tomcat的lib目录是否有旧jar)[^3]。 §§相关问题§§ 1. 如何解决EasyPOI导出Excel时出现的`NoClassDefFoundError`错误? 2. Apache POI不同版本之间的主要API变化有哪些? 3. 在Spring Boot项目中如何正确配置EasyPOI依赖?</think>### 解决 `java.lang.ClassNotFoundException: org.apache.poi.common.Duplicatable` 错误 该异常是由于 **Apache POI 版本冲突或依赖缺失** 导致的,常见于 EasyPoi 与 POI 库版本不兼容的场景。以下是完整解决方案: --- #### 1. **添加缺失的依赖(核心解决)** 在 `pom.xml` 中添加以下依赖: ```xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.2.3</version> <!-- 必须 ≥5.0.0 --> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.3</version> </dependency> ``` - `Duplicatable` 接口在 **POI 5.0.0+** 引入[^3] - 低版本 POI(如 3.x)无此接口 --- #### 2. **统一 POI 版本(解决冲突)** 检查依赖树,排除旧版本 POI: ```bash mvn dependency:tree | grep poi ``` 在 `pom.xml` 中强制统一版本: ```xml <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>4.4.0</version> <exclusions> <!-- 排除旧版 POI --> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> </exclusion> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> </exclusion> </exclusions> </dependency> ``` --- #### 3. **补充 commons-collections4 依赖** 部分 POI 功能依赖集合库: ```xml <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.4</version> <!-- 引用[2][4]问题解法 --> </dependency> ``` --- #### 4. **验证依赖配置** 最终 `pom.xml` 应含: ```xml <dependencies> <!-- EasyPOI --> <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-base</artifactId> <version>4.4.0</version> <exclusions> <exclusion> <groupId>org.apache.poi</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> <!-- 统一POI版本 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>5.2.3</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>5.2.3</version> </dependency> <!-- 辅助依赖 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.4</version> </dependency> </dependencies> ``` --- #### 5. **清理并重建项目** ```bash mvn clean install -U # 强制更新依赖 ``` > **关键点**:`Duplicatable` 是 POI 5.x 新增接口,必须确保所有模块使用 **POI ≥5.0.0** 且版本统一[^3][^4]。 --- ### 其他可能原因 | 问题现象 | 解决方案 | |---------|---------| | 服务器未更新依赖 | 重启应用服务器,清理缓存 | | IDE 缓存未更新 | 执行 `mvn clean` 并重启 IDE | | 多模块依赖冲突 | 在主 `pom.xml` 的 `<dependencyManagement>` 中统一版本 | > 通过以上步骤可解决 99% 的 `ClassNotFoundException` 问题。若仍报错,使用 `mvn dependency:tree` 检查隐藏的旧版本 POI 依赖。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值