maven-2 - Maven编译: removing obsolete class files from target

标签 maven-2

我们正在使用 Maven 在构建服务器上编译我们的项目。我们从 SVN 更新源代码,然后从项目文件夹运行“mvn install”,构建一个 jar,然后部署到生产服务器。

为了节省编译时间,我们在重新编译之前保留已编译的类(在 maven 创建的 target/classes 文件夹中)。这样,Maven只需要重新编译新的或更改的java文件。

但是移动/删除的文件存在问题:SVN 更新从源路径中删除 .java 文件,但 Maven 不会从目标/类中删除已编译的 .class 文件。从 main/recourses 文件夹中删除的文件也是如此。因此,删除/移动的类和删除的资源最终仍然出现在我们部署到生产服务器的 jar 文件中,这会导致问题。

我知道我们可以“mvn clean”来删除任何已编译的文件,但这样我们就需要在每次构建时重新编译整个项目,这会花费大量时间。

有谁知道在 Maven 编译之前或期间删除过时的 .class 文件和资源的方法吗?

最佳答案

So, the deleted/moved classes and deleted resources still end up in the jar file we deploy to our production servers, and this causes problems.

在构建要部署到生产服务器的工件时,您确实应该执行完全干净的构建。这不仅是可重复构建的最佳实践(例如 Hudson Best Practices 中提到的),更重要的是,它是防止多模块构建出现运行时错误的唯一方法(除非您使用 maven-incremental-build 插件)。想象一下以下情况:

module-parent
|--- module-api
`--- module-impl

API 模块定义了由 IMPL 模块实现的接口(interface)(因此依赖于 API 模块)。如果您通过修改方法签名来更改 API 模块,并且不更改 IMPL 模块中的任何内容,则从父模块执行构建将会成功,IMPL 不会被重新编译,并且整个事情都会发生。 将在运行时中断(有关此行为,请参阅 this discussion)。你现在所做的事情确实不安全!

Does anyone know a way to remove obsolete .class files and resources before or during Maven compilation?

我不知道有什么这样做。正如我所说,你目前的做法并不安全。您应该更改它,至少在持续集成服务器级别,尤其是“生产构建”。

关于maven-2 - Maven编译: removing obsolete class files from target,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1887723/

相关文章:

maven-2 - 解决maven插件问题: ' Unable to load mojo'

java - 可以编译 Maven 文件夹结构之外的文件吗?

maven-2 - play框架maven仓库在哪里?

android - 如何在 Android 上测试库?

java - Maven插件开发: is there a way to automatically run plugin when it's just declared in pom. xml?

bash - 如何通过 bash 脚本检测来自 ant/maven 的构建错误?

java - 线程 "main"java.lang.NoClassDefFoundError : org/apache/http/ConnectionReuseStrategy: 中的异常

java - 哪些应用程序具有漂亮的 Maven pom,并且可以作为 Maven 功能的示例

maven-2 - poms 中的 Maven 重用

Maven - 在 JUnit 测试之前将 webapp 部署到 tomcat