mvn package 默認只使用 單線程 來執行構建生命周期(即順序地構建每一個模塊)。
如果你使用的是多模塊項目,Maven 從 3.0 開始提供了**并行構建(parallel build)**的能力,但它不是默認開啟的。
如何啟用多線程構建?
你可以通過 -T 參數來啟用并行構建。例如:
mvn -T 4 package
表示使用 4個線程 并行構建模塊。
你也可以用下列方式配置:
? -T 1C:使用一個 CPU 核心
? -T 2C:使用兩個 CPU 核心
? -T 0.5C:使用一半 CPU 核心
注意事項:
1. 并行構建只適用于模塊之間無強依賴的情況(Maven 會自動分析依賴)。
2. 不建議對老版本插件或有副作用的插件使用并行構建,可能會造成問題。
3. 日志輸出可能會變亂,建議加上 -B(batch 模式)或使用 --log-file 來寫入日志文件。
如需查看當前 Maven 的并行配置,可執行:
mvn -version
會看到是否有 Multithreaded 相關信息。
命令 含義 示例(8 核 CPU)
-T 1 固定使用 1 個線程 1 線程
-T 4 固定使用 4 個線程 4 線程
-T 1C 每核 1 個線程 8 線程
-T 2C 每核 2 個線程 16 線程
-T 0.5C 每 2 核共用 1 線程 4 線程
常見錯誤
(Too many open files) 是一個典型的 操作系統限制錯誤,通常表示 Maven 或 Java 構建過程中打開的文件句柄數超過了系統允許的最大值。這在并發構建(比如你使用了 mvn -T 多線程)時尤其容易觸發。
🔍 問題分析
背景
每個進程在 Linux/macOS 系統下都有一個最大“打開文件數限制”(file descriptor,簡稱 FD),當構建中打開了太多:
? .jar 文件
? 源代碼文件
? class 文件
? 日志文件
? 依賴模塊
等,就會觸發這個錯誤。
? 解決方案
- 查看當前打開文件數限制
ulimit -n
一般默認值是 1024 或 256,遠遠不夠。
- 臨時提升當前 shell 的限制
ulimit -n 65535
然后再執行:
mvn -T 2C clean package
這個方法只對當前終端會話有效,重啟 shell 會失效。
?
- 永久修改(macOS 示例)
macOS(zsh 或 bash 用戶):
編輯 ~/.zshrc 或 ~/.bash_profile,添加:
ulimit -n 65535
然后運行:
source ~/.zshrc # 或 source ~/.bash_profile
macOS 系統級(需要 root 權限):
sudo launchctl limit maxfiles 65535 65535
?
- 永久修改(Linux 示例)
修改 /etc/security/limits.conf
打開文件數限制(軟限制和硬限制)
your_username soft nofile 65535
your_username hard nofile 65535
修改 /etc/pam.d/common-session(有些系統需要)
session required pam_limits.so
修改 /etc/systemd/user.conf 和 /etc/systemd/system.conf
DefaultLimitNOFILE=65535
然后重啟機器或相關服務。
?
🧠 補充建議
? 如果你用的是 mvn -T 2C(使用 16 個線程),每個線程同時可能打開幾十個文件,文件句柄很快就會用盡。
? 調整為 -T 1C 或 -T 4 也可能避免觸發此問題,作為臨時緩解。