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,并且编译失败,只要您编写代码,它将重试编译每个代码更改的所有内容,直到它成功编译。
如果您愿意,我可以尝试找到我的旧项目,修改一下并发布它。
在尝试并使用上述建议后,我遇到了以下问题:
- Maven安装(不干净)仍然需要花费很多时间,这对于几个项目来说可能需要10-20秒的额外时间。
- 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
是需要构建/编译/安装的模块名称
- 构建失败java.lang.OutOfMemoryError:Java堆空间
- Ant scp任务无法正常工作,即使在ant / lib上使用jsch也是如此
- Gradle Build失败并出现exception:java.exe’以非零退出值2结束
- eclipse不编译项目
- Maven构建编译错误:无法执行目标org.apache.maven.plugins:maven-compiler-plugin:3.1:在项目Maven上编译(default-compile)
- 如何在build.gradle文件中添加OJDBC6.jar?
- Ant和可用的任务 – 如果没有可用的东西怎么办?
- Java项目中的build.xml
- 如何在Gradle中支持多种语言(Java和Scala)的多个项目?