diff --git a/src/it/test_Scala3_multimodule/invoker.properties b/src/it/test_Scala3_multimodule/invoker.properties
new file mode 100644
index 00000000..3e51a5a6
--- /dev/null
+++ b/src/it/test_Scala3_multimodule/invoker.properties
@@ -0,0 +1 @@
+invoker.goals=clean verify site -e -ntp
\ No newline at end of file
diff --git a/src/it/test_Scala3_multimodule/module01/pom.xml b/src/it/test_Scala3_multimodule/module01/pom.xml
new file mode 100644
index 00000000..66016f7d
--- /dev/null
+++ b/src/it/test_Scala3_multimodule/module01/pom.xml
@@ -0,0 +1,17 @@
+
+
+
+
+
+ it.scoverage-maven-plugin
+ test_Scala3_multimodule
+ 1.0-SNAPSHOT
+ ../pom.xml
+
+
+ 4.0.0
+ module01
+ Test Scala 3 Multi-Module: Module 1
+
+
\ No newline at end of file
diff --git a/src/it/test_Scala3_multimodule/module01/src/main/scala/pkg01/HelloService1.scala b/src/it/test_Scala3_multimodule/module01/src/main/scala/pkg01/HelloService1.scala
new file mode 100644
index 00000000..4260a38d
--- /dev/null
+++ b/src/it/test_Scala3_multimodule/module01/src/main/scala/pkg01/HelloService1.scala
@@ -0,0 +1,12 @@
+package pkg01
+
+class HelloService1
+{
+ def hello: String =
+ {
+ "Hello from module 1"
+ }
+
+}
+
+object HelloService1 extends HelloService1
diff --git a/src/it/test_Scala3_multimodule/module01/src/test/scala/pkg01/HelloServiceTest.scala b/src/it/test_Scala3_multimodule/module01/src/test/scala/pkg01/HelloServiceTest.scala
new file mode 100644
index 00000000..2a5409b1
--- /dev/null
+++ b/src/it/test_Scala3_multimodule/module01/src/test/scala/pkg01/HelloServiceTest.scala
@@ -0,0 +1,14 @@
+package pkg01
+
+import org.junit.Test;
+import org.junit.Assert.assertEquals
+
+class HelloServiceTest
+{
+ @Test
+ def test1(): Unit =
+ {
+ assertEquals("Hello from module 1", HelloService1.hello)
+ }
+
+}
diff --git a/src/it/test_Scala3_multimodule/pom.xml b/src/it/test_Scala3_multimodule/pom.xml
new file mode 100644
index 00000000..5b8e49c3
--- /dev/null
+++ b/src/it/test_Scala3_multimodule/pom.xml
@@ -0,0 +1,66 @@
+
+
+
+ 4.0.0
+
+
+ it.scoverage-maven-plugin
+ integration_tests_parent
+ 1.0-SNAPSHOT
+ ../integration_tests_parent/pom.xml
+
+
+ test_Scala3_multimodule
+ 1.0-SNAPSHOT
+ pom
+ Test Scala 3 Multi-Module
+ Test Scala 3 Multi-Module
+
+
+ 3
+ 3.3.1
+ scala3-library_3
+ UTF-8
+
+
+
+ module01
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ net.alchim31.maven
+ scala-maven-plugin
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+ @project.groupId@
+ @project.artifactId@
+
+ true
+
+
+
+
+
+
+
+
+ @project.groupId@
+ @project.artifactId@
+
+ true
+
+
+
+
+
diff --git a/src/it/test_Scala3_multimodule/validate.groovy b/src/it/test_Scala3_multimodule/validate.groovy
new file mode 100644
index 00000000..5bc6787e
--- /dev/null
+++ b/src/it/test_Scala3_multimodule/validate.groovy
@@ -0,0 +1,20 @@
+try {
+
+ def module1ScoverageFile = new File(basedir, "module01/target/scoverage.xml")
+ assert module1ScoverageFile.exists()
+
+ def module1ReportFile = new File(basedir, "module01/target/site/scoverage/index.html")
+ assert module1ReportFile.exists()
+
+ def aggregatedScoverageFile = new File(basedir, "target/scoverage.xml")
+ assert aggregatedScoverageFile.exists()
+
+ def aggregatedReportFile = new File(basedir, "target/site/scoverage/index.html")
+ assert aggregatedReportFile.exists()
+
+ return true
+
+} catch (Throwable e) {
+ e.printStackTrace()
+ return false
+}
diff --git a/src/main/java/org/scoverage/plugin/SCoveragePreCompileMojo.java b/src/main/java/org/scoverage/plugin/SCoveragePreCompileMojo.java
index 931a4d2c..b9adcf31 100644
--- a/src/main/java/org/scoverage/plugin/SCoveragePreCompileMojo.java
+++ b/src/main/java/org/scoverage/plugin/SCoveragePreCompileMojo.java
@@ -33,6 +33,7 @@
import org.apache.maven.artifact.resolver.ArtifactResolver;
import org.apache.maven.artifact.versioning.ArtifactVersion;
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
+import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Dependency;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
@@ -155,6 +156,12 @@ public class SCoveragePreCompileMojo
@Parameter( defaultValue = "${project}", readonly = true, required = true )
private MavenProject project;
+ /**
+ * The current Maven session.
+ */
+ @Parameter( defaultValue = "${session}", readonly = true, required = true )
+ private MavenSession session;
+
/**
* All Maven projects in the reactor.
*/
@@ -283,7 +290,7 @@ public void execute() throws MojoExecutionException
String _scalacOptions = quoteArgument( arg );
String addScalacArgs = arg;
- arg = scala2 ? ( SOURCE_ROOT_OPTION + project.getBasedir().getAbsolutePath() ) : "";
+ arg = scala2 ? ( SOURCE_ROOT_OPTION + session.getExecutionRootDirectory() ) : "";
_scalacOptions = _scalacOptions + SPACE + quoteArgument( arg );
addScalacArgs = addScalacArgs + PIPE + arg;
diff --git a/src/main/java/org/scoverage/plugin/SCoverageReportMojo.java b/src/main/java/org/scoverage/plugin/SCoverageReportMojo.java
index 3dae4d1b..14120cfb 100644
--- a/src/main/java/org/scoverage/plugin/SCoverageReportMojo.java
+++ b/src/main/java/org/scoverage/plugin/SCoverageReportMojo.java
@@ -23,17 +23,16 @@
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
-import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
-import java.util.Queue;
import java.util.ResourceBundle;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.maven.doxia.siterenderer.RenderingContext;
import org.apache.maven.doxia.siterenderer.sink.SiteRendererSink;
+import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Execute;
@@ -58,7 +57,6 @@
import scoverage.reporter.IOUtils;
import scoverage.serialize.Serializer;
import scoverage.reporter.CoberturaXmlWriter;
-import scoverage.reporter.CoverageAggregator;
import scoverage.reporter.ScoverageHtmlWriter;
import scoverage.reporter.ScoverageXmlWriter;
@@ -131,6 +129,12 @@ public class SCoverageReportMojo
@Parameter( defaultValue = "${project}", readonly = true, required = true )
private MavenProject project;
+ /**
+ * The current Maven session.
+ */
+ @Parameter(defaultValue = "${session}", readonly = true, required = true)
+ private MavenSession session;
+
/**
* All Maven projects in the reactor.
*/
@@ -423,7 +427,7 @@ private void generateReports()
File coverageFile = Serializer.coverageFile( dataDirectory );
getLog().info( String.format( "Reading scoverage instrumentation [%s]...", coverageFile.getAbsolutePath() ) );
- Coverage coverage = Serializer.deserialize( coverageFile, project.getBasedir() );
+ Coverage coverage = Serializer.deserialize( coverageFile, executionRootDirectory() );
getLog().info( String.format( "Reading scoverage measurements [%s*]...",
new File( dataDirectory, Constants.MeasurementsPrefix() ).getAbsolutePath() ) );
@@ -444,22 +448,17 @@ private void generateAggregatedReports()
AtomicInteger id = new AtomicInteger();
List scoverageDataDirs = new ArrayList();
List sourceRoots = new ArrayList();
- MavenProject topLevelModule = null;
for ( MavenProject module : reactorProjects )
{
- if ( module.isExecutionRoot() )
- {
- topLevelModule = module;
- }
- else if ( !module.getPackaging().equals( "pom" ) )
+ if ( !module.getPackaging().equals( "pom" ) )
{
- File scoverageDataDir = rebase( dataDirectory, module );
+ File scoverageDataDir = rebase( dataDirectory, module.getBasedir() );
if ( scoverageDataDir.isDirectory() )
{
scoverageDataDirs.add( scoverageDataDir );
File coverageFile = Serializer.coverageFile(scoverageDataDir);
if (coverageFile.exists()) {
- Coverage subCoverage = Serializer.deserialize(coverageFile, module.getBasedir());
+ Coverage subCoverage = Serializer.deserialize(coverageFile, executionRootDirectory() );
List measurementFiles = Arrays.asList( IOUtils.findMeasurementFiles( scoverageDataDir ) );
scala.collection.Set> measurements =
IOUtils.invoked( CollectionConverters.asScala( measurementFiles ).toSeq(), encoding );
@@ -537,40 +536,15 @@ else if ( !module.getPackaging().equals( "pom" ) )
scoverageDataDirs.size() ) );
}
- /* traverse up the module tree until a module isExecutionRoot */
- if ( topLevelModule == null )
- {
- Queue candidateForTopLevelModules = new ArrayDeque<>(reactorProjects);
- while ( !candidateForTopLevelModules.isEmpty() )
- {
- MavenProject module = candidateForTopLevelModules.poll();
- if ( module.isExecutionRoot() )
- {
- topLevelModule = module;
- break;
- }
- if ( module.hasParent() )
- {
- candidateForTopLevelModules.add(module.getParent());
- }
- }
- }
- if ( topLevelModule == null )
- {
- // This exception should never be thrown.
- throw new IllegalStateException("Cannot find the top level module to write the " +
- "aggregated reports.");
- }
+ File executionRootOutputDirectory = rebase( outputDirectory, executionRootDirectory() );
+ File executionRootXmlOutputDirectory = rebase( xmlOutputDirectory, executionRootDirectory() );
- File topLevelModuleOutputDirectory = rebase( outputDirectory, topLevelModule );
- File topLevelModuleXmlOutputDirectory = rebase( xmlOutputDirectory, topLevelModule );
-
- mkdirs( topLevelModuleOutputDirectory );
- mkdirs( topLevelModuleXmlOutputDirectory );
+ mkdirs( executionRootOutputDirectory );
+ mkdirs( executionRootXmlOutputDirectory );
getLog().info( "Generating coverage aggregated reports..." );
- writeReports( coverage, sourceRoots, topLevelModuleXmlOutputDirectory, topLevelModuleXmlOutputDirectory,
- topLevelModuleOutputDirectory );
+ writeReports( coverage, sourceRoots, executionRootXmlOutputDirectory, executionRootXmlOutputDirectory,
+ executionRootOutputDirectory );
getLog().info( "Coverage aggregated reports completed." );
}
@@ -610,10 +584,15 @@ else if ( directory.exists() && !directory.isDirectory() )
}
}
- private File rebase( File file, MavenProject otherModule )
+ private File rebase( File file, File otherProjectDir )
{
return new File( file.getAbsolutePath().replace( project.getBasedir().getAbsolutePath(),
- otherModule.getBasedir().getAbsolutePath() ) );
+ otherProjectDir.getAbsolutePath() ) );
+ }
+
+ private File executionRootDirectory()
+ {
+ return new File(session.getExecutionRootDirectory());
}
}