Maven 是 Java 項目管理的標配,通過 tomcat7-maven-plugin(或 tomcat8/9-maven-plugin)可在無外部 Tomcat 安裝的情況下,實現「一鍵啟動、自動重載、編碼零配置」的開發體驗。本文從插件選型、核心配置、常用 Goal、亂碼根治、多環境隔離五個維度,輸出生產級最佳實踐。
| 插件 | GroupId | ArtifactId | 適用 Tomcat 版本 | 維護狀態 |
|---|---|---|---|---|
| tomcat7-maven-plugin | org.apache.tomcat.maven | tomcat7-maven-plugin | Tomcat 7.x | 維護模式 |
| tomcat8-maven-plugin | org.apache.tomcat.maven | tomcat8-maven-plugin | Tomcat 8.5.x | 維護模式 |
| tomcat9-maven-plugin | org.apache.tomcat.maven | tomcat9-maven-plugin | Tomcat 9.0.x | 活躍維護 |
| tomcat-maven-plugin (舊) | org.codehaus.mojo | tomcat-maven-plugin | Tomcat 6/7 | 已停止更新 |
建議:新項目優先 tomcat9-maven-plugin,Spring Boot 項目直接用 spring-boot-maven-plugin 內嵌容器。
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat9-maven-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<!-- 核心:解決 GET/POST 中文亂碼 -->
<uriEncoding>UTF-8</uriEncoding>
<!-- 應用上下文路徑:https://localhost:8080/myapp -->
<path>/myapp</path>
<!-- 端口 -->
<port>8080</port>
<!-- JVM 參數:開發機建議調大 -->
<jvmArgs>-Xms512m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m</jvmArgs>
<!-- 熱部署掃描間隔(秒),0 關閉 -->
<scanIntervalSeconds>3</scanIntervalSeconds>
<!-- 掃描目標:編譯輸出目錄 + web 資源 -->
<scanTargetPatterns>
<scanTargetPattern>
<directory>${project.build.directory}/classes</directory>
<includes>**/*.class</includes>
</scanTargetPattern>
<scanTargetPattern>
<directory>${project.basedir}/src/main/webapp</directory>
<includes>**/*.jsp,**/*.html,**/*.js,**/*.css</includes>
</scanTargetPattern>
</scanTargetPatterns>
<!-- 遠程部署認證(需 Tomcat manager 配置用戶) -->
<server>tomcat9</server>
<url>https://localhost:8080/manager/text</url>
<username>admin</username>
<password>admin</password>
</configuration>
<dependencies>
<!-- 引入項目依賴的 JDBC 驅動等,避免 ClassNotFound -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
</dependencies>
</plugin>
<uriEncoding>UTF-8</uriEncoding> 解決 GET 請求參數亂碼(Tomcat 8+ 默認已為 UTF-8,但顯式配置更穩妥)。web.xml 或 Spring CharacterEncodingFilter 設置 forceEncoding=true,解決 POST 表單亂碼。characterEncoding=utf8&useUnicode=true&serverTimezone=Asia/Shanghai。| Goal | 作用 | 典型場景 |
|---|---|---|
tomcat9:run | 啟動嵌入式 Tomcat 運行當前項目(阻塞) | 日常開發調試 |
tomcat9:run-war | 打包 WAR 並啟動 | 驗證 WAR 包結構 |
tomcat9:deploy | 部署 WAR 到遠程 Tomcat | 測試/生產環境部署 |
tomcat9:redeploy | 重新部署(先 undeploy 再 deploy) | CI/CD 流水線 |
tomcat9:start | 啟動 Tomcat(非阻塞) | 集成測試前啟動 |
tomcat9:stop | 停止 Tomcat | 測試後清理 |
tomcat9:undeploy | 卸載應用 | 版本回滾前清理 |
run → Create 'tomcat9:run'tomcat9:runStarted Tomcat Server 即可訪問 https://localhost:8080/myapp<profiles>
<profile>
<id>dev</id>
<activation><activeByDefault>true</activeByDefault></activation>
<properties>
<tomcat.port>8080</tomcat.port>
<tomcat.path>/myapp</tomcat.path>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<tomcat.port>8081</tomcat.port>
<tomcat.path>/myapp-test</tomcat.path>
</properties>
</profile>
</profiles>
<!-- 插件配置引用屬性 -->
<configuration>
<port>${tomcat.port}</port>
<path>${tomcat.path}</path>
</configuration>
啟動:mvn tomcat9:run -Ptest
<dependencies> 必須補全項目運行時依賴(JDBC、Redis 客戶端等),否則 ClassNotFoundException。scanTargetPatterns 包含 src/main/webapp,且 IDEA 設置 Build → Build Project Automatically + Compiler → Build process → Register native library。netstat -ano | findstr 8080 找 PID → taskkill /PID xxx /F。conf/tomcat-users.xml 配置 <role rolename="manager-script"/> <user username="admin" password="admin" roles="manager-script"/>。Maven Tomcat 插件讓「寫代碼 → 保存 → 瀏覽器刷新驗證」成為流暢閉環,配合 scanIntervalSeconds 熱掃描與 UTF-8 全鏈路編碼,是 Java Web 開發效率的基石配置。