diff --git a/README.md b/README.md
index 39ceafc6..2250739a 100644
--- a/README.md
+++ b/README.md
@@ -328,7 +328,7 @@ If you want to customize plugin's configuration parameters used by compilation s
Read [SBT SCoverage Plugin documentation](https://github.com/scoverage/sbt-scoverage) for more information about
[excludedPackages and excludedFiles](https://github.com/scoverage/sbt-scoverage?tab=readme-ov-file#exclude-classes-and-packages-and-files).
-File and package exclusions are supported for Scala 2 and Scala 3 since version `3.4.2`.
+File and package exclusions are supported for Scala 2, Scala [`3.3.4`-`3.4.0`) and `3.4.2`+.
### Checking minimum test coverage level
diff --git a/src/it/test_exclusion_Scala3_3_3/invoker.properties b/src/it/test_exclusion_Scala3_3_3/invoker.properties
new file mode 100644
index 00000000..3e51a5a6
--- /dev/null
+++ b/src/it/test_exclusion_Scala3_3_3/invoker.properties
@@ -0,0 +1 @@
+invoker.goals=clean verify site -e -ntp
\ No newline at end of file
diff --git a/src/it/test_exclusion_Scala3_3_3/pom.xml b/src/it/test_exclusion_Scala3_3_3/pom.xml
new file mode 100644
index 00000000..511eca15
--- /dev/null
+++ b/src/it/test_exclusion_Scala3_3_3/pom.xml
@@ -0,0 +1,51 @@
+
+
+
+ 4.0.0
+
+
+ it.scoverage-maven-plugin
+ integration_tests_parent
+ 1.0-SNAPSHOT
+ ../integration_tests_parent/pom.xml
+
+
+ test_exclusion
+ 1.0-SNAPSHOT
+ jar
+ Test Scoverage exclusion
+ Test Scoverage exclusion
+
+
+ 3
+ 3.3.3
+ scala3-library_3
+ UTF-8
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ net.alchim31.maven
+ scala-maven-plugin
+
+
+ org.scalatest
+ scalatest-maven-plugin
+
+
+ @project.groupId@
+ @project.artifactId@
+
+ .*package02.*;.*package05
+ .*Package03HelloService.*;.*Package03ByeService
+
+
+
+
+
diff --git a/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package01/Package01HelloService.scala b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package01/Package01HelloService.scala
new file mode 100644
index 00000000..55ada336
--- /dev/null
+++ b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package01/Package01HelloService.scala
@@ -0,0 +1,8 @@
+package org.package01
+
+object Package01HelloService {
+
+ // gonna be included in coverage report
+ def hello: String = "Hello from package01"
+
+}
diff --git a/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package02/nested02/package02nested02objects.scala b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package02/nested02/package02nested02objects.scala
new file mode 100644
index 00000000..00f40ebe
--- /dev/null
+++ b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package02/nested02/package02nested02objects.scala
@@ -0,0 +1,14 @@
+// gonna be excluded from coverage report by package exclusion
+package org.package02.nested02
+
+object ImGonnaBeExcludedCauseImInPackage02Nested02 {
+
+ def hello: String = "Hello from package02.nested02"
+
+}
+
+object SameStoryBro {
+
+ def hello: String = "Hello from package02.nested02 again"
+
+}
diff --git a/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package02/package02objects.scala b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package02/package02objects.scala
new file mode 100644
index 00000000..fca9d0c8
--- /dev/null
+++ b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package02/package02objects.scala
@@ -0,0 +1,14 @@
+// gonna be excluded from coverage report by package exclusion
+package org.package02
+
+object ImGonnaBeExcludedCauseImInPackage02 {
+
+ def hello: String = "Hello from package02"
+
+}
+
+object SameStoryBro {
+
+ def hello: String = "Hello from package02 again"
+
+}
diff --git a/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package03/Package03ByeService.scala b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package03/Package03ByeService.scala
new file mode 100644
index 00000000..56914ec8
--- /dev/null
+++ b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package03/Package03ByeService.scala
@@ -0,0 +1,8 @@
+package org.package03
+
+object Package03ByeService {
+
+ // gonna be excluded from coverage report by file exclusion
+ def bye: String = "Bye from package03"
+
+}
diff --git a/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package03/Package03HelloService1.scala b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package03/Package03HelloService1.scala
new file mode 100644
index 00000000..2d05b244
--- /dev/null
+++ b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package03/Package03HelloService1.scala
@@ -0,0 +1,8 @@
+package org.package03
+
+object Package03HelloService1 {
+
+ // gonna be excluded from coverage report by file exclusion
+ def hello: String = "Hello from package03 service 1"
+
+}
diff --git a/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package03/Package03HelloService2.scala b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package03/Package03HelloService2.scala
new file mode 100644
index 00000000..38c422b2
--- /dev/null
+++ b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package03/Package03HelloService2.scala
@@ -0,0 +1,8 @@
+package org.package03
+
+object Package03HelloService2 {
+
+ // gonna be excluded from coverage report by file exclusion
+ def hello: String = "Hello from package03 service 2"
+
+}
diff --git a/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package05/package05objects.scala b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package05/package05objects.scala
new file mode 100644
index 00000000..7b5cca13
--- /dev/null
+++ b/src/it/test_exclusion_Scala3_3_3/src/main/scala/org/package05/package05objects.scala
@@ -0,0 +1,14 @@
+// gonna be excluded from coverage report by package exclusion
+package org.package05
+
+object ImGonnaBeExcludedCauseImInPackage05 {
+
+ def hello: String = "Hello from package05"
+
+}
+
+object SameStoryBro {
+
+ def hello: String = "Hello from package05 again"
+
+}
diff --git a/src/it/test_exclusion_Scala3_3_3/src/test/scala/org/package01/Package01HelloServiceTest.scala b/src/it/test_exclusion_Scala3_3_3/src/test/scala/org/package01/Package01HelloServiceTest.scala
new file mode 100644
index 00000000..ebe11c6b
--- /dev/null
+++ b/src/it/test_exclusion_Scala3_3_3/src/test/scala/org/package01/Package01HelloServiceTest.scala
@@ -0,0 +1,12 @@
+package org.package01
+
+import org.scalatest.wordspec.AnyWordSpec
+
+class Package01HelloServiceTest extends AnyWordSpec {
+
+ "Package01HelloService" should {
+ "say hello" in {
+ assert(Package01HelloService.hello == "Hello from package01")
+ }
+ }
+}
diff --git a/src/it/test_exclusion_Scala3_3_3/validate.groovy b/src/it/test_exclusion_Scala3_3_3/validate.groovy
new file mode 100644
index 00000000..bb74ac01
--- /dev/null
+++ b/src/it/test_exclusion_Scala3_3_3/validate.groovy
@@ -0,0 +1,14 @@
+try {
+
+ def logFile = new File(basedir, "build.log")
+ def lines = logFile.readLines()
+ assert lines.contains("[WARNING] Package exclusion is supported for Scala [3.3.4-3.4.0) or 3.4.2+")
+ assert lines.contains("[WARNING] File exclusion is supported for Scala [3.3.4-3.4.0) or 3.4.2+")
+ assert lines.contains("[INFO] Statement coverage.: 10.00%")
+
+ return true
+
+} catch (Throwable e) {
+ e.printStackTrace()
+ return false
+}
diff --git a/src/it/test_exclusion_Scala3_3_4/invoker.properties b/src/it/test_exclusion_Scala3_3_4/invoker.properties
new file mode 100644
index 00000000..3e51a5a6
--- /dev/null
+++ b/src/it/test_exclusion_Scala3_3_4/invoker.properties
@@ -0,0 +1 @@
+invoker.goals=clean verify site -e -ntp
\ No newline at end of file
diff --git a/src/it/test_exclusion_Scala3_3_4/pom.xml b/src/it/test_exclusion_Scala3_3_4/pom.xml
new file mode 100644
index 00000000..49948b39
--- /dev/null
+++ b/src/it/test_exclusion_Scala3_3_4/pom.xml
@@ -0,0 +1,51 @@
+
+
+
+ 4.0.0
+
+
+ it.scoverage-maven-plugin
+ integration_tests_parent
+ 1.0-SNAPSHOT
+ ../integration_tests_parent/pom.xml
+
+
+ test_exclusion
+ 1.0-SNAPSHOT
+ jar
+ Test Scoverage exclusion
+ Test Scoverage exclusion
+
+
+ 3
+ 3.3.4
+ scala3-library_3
+ UTF-8
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ net.alchim31.maven
+ scala-maven-plugin
+
+
+ org.scalatest
+ scalatest-maven-plugin
+
+
+ @project.groupId@
+ @project.artifactId@
+
+ .*package02.*;.*package05
+ .*Package03HelloService.*;.*Package03ByeService
+
+
+
+
+
diff --git a/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package01/Package01HelloService.scala b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package01/Package01HelloService.scala
new file mode 100644
index 00000000..55ada336
--- /dev/null
+++ b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package01/Package01HelloService.scala
@@ -0,0 +1,8 @@
+package org.package01
+
+object Package01HelloService {
+
+ // gonna be included in coverage report
+ def hello: String = "Hello from package01"
+
+}
diff --git a/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package02/nested02/package02nested02objects.scala b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package02/nested02/package02nested02objects.scala
new file mode 100644
index 00000000..00f40ebe
--- /dev/null
+++ b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package02/nested02/package02nested02objects.scala
@@ -0,0 +1,14 @@
+// gonna be excluded from coverage report by package exclusion
+package org.package02.nested02
+
+object ImGonnaBeExcludedCauseImInPackage02Nested02 {
+
+ def hello: String = "Hello from package02.nested02"
+
+}
+
+object SameStoryBro {
+
+ def hello: String = "Hello from package02.nested02 again"
+
+}
diff --git a/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package02/package02objects.scala b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package02/package02objects.scala
new file mode 100644
index 00000000..fca9d0c8
--- /dev/null
+++ b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package02/package02objects.scala
@@ -0,0 +1,14 @@
+// gonna be excluded from coverage report by package exclusion
+package org.package02
+
+object ImGonnaBeExcludedCauseImInPackage02 {
+
+ def hello: String = "Hello from package02"
+
+}
+
+object SameStoryBro {
+
+ def hello: String = "Hello from package02 again"
+
+}
diff --git a/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package03/Package03ByeService.scala b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package03/Package03ByeService.scala
new file mode 100644
index 00000000..56914ec8
--- /dev/null
+++ b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package03/Package03ByeService.scala
@@ -0,0 +1,8 @@
+package org.package03
+
+object Package03ByeService {
+
+ // gonna be excluded from coverage report by file exclusion
+ def bye: String = "Bye from package03"
+
+}
diff --git a/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package03/Package03HelloService1.scala b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package03/Package03HelloService1.scala
new file mode 100644
index 00000000..2d05b244
--- /dev/null
+++ b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package03/Package03HelloService1.scala
@@ -0,0 +1,8 @@
+package org.package03
+
+object Package03HelloService1 {
+
+ // gonna be excluded from coverage report by file exclusion
+ def hello: String = "Hello from package03 service 1"
+
+}
diff --git a/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package03/Package03HelloService2.scala b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package03/Package03HelloService2.scala
new file mode 100644
index 00000000..38c422b2
--- /dev/null
+++ b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package03/Package03HelloService2.scala
@@ -0,0 +1,8 @@
+package org.package03
+
+object Package03HelloService2 {
+
+ // gonna be excluded from coverage report by file exclusion
+ def hello: String = "Hello from package03 service 2"
+
+}
diff --git a/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package05/package05objects.scala b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package05/package05objects.scala
new file mode 100644
index 00000000..7b5cca13
--- /dev/null
+++ b/src/it/test_exclusion_Scala3_3_4/src/main/scala/org/package05/package05objects.scala
@@ -0,0 +1,14 @@
+// gonna be excluded from coverage report by package exclusion
+package org.package05
+
+object ImGonnaBeExcludedCauseImInPackage05 {
+
+ def hello: String = "Hello from package05"
+
+}
+
+object SameStoryBro {
+
+ def hello: String = "Hello from package05 again"
+
+}
diff --git a/src/it/test_exclusion_Scala3_3_4/src/test/scala/org/package01/Package01HelloServiceTest.scala b/src/it/test_exclusion_Scala3_3_4/src/test/scala/org/package01/Package01HelloServiceTest.scala
new file mode 100644
index 00000000..ebe11c6b
--- /dev/null
+++ b/src/it/test_exclusion_Scala3_3_4/src/test/scala/org/package01/Package01HelloServiceTest.scala
@@ -0,0 +1,12 @@
+package org.package01
+
+import org.scalatest.wordspec.AnyWordSpec
+
+class Package01HelloServiceTest extends AnyWordSpec {
+
+ "Package01HelloService" should {
+ "say hello" in {
+ assert(Package01HelloService.hello == "Hello from package01")
+ }
+ }
+}
diff --git a/src/it/test_exclusion_Scala3_3_4/validate.groovy b/src/it/test_exclusion_Scala3_3_4/validate.groovy
new file mode 100644
index 00000000..ce78045d
--- /dev/null
+++ b/src/it/test_exclusion_Scala3_3_4/validate.groovy
@@ -0,0 +1,19 @@
+try {
+
+ def logFile = new File(basedir, "build.log")
+ def lines = logFile.readLines()
+ assert lines.contains("[INFO] Statement coverage.: 100.00%")
+ assert lines.contains("[INFO] Branch coverage....: 100.00%")
+
+ def scoverageFile = new File(basedir, "target/scoverage.xml")
+ assert scoverageFile.exists()
+
+ def reportFile = new File(basedir, "target/site/scoverage/index.html")
+ assert reportFile.exists()
+
+ return true
+
+} catch (Throwable e) {
+ e.printStackTrace()
+ return false
+}
diff --git a/src/it/test_exclusion_Scala3_4_1/validate.groovy b/src/it/test_exclusion_Scala3_4_1/validate.groovy
index 0e0f82ad..bb74ac01 100644
--- a/src/it/test_exclusion_Scala3_4_1/validate.groovy
+++ b/src/it/test_exclusion_Scala3_4_1/validate.groovy
@@ -2,8 +2,8 @@ try {
def logFile = new File(basedir, "build.log")
def lines = logFile.readLines()
- assert lines.contains("[WARNING] Package exclusion is supported since Scala 3.4.2")
- assert lines.contains("[WARNING] File exclusion is supported since Scala 3.4.2")
+ assert lines.contains("[WARNING] Package exclusion is supported for Scala [3.3.4-3.4.0) or 3.4.2+")
+ assert lines.contains("[WARNING] File exclusion is supported for Scala [3.3.4-3.4.0) or 3.4.2+")
assert lines.contains("[INFO] Statement coverage.: 10.00%")
return true
diff --git a/src/main/java/org/scoverage/plugin/SCoveragePreCompileMojo.java b/src/main/java/org/scoverage/plugin/SCoveragePreCompileMojo.java
index c42cba8b..236c24c8 100644
--- a/src/main/java/org/scoverage/plugin/SCoveragePreCompileMojo.java
+++ b/src/main/java/org/scoverage/plugin/SCoveragePreCompileMojo.java
@@ -278,6 +278,10 @@ public void execute() throws MojoExecutionException
try
{
boolean scala2 = resolvedScalaVersion.isScala2();
+ boolean filePackageExclusionSupportingScala3 =
+ resolvedScalaVersion.isAtLeast( "3.4.2" ) ||
+ // backported to Scala 3.3 LTS
+ ( resolvedScalaVersion.full.startsWith( "3.3." ) && resolvedScalaVersion.isAtLeast( "3.3.4" ) );
List pluginArtifacts = getScalaScoveragePluginArtifacts( resolvedScalaVersion );
if ( scala2 ) // Scala 3 doesn't need scalac-scoverage-runtime
@@ -300,13 +304,13 @@ public void execute() throws MojoExecutionException
arg = SCALA2_EXCLUDED_PACKAGES_OPTION + excludedPackages.replace( "(empty)", "" );
_scalacOptions = _scalacOptions + SPACE + quoteArgument( arg );
addScalacArgs = addScalacArgs + PIPE + arg;
- } else if ( resolvedScalaVersion.isAtLeast( "3.4.2" ) ) {
+ } else if ( filePackageExclusionSupportingScala3 ) {
String scala3FormatExcludedPackages = excludedPackages.replace( ";", "," );
arg = SCALA3_EXCLUDED_PACKAGES_OPTION + scala3FormatExcludedPackages;
_scalacOptions = _scalacOptions + SPACE + quoteArgument( arg );
addScalacArgs = addScalacArgs + PIPE + arg;
} else {
- getLog().warn( "Package exclusion is supported since Scala 3.4.2" );
+ getLog().warn( "Package exclusion is supported for Scala [3.3.4-3.4.0) or 3.4.2+" );
}
}
@@ -316,13 +320,13 @@ public void execute() throws MojoExecutionException
arg = SCALA2_EXCLUDED_FILES_OPTION + excludedFiles;
_scalacOptions = _scalacOptions + SPACE + quoteArgument( arg );
addScalacArgs = addScalacArgs + PIPE + arg;
- } else if ( resolvedScalaVersion.isAtLeast( "3.4.2" ) ) {
+ } else if ( filePackageExclusionSupportingScala3 ) {
String scala3FormatExcludedFiles = excludedFiles.replace( ";", "," );
arg = SCALA3_EXCLUDED_FILES_OPTION + scala3FormatExcludedFiles;
_scalacOptions = _scalacOptions + SPACE + quoteArgument( arg );
addScalacArgs = addScalacArgs + PIPE + arg;
} else {
- getLog().warn( "File exclusion is supported since Scala 3.4.2" );
+ getLog().warn( "File exclusion is supported for Scala [3.3.4-3.4.0) or 3.4.2+" );
}
}