Maven构建仅更改文件

可以说我有类似下面的模块结构

Modules ->utils ->domain ->client ->services ->deploy (this is at the module level) 

现在,客户端需要构建所有模块, ie utils, domain, client, services,因为我正在加载所有上述模块的jar,以便fianlly lanch客户端

并且所有jar子都在模块部署中组装。

我的问题是,如果我在服务中改变任何东西,那么有没有办法从deploy maven运行构建时可以认识到它必须只构建services然后构建它并将其部署在部署文件夹中?

如果您使用SVN和* nix,则从根模块开始

 mvn install -amd -pl $(svn st | colrm 1 8 | sed 's /.* ' | xargs echo | sed 's- -,:-g' | sed 's ^ : ') 

如果你只调用“mvn install”而没有“clean”,编译器插件将只编译修改过的类。

在多模块构建中,您可以使用:

 mvn -pl ChangedModule compile 

从根模块将只编译给定的ChangedModule 。 编译器插件只会编译已更改的文件。 但是,您更改的模块可能会导致重新编译其他模块,这取决于ChangedModule 。 这可以通过使用以下方法实现:

 mvn -amd -pl ChangedModule compile 

其中-amd 也意味着依赖 。 这将无需通过mvn install将整个模块安装到本地存储库中。

我有同样的挫折感,当时我还写了一个项目 – 唉它不可用,但我发现有人实现了类似的东西:

例如 – https://github.com/erickzanardo/maven-watcher

它使用nodejs并假设一个maven项目,但应该在windows和unix上运行。

我的实现的想法是观察更改,然后编译更改的内容。 – 有点像nodemon

所以举个例子

  • 当java文件改变时 – 我编译模块
  • 当类文件或jar更改时 – 我会做其他事情(例如在tomcat下复制jar并重启tomcat)

这两者是无关的..所以如果java编译失败,应该没有理由让jar文件更新..而且它非常稳定。

我在一个带有23K .java文件的项目上使用它,它运行顺利。

手表过程需要几秒钟才能启动 – 但是只有在检测到更改时才会运行,因此总体体验非常好。

我打算添加的下一步类似于您的SVN支持 – 列出已修改的文件并将其用作初始化。

需要注意的重要事项 – 如果编译失败,它将在下次修改时重试。 因此,如果您正在修改多个jar,并且编译失败,只要您编写代码,它将重试编译每个代码更改的所有内容,直到它成功编译。

如果您愿意,我可以尝试找到我的旧项目,修改一下并发布它。

在尝试并使用上述建议后,我遇到了以下问题:

  1. Maven安装(不干净)仍然需要花费很多时间,这对于几个项目来说可能需要10-20秒的额外时间。
  2. Sebasjm的解决方案快速且有用(我使用它几个月),但如果你有几个改变的项目,一直重建它们(如果你甚至没有改变任何东西)是一个巨大的浪费时间

对我来说真正有用的是将源修改日期与本地存储库中的.jar修改进行比较。 如果你只检查VCS更改的文件(参见sebasjm的答案),那么日期比较将不会花费显着的时间(对我而言,100个已更改文件的时间不到1秒)。 这种方法的主要好处是非常准确地重建真正改变的项目。 主要问题是做修改日期比较有点多于单行脚本。

对于那些想要尝试它的人,但是懒得写这样的脚本自己分享我的版本: https : //github.com/bugy/rebuilder (linux / windows)。 它可以做一些额外的有用的东西,但主要思想和中心算法如上所述。

对于GIT

mvn install -amd -pl $(git status | grep -E "modified:|deleted:|added:" | awk '{print $2}' | cut -f1 -d"/")

要么

在.bashrc文件中 (.bashrc可以在主目录〜/ .bashrc中找到)添加以下函数。

 mvn_changed_module(){ mvn install -amd -pl $(git status | grep -E "modified:|deleted:|added:" | awk '{print $2}' | cut -f1 -d"/") } 

然后在重新启动bash (命令提示符)后,您只需使用 ROOT目录本身中的以下命令即可

smilyface @ machine> MainDir] $ mvn_changed_module install

这个怎么运作?
根据问题mvn install -amd -pl services是“在服务模块中完成一些更改”时的命令。 因此,首先从更改的文件中获取模块名称,并将其作为mvn-install命令的输入

比如说 ,下面是修改过的文件列表( git status输出) –
服务/ pom.xml的
服务/的ReadMe.txt
服务/ src目录/ JAVA / COM /一些/ Name.java
然后, services是需要构建/编译/安装的模块名称