java.lang.NoClassDefFoundError: org/apache/commons/lang/text/StrLookup解决过程

本文详细解析了java.lang.NoClassDefFoundError与java.lang.ClassNotFoundException的区别,分享了一次解决NoClassDefFoundError异常的实际经验,特别是针对org.apache.commons.lang.text.StrLookup类未找到的问题,揭示了公司私仓中jar包路径不匹配导致的运行时错误,并提供了解决方案。

前言:

今天在拉新项目后启动时出现如下异常:

java.lang.NoClassDefFoundError: org/apache/commons/lang/text/StrLookup

首先

先搞清楚java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError的主要区别

ClassNotFoundExceptionNoClassDefFoundError
发生在JVM动态运行时发生在编译时

NoClassDefFoundError发生在JVM在动态运行时,根据你提供的类名,在classpath中找到对应的类进行加载,但当它找不到这个类时,就发生了java.lang.NoClassDefFoundError的错误,而ClassNotFoundException是在编译的时候在classpath中找不到对应的类而发生的错误。ClassNotFoundException比NoClassDefFoundError容易解决,是因为在编译时我们就知道错误发生,并且完全是由于环境的问题导致。


网上诸多方法均是说没有commons-lang的pom依赖,没有其他解决方式。如果是由于该原因的话,那么在编译工程就会报ClassNotFoundException异常而不是NoClassDefFoundError。

而后又怀疑是否是包冲突,导致在运行时想调用这个类的方法或者访问这个类的静态成员的时候不知道调用哪一个。排除后发现非此原因。

最后解压出commons-lang-2.6.jar,发现其中的包路径不是org\apache\commons\lang\,WTF?直接导致运行时使用该jar包下某个类时根据路径找不到。出现这个的原因是在公司私仓这个包被替换咯,我又把它拉下来了。。。

最后把正确的jar包替换后成功解决。

 

 

 

commons-lang3.3.1.jar、Apache Commons包中的一个,包含了一些数据类型工具类,是java.lang.*的扩展。必须使用的jar包。为JRE5.0+的更好的版本所提供 Jar文件包含的类: META-INF/MANIFEST.MFMETA-INF/LICENSE.txtMETA-INF/NOTICE.txtorg.apache.commons.lang.ArrayUtils.class org.apache.commons.lang.BitField.class org.apache.commons.lang.BooleanUtils.class org.apache.commons.lang.CharEncoding.class org.apache.commons.lang.CharRange.class org.apache.commons.lang.CharSet.class org.apache.commons.lang.CharSetUtils.class org.apache.commons.lang.CharUtils.class org.apache.commons.lang.ClassUtils.class org.apache.commons.lang.Entities$ArrayEntityMap.class org.apache.commons.lang.Entities$BinaryEntityMap.class org.apache.commons.lang.Entities$EntityMap.class org.apache.commons.lang.Entities$HashEntityMap.class org.apache.commons.lang.Entities$LookupEntityMap.class org.apache.commons.lang.Entities$MapIntMap.class org.apache.commons.lang.Entities$PrimitiveEntityMap.class org.apache.commons.lang.Entities$TreeEntityMap.class org.apache.commons.lang.Entities.class org.apache.commons.lang.IllegalClassException.class org.apache.commons.lang.IncompleteArgumentException.class org.apache.commons.lang.IntHashMap$Entry.class org.apache.commons.lang.IntHashMap.class org.apache.commons.lang.LocaleUtils.class org.apache.commons.lang.NotImplementedException.class org.apache.commons.lang.NullArgumentException.class org.apache.commons.lang.NumberRange.class org.apache.commons.lang.NumberUtils.class org.apache.commons.lang.ObjectUtils$Null.class org.apache.commons.lang.ObjectUtils.class org.apache.commons.lang.RandomStringUtils.class org.apache.commons.lang.SerializationException.class org.apache.commons.lang.SerializationUtils.class org.apache.commons.lang.StringEscapeUtils.class org.apache.commons.lang.StringUtils.class org.apache.commons.lang.SystemUtils.class org.apache.commons.lang.UnhandledException.class org.apache.commons.lang.Validate.class org.apache.commons.lang.WordUtils.class org.apache.commons.lang.builder.CompareToBuilder.class org.apache.commons.lang.builder.EqualsBuilder.class org.apache.commons.lang.builder.HashCodeBuilder.class org.apache.commons.lang.builder.ReflectionToStringBuilder$1.class org.apache.commons.lang.builder.ReflectionToStringBuilder.class org.apache.commons.lang.builder.StandardToStringStyle.class org.apache.commons.lang.builder.ToStringBuilder.class org.apache.commons.lang.builder.ToStringStyle$DefaultToStringStyle.class org.apache.commons.lang.builder.ToStringStyle$MultiLineToStringStyle.class org.apache.commons.lang.builder.ToStringStyle$NoFieldNameToStringStyle.class org.apache.commons.lang.builder.ToStringStyle$ShortPrefixToStringStyle.class org.apache.commons.lang.builder.ToStringStyle$SimpleToStringStyle.class org.apache.commons.lang.builder.ToStringStyle.class org.apache.commons.lang.enum.Enum$Entry.class org.apache.commons.lang.enum.Enum.class org.apache.commons.lang.enum.EnumUtils.class org.apache.commons.lang.enum.ValuedEnum.class org.apache.commons.lang.enums.Enum$Entry.class org.apache.commons.lang.enums.Enum.class org.apache.commons.lang.enums.EnumUtils.class org.apache.commons.lang.enums.ValuedEnum.class org.apache.commons.lang.exception.ExceptionUtils.class org.apache.commons.lang.exception.Nestable.class org.apache.commons.lang.exception.NestableDelegate.class org.apache.commons.lang.exception.NestableError.class org.apache.commons.lang.exception.NestableException.class org.apache.commons.lang.exception.NestableRuntimeException.class org.apache.commons.lang.math.DoubleRange.class org.apache.commons.lang.math.FloatRange.class org.apache.commons.lang.math.Fraction.class org.apache.commons.lang.math.IntRange.class org.apache.commons.lang.math.JVMRandom.class org.apache.commons.lang.math.LongRange.class org.apache.commons.lang.math.NumberRange.class org.apache.commons.lang.math.NumberUtils.class org.apache.commons.lang.math.RandomUtils.class org.apache.commons.lang.math.Range.class org.apache.commons.lang.mutable.Mutable.class org.apache.commons.lang.mutable.MutableBoolean.class org.apache.commons.lang.mutable.MutableByte.class org.apache.commons.lang.mutable.MutableDouble.class org.apache.commons.lang.mutable.MutableFloat.class org.apache.commons.lang.mutable.MutableInt.class org.apache.commons.lang.mutable.MutableLong.class org.apache.commons.lang.mutable.MutableObject.class org.apache.commons.lang.mutable.MutableShort.class org.apache.commons.lang.text.CompositeFormat.class org.apache.commons.lang.text.StrBuilder$StrBuilderReader.class org.apache.commons.lang.text.StrBuilder$StrBuilderTokenizer.class org.apache.commons.lang.text.StrBuilder$StrBuilderWriter.class org.apache.commons.lang.text.StrBuilder.class org.apache.commons.lang.text.StrLookup$MapStrLookup.class org.apache.commons.lang.text.StrLookup.class org.apache.commons.lang.text.StrMatcher$CharMatcher.class org.apache.commons.lang.text.StrMatcher$CharSetMatcher.class org.apache.commons.lang.text.StrMatcher$NoMatcher.class org.apache.commons.lang.text.StrMatcher$StringMatcher.class org.apache.commons.lang.text.StrMatcher$TrimMatcher.class org.apache.commons.lang.text.StrMatcher.class org.apache.commons.lang.text.StrSubstitutor.class org.apache.commons.lang.text.StrTokenizer.class org.apache.commons.lang.time.DateFormatUtils.class org.apache.commons.lang.time.DateUtils$DateIterator.class org.apache.commons.lang.time.DateUtils.class org.apache.commons.lang.time.DurationFormatUtils$Token.class org.apache.commons.lang.time.DurationFormatUtils.class org.apache.commons.lang.time.FastDateFormat$CharacterLiteral.class org.apache.commons.lang.time.FastDateFormat$NumberRule.class org.apache.commons.lang.time.FastDateFormat$PaddedNumberField.class org.apache.commons.lang.time.FastDateFormat$Pair.class org.apache.commons.lang.time.FastDateFormat$Rule.class org.apache.commons.lang.time.FastDateFormat$StringLiteral.class org.apache.commons.lang.time.FastDateFormat$TextField.class org.apache.commons.lang.time.FastDateFormat$TimeZoneDisplayKey.class org.apache.commons.lang.time.FastDateFormat$TimeZoneNameRule.class org.apache.commons.lang.time.FastDateFormat$TimeZoneNumberRule.class org.apache.commons.lang.time.FastDateFormat$TwelveHourField.class org.apache.commons.lang.time.FastDateFormat$TwentyFourHourField.class org.apache.commons.lang.time.FastDateFormat$TwoDigitMonthField.class org.apache.commons.lang.time.FastDateFormat$TwoDigitNumberField.class org.apache.commons.lang.time.FastDateFormat$TwoDigitYearField.class org.apache.commons.lang.time.FastDateFormat$UnpaddedMonthField.class org.apache.commons.lang.time.FastDateFormat$UnpaddedNumberField.class org.apache.commons.lang.time.FastDateFormat.class org.apache.commons.lang.time.StopWatch.class
<think>嗯,用户遇到了Java中的NoClassDefFoundError错误,具体是缺少org/apache/commons/lang/text/StrLookup类。这属于典型的类加载失败问题,需要系统分析。 用户提供的引用资料很有价值,特别是引用[5]直接提到sqoop报错时通过复制commons-lang解决的案例。不过StrLookup属于commons-lang.text子包,需要更精确的定位。 首先考虑版本兼容性问题。StrLookupcommons-lang 2.x版本中存在,但3.x版本进行了包结构调整。观察到错误信息中的包路径是"org/apache/commons/lang/text",而3.x版本改为"org/apache/commons/lang3/text",这说明用户使用的库版本可能是2.x。 依赖冲突的可能性也不能排除。比如Maven项目中可能存在多个版本的commons-lang,导致类加载器选择了错误版本。需要检查依赖树,使用mvn dependency:tree命令查看是否有版本冲突。 运行时类路径缺失是最直接的原因。用户可能忘记将commons-lang的JAR文件放入lib目录,或者构建工具没有正确打包。参考引用[2][5]的解决方案,应该检查物理文件是否存在。 解决方案将分层次给出:先确保基础依赖存在,再处理复杂情况。优先推荐Maven/Gradle的依赖管理方式,同时保留手动添加JAR的方案。对于版本升级,需要提醒用户注意API变更风险。 相关问题设计覆盖了依赖管理工具对比、冲突解决技巧和日志分析,这些都是排查NoClassDefFoundError的延伸知识。特别是"依赖仲裁"这个概念,对使用Maven的用户很重要。</think>### Java.lang.NoClassDefFoundError: org/apache/commons/lang/text/StrLookup 分析与解决 #### 错误原因分析 1. **缺失依赖库**(核心原因) 项目缺少 Apache Commons Lang 库(特别是 `commons-lang-2.x.jar`),或使用了不兼容的版本(如 Commons Lang 3.x)。错误中的 `org/apache/commons/lang/text/` 路径表明需要 **2.x 版本**(3.x 的包路径为 `org/apache/commons/lang3/text/`)[^5]。 2. **依赖冲突** 若项目使用 Maven/Gradle,可能存在多个版本的 Commons Lang 库,导致 JVM 加载了错误的版本(例如依赖仲裁选中了 3.x,但代码需 2.x)[^3]。 3. **类路径未正确配置** JAR 文件未放入部署环境的 `lib` 目录,或 IDE 中未添加到构建路径(如 Eclipse 的 `Referenced Libraries`)[^2][^5]。 --- #### 解决方案 ##### 方法 1:添加正确版本的依赖库(推荐) - **Maven 项目**(`pom.xml`): ```xml <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> <!-- 或 2.5/2.4 --> </dependency> ``` - **Gradle 项目**(`build.gradle`): ```gradle implementation 'commons-lang:commons-lang:2.6' ``` - **手动添加 JAR**: 下载 [commons-lang-2.6.jar](https://repo1.maven.org/maven2/commons-lang/commons-lang/2.6/) 并放入项目的 `lib` 目录(非 Web 项目)或 `WEB-INF/lib`(Web 项目)[^5]。 ##### 方法 2:解决依赖冲突 1. 检查依赖树: ```bash mvn dependency:tree | grep commons-lang ``` 2. 排除冲突版本(若存在 3.x): ```xml <dependency> <groupId>some.group</groupId> <artifactId>some-artifact</artifactId> <version>X.Y.Z</version> <exclusions> <exclusion> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <!-- 排除3.x --> </exclusion> </exclusions> </dependency> ``` ##### 方法 3:检查运行时类路径 - 确保部署包(如 WAR/JAR)中包含 `commons-lang-2.x.jar`。 - 服务器环境(如 Tomcat)需确认 JAR 位于 `lib` 目录[^4]。 --- #### 验证步骤 1. 清理并重新构建项目(如 `mvn clean install`)。 2. 检查生成的 `target/*.jar` 或 `WEB-INF/lib` 是否包含正确版本的 JAR。 3. 启动应用,确认错误消失。 > **关键提示**:Commons Lang 3.x 与 2.x **不兼容**。若依赖库强制要求 3.x,需修改代码:将 `org.apache.commons.lang` 替换为 `org.apache.commons.lang3`[^5]。 --- ### 相关问题 1. **如何区分 `NoClassDefFoundError` 和 `ClassNotFoundException`?** `ClassNotFoundException` 是类加载器主动查找类失败;`NoClassDefFoundError` 是 JVM 已尝试加载类但依赖缺失(如静态初始化失败)[^2]。 2. **Maven 依赖冲突的快速解决技巧有哪些?** 使用 `mvn dependency:tree` 定位冲突源,结合 `<exclusions>` 排除旧版本,或用 `mvn dependency:analyze` 检测未声明的依赖。 3. **Web 项目中如何确保依赖库被正确加载?** 部署时检查 `WEB-INF/lib` 是否包含所有依赖 JAR,避免服务器全局 `lib` 目录的版本覆盖(如 Tomcat 的 `catalina.jar` 冲突)[^4]。 4. **升级到 Commons Lang 3.x 需要注意什么?** 需修改代码中的包路径(`lang` → `lang3`),部分工具类如 `StringUtils` 的方法签名有变更,需测试兼容性。 5. **如何通过日志定位缺失的依赖?** 启用 JVM 调试参数: ```bash java -verbose:class -jar your_app.jar ``` 日志将输出加载的类路径,明确缺失类的加载时机[^3]。 --- [^1]: [java.lang.NoClassDefFoundError: org/apache/commons/collections/MapUtils](https://github.com/fabric8io/kubernetes-client/issues/1495) [^2]: [Exception in thread "main" java.lang.NoClassDefFoundError](https://blog.csdn.net/BugNest/article/details/125200498) [^3]: [java.lang.NoClassDefFoundError: redis/clients/jedis/JedisPool](https://stackoverflow.com/questions/74982724) [^4]: [解决 Caused by: java.lang.NoClassDefFoundError: org/apache/commons/httpclient/HttpMethod](https://cloud.tencent.com/developer/article/1787280) [^5]: [sqoop报错java.lang.NoClassDefFoundError:org/apache/commons/lang/StringUtils](https://blog.csdn.net/weixin_45525272/article/details/126290500)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值