微服務或多模塊單體中,前端公共資源(jQuery、EasyUI、組件庫、公共 CSS/JS)往往散落在每個 WAR 包裡。組件升級、Bug 修復時,前端需在 N 個項目重複改動、測試、打包,極易遺漏且版本難統一。本文系統梳理三種主流共享方案,從構建層到部署層層層遞進。
將 src/main/resources/static 目錄剝離為獨立 Maven 模塊 common-static,打成 JAR 發布到私有 Nexus,各 WAR 依賴該 JAR,通過 Spring MVC mvc:resources 映射 classpath:/static/ 實現訪問。
src/main/resources/staticdistributionManagement 指向私服,mvn deploy 自動發布<dependency>
<groupId>cn.codestory.research</groupId>
<artifactId>common-static</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<mvc:resources mapping="/static/**" location="classpath:/static/"/>
<script src="/static/javascript/framework/jquery.min.js"></script>src/main/resources/static,優先級高於 JAR(ClassLoader 順序)src/main/webapp/static 不想遷移?雙路徑映射:location="classpath:/static/,/static/"| 優點 | 缺點 |
|---|---|
| 無需變更部署架構,開發體驗無感 | 需維護私有 Maven 倉庫 |
| 版本號控制升級節奏,灰度發布友好 | 修改涉及面廣,需嚴格測試 |
| 構建產物自包含,無外部運行時依賴 | JAR 過大影響構建/啟動速度 |
static.war 部署於專用 Tomcat/HTTP Server/static/** → Static Server;Host: app1.xxx → App Server 1server {
listen 80;
server_name app1.codestory.cn;
location /static/ {
proxy_pass https://static-server/;
}
location / {
proxy_pass https://app-server-1/;
}
}
static.codestory.cn<script src="https://static.codestory.cn/static/...jquery.min.js">| 團隊/項目階段 | 推薦方案 | 核心理由 |
|---|---|---|
| 初創/中小/單體模塊化初期 | 方案一(JAR) | 零運維成本,快速見效 |
| 微服務成熟/多團隊並行/高可用要求 | 方案二(Nginx+Static WAR) | 架構清晰,職責分離,支援獨立演進 |
| 高併發/全球化/極致體驗/預算充足 | 方案三(CDN) | 就近訪問,帶寬優化,抗 DDoS 能力強 |
Cache-Control: max-age=31536000, immutable),文件名帶 Hash 實現無緩存更新沒有銀彈,只有最適合當前階段的選擇。建議從方案一起步,隨業務增長平滑演進至方案二、三。