当前位置: 首页 > article >正文

maven 3.0多线程编译提高编译速度

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 文件
• 日志文件
• 依赖模块

等,就会触发这个错误。

✅ 解决方案

  1. 查看当前打开文件数限制
ulimit -n

一般默认值是 1024 或 256,远远不够。

  1. 临时提升当前 shell 的限制
ulimit -n 65535

然后再执行:

mvn -T 2C clean package

这个方法只对当前终端会话有效,重启 shell 会失效。

  1. 永久修改(macOS 示例)

macOS(zsh 或 bash 用户):

编辑 ~/.zshrc 或 ~/.bash_profile,添加:

ulimit -n 65535

然后运行:

source ~/.zshrc  # 或 source ~/.bash_profile

macOS 系统级(需要 root 权限):

sudo launchctl limit maxfiles 65535 65535

  1. 永久修改(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 也可能避免触发此问题,作为临时缓解。

http://www.lryc.cn/news/2387795.html

相关文章:

  • Dalvik虚拟机、ART虚拟机与JVM的核心区别
  • Unity 3D AssetBundle加密解密教程
  • 【Linux】shell脚本的常用命令
  • Netty应用:从零搭建Java游戏服务器网络框架
  • Pycharm and Flask 的学习心得(9)
  • Linux初始-环境安装(2)
  • Nginx 安全防护与 HTTPS 部署实战笔记
  • Python Day34 学习
  • 【ASR】基于分块非自回归模型的流式端到端语音识别
  • 国芯思辰|国产FRAM SF25C128助力监控系统高效低功耗解决方案,对标MB85RS128/FM25V01
  • 攻防世界逆向刷题笔记(新手模式9-1?)
  • 【golang】能否在遍历map的同时删除元素
  • 制作一款打飞机游戏58:子弹模式组合
  • 使用新一代达梦管理工具SQLark,高效处理 JSON/XML 数据!
  • Qt基础:数据容器类
  • Vue3监听对象数组属性变化方法
  • 深入了解PyTorch:起源、优势、发展与安装指南
  • DeepSeek智能对话助手项目
  • 浅谈Mysql的MVCC机制(RC与RR隔离级别)
  • uniapp-商城-72-shop(5-商品列表,购物车实现回顾)
  • 【git】 pull + rebase 或 pull + merge什么区别?
  • 1. 编程语言进化史与JavaScript
  • Vue3 中 Axios 深度整合指南:从基础到高级实践引言
  • MySQL#Select语句执行过程
  • hbuilder中h5转为小程序提交发布审核
  • 文档注释:删还是不删
  • 【数据结构】单链表练习
  • JVM 性能优化终极指南:全版本兼容、参数公式与场景实战
  • 分布式爬虫监控架构设计
  • MySQL的参数 innodb_force_recovery 详解