如何确保 Maven 插件是线程安全的

Opt*_*mus 5 maven-plugin maven-3 parallel-builds

我的团队中开发的 Maven 插件很少,并且这些插件没有标记为 @threadSafe。我已经运行了大约 50 个作业,没有发现不一致的情况,但我想知道是否有方法以编程方式验证这一点。

需要寻找哪些因素会使插件对于多线程不安全

sta*_*cer 0

基于https://cwiki.apache.org/confluence/display/MAVEN/Parallel+builds+in+Maven+3threadSafe ,只要没有在mojo 的不同实例之间共享的可变状态,就可以考虑 mojo --例如,对具有可变内容的对象的静态引用。

当构建单个模块时,会创建 mojo 的实例,并execute()在单个线程上调用一次其方法。

OTOH,如果正在构建两个模块,并且都不依赖于另一个模块,则会创建单独的 mojo 实例(每个模块一个),并且它们的execute()方法可能会在不同线程上同时调用 - 如果-T使用 cli 标志和相关的 mojo是threadSafe

上面的链接列出了一些需要检查的具体内容:

  • 检查插件/插件代码中的所有静态字段/变量是否存在线程问题。
  • 您可能要特别注意java.text.Format( NumberFormatDateFormat等) 的子类的静态成员变量,其中大多数不是线程安全的,不能作为静态变量共享。
  • 检查任何神经丛components.xml;如果定义的组件是单例,那么它们需要是线程安全的。
  • 检查是否存在已知受污染的库。
  • 检查任何其他第三方库的线程安全性。最后一项可能有点困难,但是查询邮件列表可以让您有很大帮助。

理论上,两个不同的模块构建仍然可以通过例如写入同一文件来进行竞争。这似乎不是threadSafe注释标签所关心的……也许是因为在实践中,绝大多数模块构建仅在自己的模块目录中写入文件。