解决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能够正确识别构建先后顺序的,即使是并行构建场景。这种依赖关系处理可以有两种方式,视构建认为的规模而定。

  • 解耦构建与打包,将打包从构建中剥离出来,单独执行
  • 增强依赖,特别是在负责打包的部分,对于打包部分,要求显式地依赖其他的构建结构

参考

Parallel builds in Maven 3

解决Maven并行编译中出现打包错误问题的思路的更多相关文章

  1. 解决maven项目java中配置文件打包被忽略

    pom.xml中添加以下配置 <build> <!--配置打包时不过滤非java文件开始 --> <!--说明,在进行模块化开发打jar包时,maven会将非java文件 ...

  2. 关于在windows下使用mingw并行编译wxwidgets时的错误

    清理用的命令:mingw32-make -j4 -f makefile.gcc BUILD=release SHARED=1 MONOLITHIC=1 UNICODE=1 clean 2>nul ...

  3. 解决Maven项目编译时提示:源值1.5已过时,将在未来所有版本中删除

    每次编译项目时,都提示:源值1.5已过时,将在未来所有版本中删除 查了一些资料,发现是因为IDEA默认把项目的源代码版本设置为jdk1.5,目标代码设置为jdk1.5 解决方案:  修改Maven的S ...

  4. maven exclusion 解决maven传递依赖中的版本冲突

    传递依赖是maven最有特色的.最为方便的优点之一,可以省了很多配置.如a 依赖 b,b 依赖c 默认 a也会依赖 c.但是也会带来隐患,如版本冲突.当然maven也考虑到解决办法,可以使用exclu ...

  5. 解决maven依赖传递中的版本冲突问题

    通常情况下,我们都比较喜欢使用maven进行项目管理,要加个依赖包也非常简单,不需要到处去下载jar包,当然除了maven之外,也还有一些非常不错的工具.在使用maven进行项目依赖管理的时候,有时候 ...

  6. 【坑】解决maven管理SSM中mybatis的mapper文件扫描失败的问题

    文章目录 前言 改进方式来替换原始的使用方式 后记 好久没有写博客了,11月底来到公司实习,上个月写个小demo,趁此回顾下SSM,今天将最近的积累记录下: 前言 在学习 mybatis 的时候,都知 ...

  7. 三步解决EntityFramework Code First中的MissingMethodException错误

    在数据库初始化时运行OnModelCreating的方法中,有时会抛出MissingMethodException异常. 以下三步可解决大部份的出错场景: 在程序包管理器控制台中运行:Uninstal ...

  8. 解决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错, 下面我 ...

  9. 关于discuz“终于解决“头像保存过程中发生网络错误,请重试"”的解决方法

    1 php.ini里面allow_url_fopen = On2 将php.ini中的;upload_tmp_dir = 该行的注释符,即前面的分号“:”去掉,使该行在php.ini文档中起作用.up ...

随机推荐

  1. Nginx+Tomcat搭建高性能负载均衡集群--Windows本地测试版

    链接:http://www.cnblogs.com/wbyp/p/6860744.html

  2. C++ 构造函数初始化列表

    C++ 中类初始化列表执行顺序是按照定义的顺序执行,不是写在初始化列表的顺序执行 #include <bits/stdc++.h> using namespace std; class N ...

  3. [洛谷P3829][SHOI2012]信用卡凸包

    题目大意:有$n$张一模一样的信用卡,每个角进行了圆滑处理,问这些卡组成的“凸包”的周长 题解:发现是圆滑处理的圆心围成的凸包加上一个圆周即可 卡点:输入长宽弄反,然后以为是卡精 C++ Code: ...

  4. 我的shell脚本

    问题:在ip.lt文件中有600个IP,有3个文档模版,三个文档的名称结构都是“ip+一系列字符串”,要求:1.将600个IP分成3分,以三个模版为基础创建600个文档,名字结构与模版相同:2修改60 ...

  5. APK反编译之二:工具介绍

    前面一节我们说过,修改APK最终是通过修改smali来实现的,所以我们接下来介绍的工具就是如何把APK中的smali文件获取出来,当然同时也需要得到AndroidManifest.xml等文件.直接修 ...

  6. bzoj 1017 : [JSOI2008]魔兽地图DotR

    比较难想的的一道树形dp. 看到这道题正常的思路应该是$f[i][j][k]$表示i这棵子树里买了j个i物品花费为k的最大收益. 但如果直接这么定义的话转移复杂度会很高,需要枚举j,枚举孩子,枚举k, ...

  7. SDOI 2019 Round1 游记

    \(SDOI~2019 ~ Round1\) 游记 \(Day ~0\) 报道.骑车子去的,好热.到了之后看到好几个同校神仙,还从那里莫名其妙的等了一会,然后交了钱签了名就拿挂牌走人了.现在居然还有受 ...

  8. ORB算法介绍(转)

    本文为原创文章,转载请注明出处:http://blog.csdn.net/yang843061497/article/details/38553765 绪论 假如我有2张美女图片,我想确认这2张图片中 ...

  9. Tensorflow实战Google深度学习框架-总结-1

    第一章:深度学习简介   1⃣️应用有 1.计算机视觉 2.语音识别 3.自然语言处理 4.人机博弈   2⃣️深度学习,机器学习,AI 的关系

  10. laravel mapSpread 例子

    $collection = collect(range(1, 9)); $chunks = $collection->chunk(2); $labeld = $chunks->mapSpr ...