搭建Struts2專案時,缺少commons-lang3-3.2.jar會導致應用啟動失敗、無法訪問首頁。本文解析該Jar在Struts2運行時的具體角色,並提供Struts 2.5.x的極簡必要依賴清單,避免盲目堆砌Jar包。
commons-lang3提供ObjectUtils、StringUtils、ArrayUtils、ClassUtils等工具類,被OGNL運行時(ognl.OgnlRuntime)頻繁呼叫。BeanUtils、ConvertUtils(來自commons-beanutils)內部依賴commons-lang3的ConstructorUtils、MethodUtils進行動態呼叫與轉型。HashCodeBuilder、EqualsBuilder、ToStringBuilder、SerializationUtils被Action、攔截器、結果類型廣泛使用。StringEscapeUtils(HTML/JSON/JS跳脫)、RandomStringUtils(Token生成)、WordUtils(首字大寫)等。Struts2啟動時會掃描struts.xml、建構Configuration物件、初始化ObjectFactory、ActionProxyFactory等核心組件。這過程中commons-lang3的ClassUtils.getClass(String)被用於類名字串解析為Class物件。若缺少該Jar,NoClassDefFoundError: org/apache/commons/lang3/ClassUtils會在Dispatcher.init()階段拋出,導致FilterDispatcher初始化失敗,所有請求回傳500或404。
<dependencies>
<!-- 核心 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.30</version>
</dependency>
<!-- 傳遞性依賴會自動拉入以下關鍵Jar,無需手動宣告 -->
<!-- commons-lang3-3.x (由struts2-core傳遞) -->
<!-- commons-fileupload-1.4 (檔案上傳) -->
<!-- commons-io-2.5 (IO工具) -->
<!-- ognl-3.2.x (表達式語言) -->
<!-- freemarker-2.3.x (預設模板引擎) -->
<!-- javassist-3.20.x (位元組碼操作) -->
<!-- xwork-core-2.5.x (命令模式核心) -->
</dependencies>
commons-lang-2.x(舊版,包名org.apache.commons.lang)與commons-lang3-3.x(新版,包名org.apache.commons.lang3),類別不會衝突,但StringUtils等工具類行為不同,易誤用。建議全專案統一用lang3。<scope>test</scope>或provided會導致運行時找不到類,務必設為compile(預設)。dependencyManagement鎖定版本,子模組不可省略artifactId,否則不會繼承。mvn dependency:tree | grep commons-lang3
# 應顯示 org.apache.commons:commons-lang3:3.x.x:compile
結論:commons-lang3是Struts2運行時的基礎設施級依賴,缺一不可。使用Maven/Gradle管理依賴,讓傳遞性依賴自動解析,比手動複製Jar穩健得多。