解决Maven并行编译中出现打包错误问题的思路
解决Maven并行编译中出现打包错误问题的思路
并行构建
Maven 3.x 提供了并行编译的能力,通过执行下列命令就可以利用构建服务器的多线程/多核性能提升构建速度:
mvn -T 4 clean install # Builds with 4 threads
mvn -T 1C clean install # 1 thread per cpu core
mvn -T 1.5C clean install # 1.5 thread per cpu core
采用并行构建时,Maven会分析项目的依赖并规划出可以进行并行构建的模块
问题
通过并行编译确实能提升构建速度,但是如果在写pom时不加注意,那么很容易就会引发新问题。最近遇到并行编译引发打包错误的问题,问题的外在表现都很相似,即在使用maven插件进行打包时,发生了无法找到相应的包导致构建无效版本或无法产生打包版本的错误。
通常在一个项目中,想要子系统或模块实现先后依赖顺序,可以采用在parent pom中按照依赖顺序编写module的方式,如下所示。
<modules>
<module>A</module>
<module>B</module>
<module>C</module>
</modules>
按照上述内如,A、B、C三个子模块将按照先A,再B,最后C的顺序依次构建,在串行构建时,情况确实如此,但是到了并行构建中,这样的顺序就无法保证了,即使能够保证按照A、B、C的顺序并行构建,由于子模块构建时间不同,依然会出现最后的子模块率先构建完成的情景。
解决之道
先回到maven看下它是如何处理构建,如下图所示。

图中每个节点代表多模块构建中的单个模块,而“级别”标注了与第一个模块的在依赖关系上的距离,Maven根据模块依赖来计算出上图,需要注意的是maven中的继承关系也是一种依赖。
简化说明,假设所有的模块具有相等的构建时间,构建先从级别0开始,然后是并行的5个级别1;在级别2,会并行构建3个模块,以此类推,是级别3中个7个并行构建模块,这样构建方式源于pom中声明的依赖,当然在实际的构建过程中,各个模块的构建的时间是不一致,从而导致了上述问题
从上述分析可以看出,依赖是maven能够正确识别构建先后顺序的,即使是并行构建场景。这种依赖关系处理可以有两种方式,视构建认为的规模而定。
- 解耦构建与打包,将打包从构建中剥离出来,单独执行
- 增强依赖,特别是在负责打包的部分,对于打包部分,要求显式地依赖其他的构建结构
参考
解决Maven并行编译中出现打包错误问题的思路的更多相关文章
- 解决maven项目java中配置文件打包被忽略
pom.xml中添加以下配置 <build> <!--配置打包时不过滤非java文件开始 --> <!--说明,在进行模块化开发打jar包时,maven会将非java文件 ...
- 关于在windows下使用mingw并行编译wxwidgets时的错误
清理用的命令:mingw32-make -j4 -f makefile.gcc BUILD=release SHARED=1 MONOLITHIC=1 UNICODE=1 clean 2>nul ...
- 解决Maven项目编译时提示:源值1.5已过时,将在未来所有版本中删除
每次编译项目时,都提示:源值1.5已过时,将在未来所有版本中删除 查了一些资料,发现是因为IDEA默认把项目的源代码版本设置为jdk1.5,目标代码设置为jdk1.5 解决方案: 修改Maven的S ...
- maven exclusion 解决maven传递依赖中的版本冲突
传递依赖是maven最有特色的.最为方便的优点之一,可以省了很多配置.如a 依赖 b,b 依赖c 默认 a也会依赖 c.但是也会带来隐患,如版本冲突.当然maven也考虑到解决办法,可以使用exclu ...
- 解决maven依赖传递中的版本冲突问题
通常情况下,我们都比较喜欢使用maven进行项目管理,要加个依赖包也非常简单,不需要到处去下载jar包,当然除了maven之外,也还有一些非常不错的工具.在使用maven进行项目依赖管理的时候,有时候 ...
- 【坑】解决maven管理SSM中mybatis的mapper文件扫描失败的问题
文章目录 前言 改进方式来替换原始的使用方式 后记 好久没有写博客了,11月底来到公司实习,上个月写个小demo,趁此回顾下SSM,今天将最近的积累记录下: 前言 在学习 mybatis 的时候,都知 ...
- 三步解决EntityFramework Code First中的MissingMethodException错误
在数据库初始化时运行OnModelCreating的方法中,有时会抛出MissingMethodException异常. 以下三步可解决大部份的出错场景: 在程序包管理器控制台中运行:Uninstal ...
- 解决maven官方库中没有oracle jdbc驱动的问题:Missing artifact com.oracle:ojdbc14:jar:10.2.0.1.0
最近在整合SSHE项目时,想要添加Oracle驱动包时,Maven的pom.xml总是报Missing artifact com.oracle:ojdbc14:jar:10.2.0.1.0错, 下面我 ...
- 关于discuz“终于解决“头像保存过程中发生网络错误,请重试"”的解决方法
1 php.ini里面allow_url_fopen = On2 将php.ini中的;upload_tmp_dir = 该行的注释符,即前面的分号“:”去掉,使该行在php.ini文档中起作用.up ...
随机推荐
- 一个flume agent异常的解决过程记录
今天在使用flume agent的时候,遇到了一个异常, 现把解决的过程记录如下: 问题的背景: 我使用flume agent 来接收从storm topology发送下来的accesslog , ...
- linux c 判断文件存在,遍历文件,随机修改文件内容
#include<stdio.h> #include<stdlib.h> #include<time.h> #include<assert.h> #in ...
- java 数据结构与算法---树
一.树的概念 除根节点外,其余节点有且只有一个父节点. 1.度 节点的度:每个节点的子节点个数. 树的度:树内各个节点的度的最大值. 树的高度(深度):树中节点的最大层次称为树的深度. 节点路径:一 ...
- JAVA里的布尔运算符-甲骨文面试题
重要一点: (& ,|) ==>二进制布尔运算符,(&&,||)==>条件布尔运算符 二进制布尔运算符,两边都会执行,不管左边是否为真或假==>对于运算符两边 ...
- .net webapi创建接口
最近使用webapi做了一个用户数据库接口,方便其它网站接入验证用户,实现中解决出现的一些问题,做了一些记录, 1.返回显示为json数据 2.允许其他网站访问,刚开始没有设,在本地机测试时可以访问, ...
- python中OS模块操作文件和目录
在python中执行和操作目录和文件的操作是通过内置的python OS模块封装的函数实现的. 首先导入模块,并查看操作系统的类型: >>> import os os.name # ...
- GPU并行编程小结
http://peghoty.blog.163.com/blog/static/493464092013016113254852/ http://blog.csdn.net/augusdi/artic ...
- 【刷题】HDU 3435 A new Graph Game
Problem Description An undirected graph is a graph in which the nodes are connected by undirected ar ...
- BZOJ 2521: [Shoi2010]最小生成树
2521: [Shoi2010]最小生成树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 445 Solved: 262[Submit][Statu ...
- 【agc023E】Inversions(线段树,动态规划)
[agc023E]Inversions(线段树,动态规划) 题面 AT 给定\(a_i\),求所有满足\(p_i\le a_i\)的排列\(p\)的逆序对数之和. 题解 首先如何计算排列\(p\)的个 ...