Struts2 版本眾多,依賴傳遞關係複雜,版本不匹配是導致 404、ClassNotFound、NoSuchMethodError 的首因。本文整理兩個主流版本系的必備 JAR 清單,並給出 Maven 依賴最佳實踐,告別手動導包地獄。
此版本開始引入 commons-io、commons-lang3、javassist 三個新強依賴,缺一不可。
| JAR 包 | 版本 | 作用 |
|---|---|---|
| struts2-core | 2.3.4.1 | 核心控制器、攔截器、結果類型 |
| xwork-core | 2.3.4.1 | 命令模式核心,ActionInvocation、ValueStack |
| ognl | 3.0.5 | 表達式語言,屬性訪問、類型轉換 |
| freemarker | 2.3.19 | UI 標籤模板引擎 |
| commons-logging | 1.1.1 | 日志門面 |
| commons-fileupload | 1.2.2 | 文件上傳解析 |
| commons-io | 2.0.1 | IO 流擴展(2.3.x 新增) |
| commons-lang3 | 3.1 | lang 工具類增強(2.3.x 新增) |
| javassist | 3.11.0.GA | 字節碼操作,動態代理(2.3.x 新增) |
早期版本依賴較少,但 ognl、freemarker 版本較低,與新版不兼容。
| JAR 包 | 版本示例 | 作用 |
|---|---|---|
| struts2-core | 2.0.11.1 | 核心 |
| xwork | 2.0.4 | 核心 |
| ognl | 2.6.9 | 表達式語言 |
| freemarker | 2.3.8 | 模板引擎 |
| commons-logging | 1.0.4 | 日志 |
| commons-fileupload | 1.1.1 | 文件上傳 |
只聲明 struts2-core,其餘由傳遞依賴自動引入,版本由 Struts 官方 BOM 統一管理。
<properties>
<struts2.version>2.3.37</struts2.version> <!-- 或 2.5.28 等 -->
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-bom</artifactId>
<version>${struts2.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
</dependency>
<!-- 可選:約定優於配置插件 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
</dependency>
<!-- 可選:JSON 插件 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-json-plugin</artifactId>
</dependency>
</dependencies>
ognl-3.x 與 struts2-core-2.0.x → NoSuchMethodError。ClassNotFoundException: javassist.ClassPool。commons-lang3(包名 org.apache.commons.lang3),舊代碼用 commons-lang(org.apache.commons.lang)需遷移。WEB-INF/lib 而非 Tomcat lib 目錄,避免多應用版本衝突。commons-lang3、javassist 依賴,再考慮 2.5.x(需關注 DTD、攔截器棧、標籤庫變更)。