最省事的方式是用maven引入commons-lang3:在pom.xml中添加org.apache.commons:commons-lang3:3.12.0(java 8+),避免混用不兼容的commons-lang旧版。

用 Maven 引入 commons-lang3 最省事
绝大多数 Java 项目现在都用 Maven 管理依赖,直接在 pom.xml 里加一行就能用上 StringUtils、ObjectUtils 这些高频工具类。
别去官网下 jar 包手动丢进 lib 目录——容易漏依赖、版本冲突、IDE 不识别,新手最常在这一步卡半天。
- 确认你用的是 Java 8+,就选
org.apache.commons:commons-lang3:3.12.0(或更高3.x版) -
commons-lang(无 3)是老版,只支持 Java 7,和lang3不兼容,别混用 - 如果项目里已有旧版
commons-lang,Maven 会报ClassNotFoundException或方法找不到,得全换成lang3的包路径:org.apache.commons.lang3.*
非 Maven 项目怎么加 commons-collections4
老系统或教学场景可能还在用 Ant 或纯 JDK 编译,这时候得自己管 jar 包和 classpath。
重点不是“怎么下载”,而是“加进去之后为什么还是报 NoClassDefFoundError”——90% 是因为没把依赖链补全。
立即学习“Java免费学习笔记(深入)”;
- 下载的
commons-collections4-4.4.jar本身不依赖其他 commons 模块,但如果你用了commons-beanutils,它又依赖collections4和logging,漏一个就炸 - 运行时用
java -cp "lib/*" MyApp,注意*在 Windows 和 Linux 下行为一致,但某些旧版 JDK 不支持,得展开写全路径 - IDE 中右键项目 → Build Path → Add External JARs 后,务必检查 Package Explorer 里是否真出现在 “Referenced Libraries” 下,有时只是加了但没生效
commons-io 的 FileUtils.copyFile() 容易踩内存坑
这函数看着简单,但大文件复制时可能 OOM,尤其在容器或低配机器上跑批处理任务。
根本原因:默认内部用 byte[8192] 缓冲,但没做流式分块控制,整个文件读进内存再写出去——和你手写 Files.copy() 差不多,但封装层藏得太深,容易误判。
- 复制超 100MB 文件前,先用
FileUtils.copyFile(InputStream, OutputStream)自己控缓冲大小,比如每次读64KB -
FileUtils.readFileToByteArray()也同理,别对日志文件或上传临时文件直接调这个,改用Files.readAllLines()或流式解析 - Java 7+ 推荐优先用标准库:
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING),更轻量、异常语义清晰、支持符号链接
多个 Commons 模块共存时的类加载冲突
当项目同时用到 commons-compress、commons-text、commons-configuration2,且版本不统一,ClassNotFoundException 或 LinkageError 就开始随机出现。
这不是代码写错了,是类加载器从不同 jar 里加载了同名类(比如都含 org.apache.commons.logging.Log),但签名不一致。
- Maven 执行
mvn dependency:tree -Dverbose,搜commons-logging或commons-codec,看有没有多版本被拉进来 - 用
<exclusions></exclusions>干掉传递依赖里的旧版,例如commons-httpclient常偷偷带commons-codec:1.3,得排除后单独引1.15 - Tomcat 等容器自带部分 Commons 类(如
commons-el),WEB-INF/lib 里再放一遍会导致IllegalAccessError,得确认容器版本并调整打包策略
真正麻烦的不是加不进去,是加进去之后哪天某个接口行为变了——比如 commons-text 1.10 把 StringSubstitutor 的默认变量前缀从 $ 改成 ${,线上模板突然不解析了,这种细节翻 release note 都得瞪眼找半天。











