2

Let's say I have a project with 2 modules, and 3 pom.xml files (1 for Module A, 1 for Module B, 1 parent pom.xml)

I've added the following plugin that verifies the code coverage diff between my changeset and another branch, and fails if it's below a certain threshold https://github.com/SurpSG/diff-coverage-maven-plugin

If I make NO code changes:

mvn clean verify -> success

mvn clean verify -T 1C -pl moduleA -am -U -> success

mvn clean verify -T 1C -pl moduleA, moduleB -am -U -> success

So as expected, my builds are passing because I made no code change.

Now if I make a code change to moduleA without proper unit test code coverage, here are the results.

mvn clean verify -T 1C -pl moduleA -am -U -> fail for moduleB, skipping moduleA

mvn clean verify -T 1C -pl moduleB -am -U -> success

mvn clean verify -T 1C -pl moduleA, moduleB -am -U -> fail for moduleB, skipping moduleA

This last case is what is puzzling me, why would moduleB be failing? why is it not running for each module without side-effects?

The issue is that the failure message is really not helpful and pointing to the wrong service.

1
  • Can you create a Small public repository demonstrating this behavior? Commented Aug 28, 2022 at 19:57

1 Answer 1

2

You are observing some weird behaviour because plugin's author didn't pay much attention to maven internals:

private val rootProjectDir: File
  get() = reactorProjects[0].basedir
private fun collectExecFiles(): Set<File> {
 return if (dataFileIncludes == null) {
   setOf(dataFile)
 } else {
   FileUtils.getFiles(rootProjectDir, dataFileIncludes, dataFileExcludes).toSet()
 }
}

Injecting reactorProjects makes sense for @aggregator mojos, because when we are dealing with multi-module project structures and have parent-child relations we need special handling of such cases (for example, there are two mojos in jacoco-maven-plugin: report and report-aggregate). In your case plugin's author is trying to kill two rabbits with single shot, that in your particular case leads to the following:

when you run maven like -pl moduleA -am then when maven executes verify phase of Module B reactor projects are Module A, Module B, plugin tries to pick up exec files from Module A directory and fails: Module A depends on Module B and there are no exec files in Module A directory.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.