| 項目 | Maven 專案 | Eclipse Web 專案 |
|---|---|---|
| 編譯輸出 | target/classes | Build Path 指定資料夾(預設 bin) |
| Web 根目錄 | src/main/webapp | WebContent / WebRoot |
| 依賴 JAR | target/<artifactId>/WEB-INF/lib (package 後) | WebContent/WEB-INF/lib (手動/Build Path) |
Resin/Tomcat 等容器期望標準 Web 結構:WEB-INF/classes、WEB-INF/lib 位於 Web 根目錄下。Maven 預設結構與此不符,導致 Eclipse 直接啟動 Resin 失敗。
src/main/webapp/WEB-INF/classes。mvn war:exploded 或手動將 target/.../WEB-INF/lib 複製到 src/main/webapp/WEB-INF/lib。(建議用 maven-war-plugin 配置 webappDirectory 自動同步)。root-directory="src/main/webapp" 即可識別。優點:專案仍是純 Maven 結構,Eclipse 直接 Run/Debug,熱部署支援良好。
缺點:src/main/webapp 下產生編譯產物與複製 JAR,需加入 .gitignore;mvn clean 會清空 target 但不清理這裡,需額外腳本。
編輯 resin.conf 或 app-default.xml:
<host id="" root-directory=".">
<web-app id="/myapp" root-directory="D:/workspace/myapp/src/main/webapp" />
</host>
<class-loader>
<!-- 相對 webapp 根目錄向上三層到專案根目錄,再進 target -->
<compiling-loader path="../../../target/classes" />
<library-loader path="../../../target/myapp/WEB-INF/lib" />
</class-loader>
關鍵路徑計算:
webapp → main → src → project-root → target/classes → ../../../target/classes。
finalName (pom.xml <build><finalName>myapp</finalName>) 決定 WAR 展開資料夾名。
優點:不污染 src/main/webapp,Maven 結構純淨。
缺點:Resin 配置強耦合專案絕對路徑,團隊協作需統一路徑或用環境變數;熱部署偵測可能不如方案一靈敏。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
<configuration>
<webappDirectory>src/main/webapp</webappDirectory> <!-- 關鍵 -->
<warSourceDirectory>src/main/webapp</warSourceDirectory>
</configuration>
</plugin>
執行 mvn war:exploded 即自動將編譯類別與依賴 JAR 同步至 src/main/webapp/WEB-INF,配合方案一實現「Maven 命令構建 + Eclipse 直接啟動」無縫切換。
「本地開發用方案一(偽裝目錄),測試/生產環境嚴禁修改容器配置指向原始碼目錄,必須使用
mvn package產出標準 WAR 部署。」
src/main/webapp(方案一)。mvn clean package → 產出 target/myapp.war → 部署至獨立 Resin/Tomcat。root-directory 指向部署目錄(如 /opt/resin/webapps/myapp),class-loader 走預設 WEB-INF/classes、WEB-INF/lib。