40

可以说我有如下的模块结构

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

现在要启动客户端,我需要构建所有模块,i.e utils, domain, client, services,因为我正在加载所有上述模块的 jar 以最终启动客户端

所有的罐子都在模块部署中组装。

我的问题是,例如,如果我更改服务中的任何内容,那么有没有办法在运行构建时deploy maven可以识别它必须只构建services并因此构建它并将其部署在部署文件夹中?

4

8 回答 8

38

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

于 2013-03-14T09:34:06.640 回答
16

对于 GIT

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

或者

在您的 .bashrc 文件中(.bashrc 可以在主目录 ~/.bashrc 中找到,或者如果不存在则创建它)添加以下函数。

mvn_changed_modules(){
    [ -z "$1" ] && echo "Expected command : mvn_changed_modules (install/build/clean or any maven command)" && exit 0

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

                if [  -z "$modules" ];
                then
                        echo "No changes (modified / deleted / added)  found"
                else
                        echo -e "Changed modules are : `echo $modules`\n\n"
                        mvn $1 -amd -pl $modules
                fi
}

**然后在重新启动 bash** (命令提示符)后,您 ** 可以从 ROOT 目录本身使用以下命令**。

smilyface@machine>ProjectRootDir]$ mvn_changed_module install

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

例如,下面是修改文件列表(的输出git status) -
services /pom.xml
services /ReadMe.txt
web /src/java/com/some/Name.java
然后是需要构建的模块services名称web/编译/安装

于 2018-04-23T10:48:11.747 回答
15

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

mvn -pl ChangedModule compile

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

mvn -amd -pl ChangedModule compile

其中 -amd 意味着也使家属这无需通过mvn install将整个模块安装到本地存储库中即可工作。

于 2013-03-14T12:55:00.320 回答
4

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

  1. Maven 安装(没有清理)仍然需要很多时间,对于几个项目来说可能是 10-20 秒的额外时间。
  2. Sebasjm 的解决方案快速且有用(我使用了几个月),但是如果您有几个更改的项目,那么一直重建它们(如果您甚至没有更改任何内容)是浪费时间

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

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

于 2016-06-10T06:04:59.310 回答
3

如果您使用的是 SVN 和 *nix,则从根模块

mvn install -amd -pl $(svn st | colrm 1 8 | sed 's /.*  ' | xargs echo | sed 's- -,:-g' | sed 's ^ : ') 
于 2014-10-24T17:40:31.847 回答
3

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

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

它使用nodejs并假设一个maven项目,但应该在 Windows 和 unix 上工作。

我实现的想法是观察变化,然后编译变化的内容。- 有点像nodemon

所以例如

  • 当 java 文件更改时 - 我编译模块
  • 当类文件或 jar 更改时 - 我会执行其他操作(例如将 jar 复制到 tomcat 下并重新启动 tomcat)

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

.java我已经在一个包含 23K文件的项目中使用它,并且运行顺利。

监视过程需要几秒钟才能启动 - 但只有在检测到更改时才会运行,因此整体体验很好。

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

需要注意的重要一点 - 如果编译失败,它将在下一次修改时重试。所以如果你修改了多个jar,只要你在写代码,编译就会失败,每次代码更改时它都会重试编译所有内容,直到编译成功。

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

于 2016-09-20T12:00:59.800 回答
0

到目前为止发布的问题和答案没有考虑依赖树。如果更改了utils模块怎么办?我们需要重建(至少重新测试)它以及依赖它的所有模块。

这样做的方法:

于 2020-07-30T22:26:10.827 回答
0
  • mvn clean install运行完整构建
  • mvn install仅编译更改并准备战争/罐子其他二进制文件
  • mvn compile仅编译更改的文件...

mvn compile最快的也是如此。但是如果使用 war/jars 运行/调试您的项目,它可能不会显示这些更改。

于 2022-02-07T08:53:51.403 回答