我正在使用Maven 2.2.1和m2eclipse。
我有两个资源文件夹。
当我将更改保存到任何资源文件夹中的任何文件时,Maven增量版本将启动并将两个资源文件夹中的所有文件重新复制到目标文件夹。
如果资源文件夹中的文件数量相对较少,则此行为会很好 - 但是有足够的文件可能需要几分钟。
有没有办法强制maven在其增量构建中更具选择性,只复制那些已更改的资源?
答案 0 :(得分:8)
我将问题追溯到org.codehaus.plexus.util.FileUtils.copyFile()方法。 maven-resource-plugin调用此方法最终复制资源; copyFile()方法采用'overwrite'参数,资源插件 传入(并且默认值确实为false),但是......
如果传递的filter-wrappers列表非空,则copyFile()方法会忽略
我可以理解copyFile()忽略'覆盖'背后的原因:只是因为目标文件较新并不意味着新的过滤文件将是相同的(即资源文件中变量的值可能已经改变,因为最后一次过滤)。
忽略'overwrite'标志对于FileUtils实现者来说是“方便的”。但这是一个很大的代价;不必要地更新的单个资源文件可以触发耗时但冗余的进程(即在我的情况下重建jar-with-dependencies)。这可能只有几秒钟,但足以破坏密集的代码 - 编译 - 测试周期的流程。
我在FileUtils上寻找开放的bug,但没有找到任何。这让我很烦,所以我不得不把它追了下来,但我现在不能花更多的时间在这上面......几天后我想提交一份错误报告(可能会更快地实施正确的解决方案);如果有人可以发布链接到相应的错误跟踪/报告系统,我将不胜感激。
答案 1 :(得分:1)
尝试将Maven资源插件的overwrite
参数设置为false。 http://maven.apache.org/plugins/maven-resources-plugin/resources-mojo.html#overwrite
已编辑:此参数自Maven资源插件版本2.3以来存在。 @Jared:请检查你的版本。
答案 2 :(得分:1)
您可以尝试更新到m2eclipse和Maven 3的最新版本。有一个新的Maven插件API告诉m2eclipse哪些文件受到Maven插件的影响。我相信资源插件已更新到该API(但请确保资源插件配置中的覆盖设置未设置为true)。
答案 3 :(得分:0)
Maven资源插件配置中可能有一个选项可以做到这一点,但我还没有找到。如果我是你,我会分配资源并将它们移到你依赖的独立模块中。然后你只需要重建你更改文件的模块而不是其他模块,事情会更快......
我也会尝试刚刚发布的Maven 3.0。它的速度要快得多,并且会在这方面和其他方面改善你的情况。
答案 4 :(得分:0)
假设您不想更新,您似乎需要编写自己的资源插件版本。
这看起来不太难(这里有一些不完整的源代码:http://maven.apache.org/plugins/maven-resources-plugin/xref/index.html),你可以包含自己的自定义配置参数来修改MavenResourcesExecution类的覆盖行为。
如果您感觉有社区意识,可以将补丁提交回插件存储库,以允许其他人利用更新。