【问题标题】:Is there a way to force maven to copy resource folder changes incrementally?有没有办法强制 maven 以增量方式复制资源文件夹更改?
【发布时间】:2011-04-27 13:50:09
【问题描述】:

我正在使用 Maven 2.2.1 和 m2eclipse。

我有两个资源文件夹。

当我保存对任何资源文件夹中任何文件的更改时,Maven 增量构建将启动并将两个资源文件夹中的所有文件重新复制到目标文件夹。

如果资源文件夹中的文件数量相对较少,则此行为会很好 - 但足够多,复制可能需要几分钟。

有没有办法强制 maven 在其增量构建中更具选择性并仅复制那些已更改的资源?

【问题讨论】:

  • 不确定我的评论是否相关,但您是在谈论 Eclipse 中的自动构建,它会在您修改某些内容时启动?您可以在选项中停止,然后使用 ^b 手动启动构建?
  • 你有没有将 设置为 true?这将迫使它始终复制资源。

标签: java maven m2eclipse


【解决方案1】:

我将问题归结为 org.codehaus.plexus.util.FileUtils.copyFile() 方法。正是这个方法被 maven-resource-plugin 调用以最终复制资源; copyFile() 方法采用“覆盖”参数,资源插件 确实 传入了该参数(默认值确实为 false),但是...

如果传递的过滤器包装器列表非空,则 copyFile() 方法忽略“覆盖”参数!如果您将资源的过滤设置为 true,则此列表确实是非空的。

我可以理解 copyFile() 忽略“覆盖”背后的原因:仅仅因为目标文件较新并不意味着新的过滤文件将是相同的(即资源文件中变量的值可能已更改,因为最后一次过滤)。
忽略“覆盖”标志对于 FileUtils 实现者来说是“方便的”。但这要付出很大的代价。不必要地更新的单个资源文件可能会触发耗时但冗余的过程(即在我的情况下重建带有依赖关系的 jar)。这可能只有几秒钟,但足以中断密集的代码编译测试周期的流程。

我在 FileUtils 上寻找打开的错误,但没有找到任何错误。这让我很烦,所以我不得不追究它,但我现在不能花更多时间在它上面……几天后我想提交一份错误报告(可能更快地实施正确的解决方案);如果有人可以发布指向相应错误跟踪/报告系统的链接,我将不胜感激。

【讨论】:

  • 我在 3.0.10 版上检查了 org.codehaus.plexus.util.FileUtils#copyFile(java.io.File, java.io.File, java.lang.String, org.codehaus.plexus.util.FileUtils.FilterWrapper[], boolean),没有看到您提到的便利性,或者为什么不在一开始就调用 if ( to.lastModified() < from.lastModified() || overwrite ) 并且不管包装器如何都完成。另外,感谢您提交错误 - 请在那里发表评论以反映它仍然是一个问题,因为我无法登录或订阅发表评论。
  • 另外,为了让 maven-resource-plugin 马上修复它,我们可以做同样的检查,根本不调用这个特定的方法。或者寻找另一个体面的文件实用程序来尊重标志。修复可以进入org.apache.maven.shared.filtering.DefaultMavenFileFilter#copyFile(java.io.F‌​ile, java.io.File, boolean, java.util.List<org.codehaus.plexus.util.FileUtils.FilterWrapper>, java.lang.String, boolean)
【解决方案2】:

尝试将 Maven 资源插件的 overwrite 参数设置为 false。 http://maven.apache.org/plugins/maven-resources-plugin/resources-mojo.html#overwrite

已编辑:此参数从 Maven 资源插件版本 2.3 开始存在。 @Jared:请检查您的版本。

【讨论】:

  • 文档声明默认为false
  • 文档说“自:2.3”。正如我看到的原始海报有 Maven 2.2.1。
  • 2.3是插件的版本,不是maven版本(没有maven 2.3)。
【解决方案3】:

您可以尝试更新到最新版本的 m2eclipse 和 Maven 3。有一个新的 Maven 插件 API,可以告诉 m2eclipse 哪些文件受到 Maven 插件的影响。我相信资源插件已更新到该 API(但请确保在资源插件配置中未将覆盖设置设置为 true)。

【讨论】:

  • 如果您没有 Eclipse,这将如何工作?我认为 Eclipse 部分与 Maven 将资源复制到目标目录没有任何关系。
【解决方案4】:

假设您不想更新,您似乎需要编写自己的资源插件版本。

这看起来不会太难(一些不完整的源代码在这里:http://maven.apache.org/plugins/maven-resources-plugin/xref/index.html),您可以包含自己的自定义配置参数来修改 MavenResourcesExecution 类的覆盖行为。

如果您有社区意识,您可以将补丁提交回插件存储库,以允许其他人利用更新。

【讨论】:

    【解决方案5】:

    Maven 资源插件配置中可能有一个选项可以执行此操作,但我没有找到任何选项。如果我是你,我会拆分资源并将它们移到你所依赖的单独模块中。然后你只需重建你更改文件的模块而不是其他模块,事情会快得多..

    我也会尝试刚刚发布的 Maven 3.0。它速度更快,并且会改善您在这方面和其他方面的情况。

    【讨论】:

      猜你喜欢
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-17
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多