我的团队开发的 Maven 插件很少, 并且这些插件没有标记@threadSafe。 我已经运行了大约 50 个作业,没有发现不一致的情况,但我想知道是否有方法以编程方式验证这一点。
需要寻找哪些东西会使插件对多线程不安全
基于 https://cwiki.apache.org/confluence/display/MAVEN/Parallel+builds+in+Maven+3,只要不存在
共享的可变状态,就可以认为是
threadSafe
魔力的不同实例——例如对具有可变内容的对象的静态引用。
构建单个模块时,会创建 mojo 的实例,并在单个线程上调用其
execute()
方法一次。
OTOH,如果正在构建两个模块,并且都不依赖于另一个模块,则会创建单独的 mojo 实例(每个模块一个),并且它们的
execute()
方法可能会在不同线程上同时调用 - 如果 -T
使用了 cli 标志,相关的 mojos 是 threadSafe
。
上面的链接列出了一些需要检查的具体事项:
java.text.Format
子类的静态成员变量(NumberFormat
、DateFormat
等),它们大多数都不是线程安全的,不能作为静态变量共享。components.xml
;如果定义的组件是单例,那么它们需要是线程安全的。理论上,两个不同的模块构建仍然可以通过例如写入同一个文件。这似乎不是
threadSafe
注释标签所关心的……也许是因为在实践中,绝大多数模块构建仅在自己的模块目录中写入文件。