Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE

1. Overview

In this tutorial, we’ll learn how to resume a Maven build after failure. We’ll see how to skip the already successfully built modules. Thus, we’ll jump directly to the point where the issue arose.

2. Example Setup

Let’s build a multi-module Maven project. We call the parent resume-from and the two children lib and business. For the sake of demonstration, we’ll leave the lib project empty. However, the business project contains a lone src/main/java/Main.java file which consists of a Hello World. Let’s now add a dependency to lib in the business module:

<dependency>
    <groupId>com.baeldung</groupId>
    <artifactId>lib</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

As of now, the project’s content is correct, so we can build it successfully:

$ mvn clean install
[...]
[INFO] Reactor Summary for resume-from 1.0-SNAPSHOT:
[INFO]
[INFO] resume-from ........................................ SUCCESS [  1.749 s]
[INFO] lib ................................................ SUCCESS [  2.021 s]
[INFO] business ........................................... SUCCESS [  0.991 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[...]

3. When Running the install Phase

Let’s now remove the semicolon in the Main.java file. This breaks the build of the business submodule:

$ mvn clean install
[...]
[INFO] Reactor Summary for resume-from 1.0-SNAPSHOT:
[INFO]
[INFO] resume-from ........................................ SUCCESS [  1.186 s]
[INFO] lib ................................................ SUCCESS [  0.984 s]
[INFO] business ........................................... FAILURE [  0.334 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.809 s
[INFO] Finished at: 2023-06-20T16:15:13+02:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project business: Compilation failure
[ERROR] [...]/resume-from/business/src/main/java/Main.java:[4,43] ';' expected
[...]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <args> -rf :business

As the lib submodule was built successfully, it would be nice to skip its build after we fix the problem. As said in Maven’s error message, we can use the -rf option to resume the reactor from a given module. Let’s fix the Main.java file and try this:

$ mvn clean install -rf :business
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------------< com.baeldung:business >------------------------
[INFO] Building business 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[...]
------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  1.318 s
[INFO] Finished at: 2023-06-20T17:21:07+02:00
[INFO] ------------------------------------------------------------------------

As expected, only the business submodule was built this time. Actually, -rf is the short version of –resume-from, so we could write equivalently:

$ mvn clean install --resume-from :business

4. When Not Running install

Let’s now suppose that instead of running a Maven install, we stop the build at an earlier phase. To showcase this, we can come back to the situation where the Main.java file is corrupted. Let’s also clean up our local repository and run the package phase:

$ mvn clean package
[...]
[INFO] Reactor Summary for resume-from 1.0-SNAPSHOT:
[INFO]
[INFO] resume-from ........................................ SUCCESS [  0.108 s]
[INFO] lib ................................................ SUCCESS [  0.709 s]
[INFO] business ........................................... FAILURE [  0.316 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.216 s
[INFO] Finished at: 2023-06-20T17:49:59+02:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project business: Compilation failure
[ERROR] [...]/resume-from/business/src/main/java/Main.java:[4,43] ';' expected
[...]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR] mvn <args> -rf :business

Unsurprisingly, we get the same compilation error. The error message gives us the same hint to use the -rf option after fixing the problem. Thus, let’s fix the problem and run this command:

$ mvn clean package -rf :business
[INFO] Scanning for projects...
[INFO]
[INFO] -----------------------< com.baeldung:business >------------------------
[INFO] Building business 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[WARNING] The POM for com.baeldung:lib:jar:1.0-SNAPSHOT is missing, no dependency information available
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.187 s
[INFO] Finished at: 2023-06-20T17:56:34+02:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project business: Could not resolve dependencies for project com.baeldung:business:jar:1.0-SNAPSHOT: Could not find artifact com.baeldung:lib:jar:1.0-SNAPSHOT -> [Help 1]

Since we didn’t run the install phase, the lib submodule wasn’t installed in our local repository during the first build. Thus, Maven can’t find the lib artifact when trying to resume the build. Theoretically, we could solve this problem by adding the –also-make option to our command line. With –also-make, Maven is supposed to build all projects that business depends on. However, there is a bug in Maven 3, and –also-make is ignored when used in conjunction with –resume-from.

This bug will be fixed in Maven 4, which is currently still in development. Meanwhile, we can’t resume the reactor from a particular module in this case. Unfortunately, we need to redo the entire build:

$ mvn clean package
[...]
[INFO] Reactor Summary for resume-from 1.0-SNAPSHOT:
[INFO]
[INFO] resume-from ........................................ SUCCESS [  0.109 s]
[INFO] lib ................................................ SUCCESS [  0.660 s]
[INFO] business ........................................... SUCCESS [  0.436 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[...]

5. Conclusion

In this article, we saw how to skip parts of a Maven build after it failed. When we install the submodules into the local repository, we can use the -rf option. On the other hand, not installing them leads to needing to redo the whole build because of a Maven bug.

As always, the code is available over on GitHub.

Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE
res – Maven (eBook) (cat=Maven)
Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.