【问题标题】:How see all non threadsafe plugins in maven?如何查看 maven 中的所有非线程安全插件?
【发布时间】:2014-06-25 11:34:48
【问题描述】:

我在this 中阅读了有关 maven 并行构建配置的信息。那么如何显示所有非线程安全的插件呢? maven 中是否有类似“plugin-not-safe-list”的命令?

REM something like that to display all p[lugins without @threadSafe  annotation
mvn help:plugin-not-safe-list

【问题讨论】:

    标签: java maven parallel-builds


    【解决方案1】:

    现在,当您构建 Maven 时,会警告未标记为线程安全的插件:

    [WARNING] *****************************************************************
    [WARNING] * Your build is requesting parallel execution, but project      *
    [WARNING] * contains the following plugin(s) that have goals not marked   *
    [WARNING] * as @threadSafe to support parallel building.                  *
    [WARNING] * While this /may/ work fine, please look for plugin updates    *
    [WARNING] * and/or request plugins be made thread-safe.                   *
    [WARNING] * If reporting an issue, report it against the plugin in        *
    [WARNING] * question, not against maven-core                              *
    [WARNING] *****************************************************************
    [WARNING] The following plugins are not marked @threadSafe in Root Maven Parent:
    [WARNING] com.googlecode.maven-download-plugin:download-maven-plugin:1.3.0
    [WARNING] Enable debug to see more precisely which goals are not marked @threadSafe.
    [WARNING] *****************************************************************
    

    【讨论】:

      【解决方案2】:

      您可以为maven-enforcer-plugin 编写自定义规则并将其用于在您的 maven 项目上运行。

      您可能还想使用mojo-executor 来解析plugin.xml 文件以检查其“线程安全”属性。

      稍微详细说明何时以及为什么应该使用上述内容。 当你在 CI/CD 环境中工作,并且你想通过 maven 使用并行编译时,你应该经常监控你的开发人员没有添加非线程安全的插件,以确保 CI/CD 的一致性和正确性.为了实现这一点,您可以使用上面提到的 maven-envorcer-plugin 和自定义规则。您的自定义规则可以使用 Maven 插件 API(maven 项目等)来搜索项目中的所有插件,然后使用 mojo-executor 库来读取 threadSafe每个插件的属性(因为 maven API 没有提供)。 mojo-executor lib 具有解析 threadSafe 属性所在的 maven 插件的 plugin.xml 文件的工具。 找到后,您可以使 maven 构建失败。

      如果您只想查看非线程安全插件的列表,您可以使用相同的技术,只列出 threadSafe 属性为 false 的插件。 然后,您可以配置 maven-enforcer-plugin 以使用自定义规则(例如,项目的配置文件),并通过命令行在单个 maven 命令中运行它。

      顺便说一句,当您在开发项目中发现非线程安全插件并且没有线程安全替代方案时会发生什么,这是另一个问题,这也是可以解决的。

      【讨论】:

      • “顺便说一句,当您在开发项目中发现非线程安全插件并且没有线程安全替代方案时会发生什么,这是另一个问题,这也是可以解决的。”你能帮忙详细解释一下如何解决这个问题吗?
      • 解决方案非常简单,不知道为什么还没有开源。我是为我以前的雇主写的。您应该编写一个新的包装器插件,该插件具有一个信号量,不允许多个由 {groupId}+{artifactId} 标识的同一插件并行执行。由于 Maven 在同一进程中执行所有插件,但并行执行不同的线程 - 简单的全局信号量应该可以解决问题(单例)。然后对于每个非线程安全的插件,你通过包装插件定义它
      • 可以说,如果同一个插件串行运行而不是并行运行,这不是真正的并行。我的测试表明,在大型企业项目中,它仍然比串行运行所有构建的替代方案要好。使用 3 个线程,构建时间减少了 40%。根据项目中模块的本地相互依赖的复杂性,有多少线程可以使公用时间受益是有限制的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      • 2011-08-13
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 2010-12-10
      相关资源
      最近更新 更多