JSP 首次請求經歷:**翻譯 → 編譯 → 載入 → 執行**。首訪用戶感知明顯延遲(數百毫秒至秒級),叢集環境下每節點重複編譯放大問題。生產環境**必須**將編譯前置至建構/部署階段,實現「零首訪延遲」。
| 方案 | 原理 | 優點 | 缺點 | 推薦度 |
|---|---|---|---|---|
| 實際請求預熱 | 腳本/工具遍歷所有 JSP URL 觸發編譯 | 無需額外工具 | 叢集難覆蓋、負載均衡器導致節點遺漏、重啟需重跑、耗時不可控 | ⭐ (不推薦) |
| 容器聲明式預編譯 | WebLogic <jsp-descriptor><precompile>true</precompile> 啟動時編譯 | 配置簡單、無腳本維護 | 鎖定特定容器、啟動時間大幅增加、動態 JSP 不支援 | ⭐⭐ |
| 命令行工具預編譯 (jspc) | 建構階段離線編譯生成 Servlet 類,打包進 WAR | 容器無關、可整合 CI/CD、支援增量編譯、生產零編譯開銷 | 需維護建構腳本、JSP 語法錯誤提前暴露(其實是優點) | ⭐⭐⭐⭐⭐ (強推) |
<!-- Maven JspC Plugin -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat-jspc-maven-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<id>jspc</id>
<phase>compile</phase>
<goals><goal>compile</goal></goals>
</execution>
</executions>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
生成的 Servlet 類打包進 WEB-INF/classes,web.xml 自動註冊 <servlet><servlet-name>...</servlet> 映射。
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-jspc-maven-plugin</artifactId>
<version>9.4.x</version>
<executions>
<execution>
<id>jspc</id>
<goals><goal>compile</goal></goals>
</execution>
</executions>
</plugin>
內建 Undertow JSPC,Maven Profile 啟用:mvn package -Pjspc。
web.xml 設定 org.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=true、development=false。WEB-INF/web.xml 含預編譯 Servlet 定義,無 JspServlet 處理 *.jsp。