如果mvn clean没有运行,Maven仍然在jar中删除了类

时间:2014-08-10 07:58:31

标签: maven

为了加快我的maven构建时间,我希望运行mvn install而不是mvn clean install
如果我这样做,并且删除了一个源文件(在VCS中,我在更新我的副本后得到了这个更改),maven仍然会打包旧文件(因为它仍在目标文件夹下)。
我知道this线程和其他类似的线程,但我对最终结果不满意。

我认为maven“聪明”足以只接受更改并进行真正的增量构建,但这种行为打破了这种假设......

有没有人知道如何在不使用clean生命周期的情况下使用maven享受真正的增量构建?

1 个答案:

答案 0 :(得分:1)

Maven贯穿它的生命周期,在流程的各个阶段通过插件运行外部工具。您可以选择此流程的开始位置,建议的起点为clean。我们建议这样做是因为maven对你的源代码一无所知 - 它甚至不知道它是java还是C ++ - 它并不是必须的。它只知道一旦到达生命周期的compile步骤就应该在配置的源目录上调用配置的编译器(例如javac)。

您的编译器知道源代码,因此如果有责任归咎于此,请责怪编译器。但是,大多数编译器不会仅仅因为已删除源文件而删除已编译的工件,因为它不知道此工件不会在以后链接(引用) - 就编译器而言关注的是,它只对与源文件相关的工件感兴趣。这可能是查看源代码的唯一工具(除了一些静态代码分析工具以及某些文档工具,例如site和javadoc)。

Maven将在编译后继续运行您的测试,如果他们通过它,将进入打包步骤。打包再次是一个外部工具(例如jar),通过插件配置。在罐子或战争的情况下,这将获取目标目录的内容并根据配置的指令将它们压缩到jar或war中。同样,没有任何一部分需要知道文件是否已从源中删除 - 事实上,此时它甚至不查看源,所以它如何知道文件去掉了。

我的观点是,您承担了过多的开发环境。它无法知道目标目录中的文件是否不需要,除非您不遗余力地告诉它这是如此。这就是为什么首先有clean步骤的原因。

顺便说一句,clean不应该花费很多时间。如果是,也许您应该将项目重构为更多模块。