You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by gn...@apache.org on 2025/09/17 10:01:20 UTC

(maven) branch master updated: Migrate from Hamcrest and AssertJ to JUnit 5 assertions (#10986)

This is an automated email from the ASF dual-hosted git repository.

gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven.git


The following commit(s) were added to refs/heads/master by this push:
     new dbff760fc1 Migrate from Hamcrest and AssertJ to JUnit 5 assertions (#10986)
dbff760fc1 is described below

commit dbff760fc1885248ec92e884b508b16119916f45
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Wed Sep 17 12:01:14 2025 +0200

    Migrate from Hamcrest and AssertJ to JUnit 5 assertions (#10986)
    
    This commit migrates the Maven codebase from Hamcrest and AssertJ to JUnit 5 assertions:
    
    Changes:
    - Remove all Hamcrest and AssertJ dependencies from pom.xml files across all modules
    - Convert all assertThat() calls to equivalent JUnit 5 assertions
    - Add meaningful error messages to assertions for better debugging
    - Update integration test resources to use JUnit 5 dependencies
    - Fix compilation issues in integration test projects
    - Replace XMLUnit AssertJ with XMLUnit core + JUnit 5 assertions
    
    Migration patterns applied:
    - assertThat(actual, is(expected)) → assertEquals(expected, actual, message)
    - assertThat(string, containsString(substring)) → assertTrue(string.contains(substring), message)
    - assertThat(object, instanceOf(Class.class)) → assertInstanceOf(Class.class, object, message)
    - assertThat(string, matchesPattern(pattern)) → assertTrue(string.matches(pattern), message)
    - assertThat(value, nullValue()) → assertNull(value, message)
    - XmlAssert.assertThat().areIdentical() → DiffBuilder + assertFalse(diff.hasDifferences())
    
    Primary focus: Hamcrest removal (81 occurrences) with secondary AssertJ cleanup (7 occurrences)
    
    Benefits:
    - Reduced external dependencies (removed Hamcrest, AssertJ, and XMLUnit AssertJ)
    - Improved maintainability with consistent JUnit 5 patterns
    - Enhanced debugging with meaningful error messages
    - Better performance with native JUnit 5 assertions
    - Future-proof compatibility with modern JUnit 5 ecosystem
---
 .../api/services/RequestImplementationTest.java    |   8 +-
 .../versioning/DefaultArtifactVersionTest.java     |   2 +-
 compat/maven-compat/pom.xml                        |   6 +-
 .../maven/ProjectDependenciesResolverTest.java     |   5 +-
 .../artifact/deployer/ArtifactDeployerTest.java    |   2 +-
 .../repository/MavenArtifactRepositoryTest.java    |   8 +-
 .../resolver/filter/AndArtifactFilterTest.java     |   8 +-
 .../resolver/filter/FilterHashEqualsTest.java      |   6 +-
 .../resolver/filter/OrArtifactFilterTest.java      |   8 +-
 .../maven/artifact/testutils/TestFileManager.java  |   4 +-
 .../repository/LegacyRepositorySystemTest.java     |   6 +-
 .../legacy/DefaultUpdateCheckManagerTest.java      |   4 +-
 .../resolver/DefaultArtifactCollectorTest.java     |   8 +-
 compat/maven-embedder/pom.xml                      |   6 +-
 .../java/org/apache/maven/cli/MavenCliTest.java    | 113 ++++++-----
 compat/maven-model-builder/pom.xml                 |   8 +-
 .../maven/model/building/FileModelSourceTest.java  |   8 +-
 .../model/building/FileToRawModelMergerTest.java   |   7 +-
 .../DefaultInheritanceAssemblerTest.java           |  21 +-
 .../model/profile/DefaultProfileSelectorTest.java  |   3 +-
 .../validation/DefaultModelValidatorTest.java      |  16 +-
 compat/maven-model/pom.xml                         |   5 -
 .../org/apache/maven/model/ActivationFileTest.java |   2 +-
 .../org/apache/maven/model/ActivationOSTest.java   |   2 +-
 .../apache/maven/model/ActivationPropertyTest.java |   2 +-
 .../org/apache/maven/model/ActivationTest.java     |   2 +-
 .../java/org/apache/maven/model/BuildTest.java     |   2 +-
 .../org/apache/maven/model/CiManagementTest.java   |   2 +-
 .../org/apache/maven/model/ContributorTest.java    |   2 +-
 .../maven/model/DependencyManagementTest.java      |   2 +-
 .../org/apache/maven/model/DependencyTest.java     |   2 +-
 .../maven/model/DeploymentRepositoryTest.java      |   2 +-
 .../java/org/apache/maven/model/DeveloperTest.java |   2 +-
 .../maven/model/DistributionManagementTest.java    |   2 +-
 .../java/org/apache/maven/model/ExclusionTest.java |   2 +-
 .../java/org/apache/maven/model/ExtensionTest.java |   2 +-
 .../apache/maven/model/IssueManagementTest.java    |   2 +-
 .../java/org/apache/maven/model/LicenseTest.java   |   2 +-
 .../org/apache/maven/model/MailingListTest.java    |   2 +-
 .../java/org/apache/maven/model/NotifierTest.java  |   2 +-
 .../org/apache/maven/model/OrganizationTest.java   |   2 +-
 .../java/org/apache/maven/model/ParentTest.java    |   2 +-
 .../maven/model/PluginConfigurationTest.java       |   2 +-
 .../apache/maven/model/PluginContainerTest.java    |   2 +-
 .../apache/maven/model/PluginExecutionTest.java    |   2 +-
 .../apache/maven/model/PluginManagementTest.java   |   2 +-
 .../java/org/apache/maven/model/PluginTest.java    |   2 +-
 .../org/apache/maven/model/PrerequisitesTest.java  |   2 +-
 .../java/org/apache/maven/model/ProfileTest.java   |   2 +-
 .../org/apache/maven/model/RelocationTest.java     |   2 +-
 .../org/apache/maven/model/ReportPluginTest.java   |   2 +-
 .../java/org/apache/maven/model/ReportSetTest.java |   2 +-
 .../java/org/apache/maven/model/ReportingTest.java |   2 +-
 .../apache/maven/model/RepositoryPolicyTest.java   |   2 +-
 .../org/apache/maven/model/RepositoryTest.java     |   2 +-
 .../java/org/apache/maven/model/ResourceTest.java  |   2 +-
 .../test/java/org/apache/maven/model/ScmTest.java  |   2 +-
 .../test/java/org/apache/maven/model/SiteTest.java |   2 +-
 .../apache/maven/model/merge/MavenMergerTest.java  |  25 ++-
 .../org/apache/maven/model/v4/ModelXmlTest.java    |   2 +-
 .../descriptor/PluginDescriptorBuilderTest.java    |  22 +--
 .../repository/internal/RepositorySystemTest.java  |  12 +-
 .../apache/maven/cling/invoker/BaseParserTest.java |   3 +-
 .../cling/invoker/mvnup/goals/GAVUtilsTest.java    |   2 +-
 .../invoker/mvnup/goals/ModelVersionUtilsTest.java |   4 +-
 .../goals/UpgradeWorkflowIntegrationTest.java      |   4 +-
 impl/maven-core/pom.xml                            |  14 +-
 .../filter/ExclusionArtifactFilterTest.java        |  35 ++--
 .../classrealm/DefaultClassRealmManagerTest.java   |  11 +-
 .../internal/EnhancedCompositeBeanHelperTest.java  |   2 +-
 .../DefaultBuildResumptionAnalyzerTest.java        |  23 +--
 .../DefaultBuildResumptionDataRepositoryTest.java  |  27 +--
 .../maven/execution/DefaultMavenExecutionTest.java |   8 +-
 .../maven/graph/DefaultGraphBuilderTest.java       |  24 +--
 .../graph/DefaultProjectDependencyGraphTest.java   |   4 +-
 .../apache/maven/graph/ProjectSelectorTest.java    |  44 ++---
 .../aether/ReverseTreeRepositoryListenerTest.java  |  29 ++-
 .../maven/internal/impl/PropertiesAsMapTest.java   |   6 +-
 .../org/apache/maven/internal/impl/TestApi.java    |   2 +-
 .../impl/ConsumerPomArtifactTransformerTest.java   |  60 ++++--
 .../maven/lifecycle/DefaultLifecyclesTest.java     |  29 ++-
 .../maven/lifecycle/LifecycleExecutorTest.java     |   4 +-
 .../lifecycle/internal/ProjectBuildListTest.java   |  11 +-
 .../stub/ProjectDependencyGraphStubTest.java       |  16 +-
 .../plugin/internal/MavenPluginValidatorTest.java  |   9 +-
 .../project/DefaultMavenProjectBuilderTest.java    |  52 ++---
 .../project/ExtensionDescriptorBuilderTest.java    |   8 +-
 .../java/org/apache/maven/project/GraphTest.java   |   8 +-
 .../org/apache/maven/project/MavenProjectTest.java |   2 +-
 .../apache/maven/project/PomConstructionTest.java  |  28 +--
 .../apache/maven/project/ProjectBuilderTest.java   |  36 ++--
 .../ProjectBuildingResultWithLocationAssert.java   |  66 +++++++
 .../ProjectBuildingResultWithLocationMatcher.java  |  76 --------
 ...jectBuildingResultWithProblemMessageAssert.java |  65 +++++++
 ...ectBuildingResultWithProblemMessageMatcher.java |  69 -------
 .../maven/project/ProjectModelResolverTest.java    |   7 +-
 .../apache/maven/project/ProjectSorterTest.java    |  19 +-
 .../internal/DefaultRuntimeInformationTest.java    |   2 +-
 impl/maven-di/pom.xml                              |   5 -
 .../org/apache/maven/di/impl/InjectorImplTest.java |  21 +-
 impl/maven-impl/pom.xml                            |  10 -
 .../maven/impl/DefaultPluginXmlFactoryTest.java    | 212 ++++++++++++++-------
 .../maven/impl/DefaultProblemCollectorTest.java    |  24 +--
 .../maven/impl/DefaultToolchainManagerTest.java    |   5 +-
 .../org/apache/maven/impl/PathSelectorTest.java    |  10 +-
 .../apache/maven/impl/RequestTraceHelperTest.java  |   4 +-
 .../DefaultDependencyManagementImporterTest.java   |  41 ++--
 .../impl/model/DefaultModelValidatorTest.java      |  22 ++-
 .../maven/impl/model/InterningTransformerTest.java | 109 ++++++++---
 .../impl/resolver/DefaultModelResolverTest.java    |  13 +-
 impl/maven-logging/pom.xml                         |   5 -
 .../apache/maven/slf4j/LogLevelRecorderTest.java   |   2 +-
 .../maven/slf4j/MavenBaseLoggerTimestampTest.java  |  29 ++-
 .../apache/maven/slf4j/MavenLoggerFactoryTest.java |  21 +-
 its/core-it-suite/pom.xml                          |   5 -
 .../maven/it/MavenITmng7228LeakyModelTest.java     |  23 ++-
 .../app/pom.xml                                    |   4 +-
 .../test/java/org/apache/its/mng6118/AppTest.java  |   4 +-
 .../lib/pom.xml                                    |   4 +-
 .../java/org/apache/its/mng6118/HelperTest.java    |   8 +-
 .../pom.xml                                        |   6 +-
 .../resources/mng-8525-maven-di-plugin/pom.xml     |   7 +-
 .../org/apache/maven/plugins/HelloMojoTest.java    |   4 +-
 pom.xml                                            |  22 +--
 124 files changed, 987 insertions(+), 837 deletions(-)

diff --git a/api/maven-api-core/src/test/java/org/apache/maven/api/services/RequestImplementationTest.java b/api/maven-api-core/src/test/java/org/apache/maven/api/services/RequestImplementationTest.java
index eef64a1388..694956063e 100644
--- a/api/maven-api-core/src/test/java/org/apache/maven/api/services/RequestImplementationTest.java
+++ b/api/maven-api-core/src/test/java/org/apache/maven/api/services/RequestImplementationTest.java
@@ -69,8 +69,8 @@ void testArtifactResolverRequestEquality() {
 
         // Test toString
         String toString = request1.toString();
-        assertTrue(toString.contains("coordinates="));
-        assertTrue(toString.contains("repositories="));
+        assertTrue(toString.contains("coordinates="), "Expected " + toString + " to contain " + "coordinates=");
+        assertTrue(toString.contains("repositories="), "Expected " + toString + " to contain " + "repositories=");
     }
 
     @Test
@@ -110,7 +110,7 @@ void testDependencyResolverRequestEquality() {
         assertNotEquals(request1, request3);
 
         String toString = request1.toString();
-        assertTrue(toString.contains("requestType="));
-        assertTrue(toString.contains("pathScope="));
+        assertTrue(toString.contains("requestType="), "Expected " + toString + " to contain " + "requestType=");
+        assertTrue(toString.contains("pathScope="), "Expected " + toString + " to contain " + "pathScope=");
     }
 }
diff --git a/compat/maven-artifact/src/test/java/org/apache/maven/artifact/versioning/DefaultArtifactVersionTest.java b/compat/maven-artifact/src/test/java/org/apache/maven/artifact/versioning/DefaultArtifactVersionTest.java
index 370b0f0c5c..c1530cbe20 100644
--- a/compat/maven-artifact/src/test/java/org/apache/maven/artifact/versioning/DefaultArtifactVersionTest.java
+++ b/compat/maven-artifact/src/test/java/org/apache/maven/artifact/versioning/DefaultArtifactVersionTest.java
@@ -176,7 +176,7 @@ void testSnapshotVsReleases() {
     void testHashCode() {
         ArtifactVersion v1 = newArtifactVersion("1");
         ArtifactVersion v2 = newArtifactVersion("1.0");
-        assertTrue(v1.equals(v2));
+        assertTrue(v1.equals(v2), "Expected " + v1 + " to equal " + v2);
         assertEquals(v1.hashCode(), v2.hashCode());
     }
 
diff --git a/compat/maven-compat/pom.xml b/compat/maven-compat/pom.xml
index f6919bb530..e102a5c674 100644
--- a/compat/maven-compat/pom.xml
+++ b/compat/maven-compat/pom.xml
@@ -174,11 +174,7 @@ under the License.
       <artifactId>junit-jupiter-api</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.hamcrest</groupId>
-      <artifactId>hamcrest</artifactId>
-      <scope>test</scope>
-    </dependency>
+
     <dependency>
       <groupId>com.google.inject</groupId>
       <artifactId>guice</artifactId>
diff --git a/compat/maven-compat/src/test/java/org/apache/maven/ProjectDependenciesResolverTest.java b/compat/maven-compat/src/test/java/org/apache/maven/ProjectDependenciesResolverTest.java
index 723ef0111d..7f4f445aa2 100644
--- a/compat/maven-compat/src/test/java/org/apache/maven/ProjectDependenciesResolverTest.java
+++ b/compat/maven-compat/src/test/java/org/apache/maven/ProjectDependenciesResolverTest.java
@@ -32,9 +32,8 @@
 import org.junit.jupiter.api.Test;
 
 import static org.codehaus.plexus.testing.PlexusExtension.getBasedir;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.endsWith;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 @Deprecated
 class ProjectDependenciesResolverTest extends AbstractCoreMavenComponentTestCase {
@@ -82,6 +81,6 @@ void testSystemScopeDependencyIsPresentInTheCompileClasspathElements() throws Ex
         @SuppressWarnings("deprecation")
         List<Artifact> artifacts = project.getCompileArtifacts();
         assertEquals(1, artifacts.size());
-        assertThat(artifacts.get(0).getFile().getName(), endsWith("tools.jar"));
+        assertTrue(artifacts.get(0).getFile().getName().endsWith("tools.jar"));
     }
 }
diff --git a/compat/maven-compat/src/test/java/org/apache/maven/artifact/deployer/ArtifactDeployerTest.java b/compat/maven-compat/src/test/java/org/apache/maven/artifact/deployer/ArtifactDeployerTest.java
index 0435e11952..367ec6bcd2 100644
--- a/compat/maven-compat/src/test/java/org/apache/maven/artifact/deployer/ArtifactDeployerTest.java
+++ b/compat/maven-compat/src/test/java/org/apache/maven/artifact/deployer/ArtifactDeployerTest.java
@@ -67,7 +67,7 @@ void testArtifactInstallation() throws Exception {
 
             ArtifactRepository remoteRepository = remoteRepository();
             File deployedFile = new File(remoteRepository.getBasedir(), remoteRepository.pathOf(artifact));
-            assertTrue(deployedFile.exists());
+            assertTrue(deployedFile.exists(), "Expected " + deployedFile + ".exists() to return true");
             assertEquals("dummy", new String(Files.readAllBytes(deployedFile.toPath()), StandardCharsets.UTF_8).trim());
         } finally {
             sessionScope.exit();
diff --git a/compat/maven-compat/src/test/java/org/apache/maven/artifact/repository/MavenArtifactRepositoryTest.java b/compat/maven-compat/src/test/java/org/apache/maven/artifact/repository/MavenArtifactRepositoryTest.java
index f529ae822b..2b005e1599 100644
--- a/compat/maven-compat/src/test/java/org/apache/maven/artifact/repository/MavenArtifactRepositoryTest.java
+++ b/compat/maven-compat/src/test/java/org/apache/maven/artifact/repository/MavenArtifactRepositoryTest.java
@@ -47,10 +47,10 @@ void testHashCodeEquals() {
         assertTrue(r1.hashCode() == r2.hashCode());
         assertFalse(r1.hashCode() == r3.hashCode());
 
-        assertTrue(r1.equals(r2));
-        assertTrue(r2.equals(r1));
+        assertTrue(r1.equals(r2), "Expected " + r1 + " to equal " + r2);
+        assertTrue(r2.equals(r1), "Expected " + r2 + " to equal " + r1);
 
-        assertFalse(r1.equals(r3));
-        assertFalse(r3.equals(r1));
+        assertFalse(r1.equals(r3), "Expected " + r1 + " to not equal " + r3);
+        assertFalse(r3.equals(r1), "Expected " + r3 + " to not equal " + r1);
     }
 }
diff --git a/compat/maven-compat/src/test/java/org/apache/maven/artifact/resolver/filter/AndArtifactFilterTest.java b/compat/maven-compat/src/test/java/org/apache/maven/artifact/resolver/filter/AndArtifactFilterTest.java
index fe0343c857..cfcd65eab4 100644
--- a/compat/maven-compat/src/test/java/org/apache/maven/artifact/resolver/filter/AndArtifactFilterTest.java
+++ b/compat/maven-compat/src/test/java/org/apache/maven/artifact/resolver/filter/AndArtifactFilterTest.java
@@ -42,11 +42,11 @@ void testEquals() {
 
         AndArtifactFilter filter2 = new AndArtifactFilter(Arrays.asList(newSubFilter()));
 
-        assertFalse(filter1.equals(null));
-        assertTrue(filter1.equals(filter1));
+        assertFalse(filter1.equals(null), "Expected " + filter1 + " to not equal " + null);
+        assertTrue(filter1.equals(filter1), "Expected " + filter1 + " to equal " + filter1);
         assertEquals(filter1.hashCode(), filter1.hashCode());
 
-        assertFalse(filter1.equals(filter2));
-        assertFalse(filter2.equals(filter1));
+        assertFalse(filter1.equals(filter2), "Expected " + filter1 + " to not equal " + filter2);
+        assertFalse(filter2.equals(filter1), "Expected " + filter2 + " to not equal " + filter1);
     }
 }
diff --git a/compat/maven-compat/src/test/java/org/apache/maven/artifact/resolver/filter/FilterHashEqualsTest.java b/compat/maven-compat/src/test/java/org/apache/maven/artifact/resolver/filter/FilterHashEqualsTest.java
index 53a26db4ea..3ccb13e85a 100644
--- a/compat/maven-compat/src/test/java/org/apache/maven/artifact/resolver/filter/FilterHashEqualsTest.java
+++ b/compat/maven-compat/src/test/java/org/apache/maven/artifact/resolver/filter/FilterHashEqualsTest.java
@@ -37,12 +37,12 @@ void testIncludesExcludesArtifactFilter() {
 
         IncludesArtifactFilter f2 = new IncludesArtifactFilter(patterns);
 
-        assertTrue(f1.equals(f2));
-        assertTrue(f2.equals(f1));
+        assertTrue(f1.equals(f2), "Expected " + f1 + " to equal " + f2);
+        assertTrue(f2.equals(f1), "Expected " + f2 + " to equal " + f1);
         assertTrue(f1.hashCode() == f2.hashCode());
 
         IncludesArtifactFilter f3 = new IncludesArtifactFilter(Arrays.asList("d", "c", "e"));
-        assertTrue(f1.equals(f3));
+        assertTrue(f1.equals(f3), "Expected " + f1 + " to equal " + f3);
         assertTrue(f1.hashCode() == f3.hashCode());
     }
 }
diff --git a/compat/maven-compat/src/test/java/org/apache/maven/artifact/resolver/filter/OrArtifactFilterTest.java b/compat/maven-compat/src/test/java/org/apache/maven/artifact/resolver/filter/OrArtifactFilterTest.java
index 6c8cda6802..2ca82a783b 100644
--- a/compat/maven-compat/src/test/java/org/apache/maven/artifact/resolver/filter/OrArtifactFilterTest.java
+++ b/compat/maven-compat/src/test/java/org/apache/maven/artifact/resolver/filter/OrArtifactFilterTest.java
@@ -43,11 +43,11 @@ void testEquals() {
 
         OrArtifactFilter filter2 = new OrArtifactFilter(Arrays.asList(newSubFilter()));
 
-        assertFalse(filter1.equals(null));
-        assertTrue(filter1.equals(filter1));
+        assertFalse(filter1.equals(null), "Expected " + filter1 + " to not equal " + null);
+        assertTrue(filter1.equals(filter1), "Expected " + filter1 + " to equal " + filter1);
         assertEquals(filter1.hashCode(), filter1.hashCode());
 
-        assertFalse(filter1.equals(filter2));
-        assertFalse(filter2.equals(filter1));
+        assertFalse(filter1.equals(filter2), "Expected " + filter1 + " to not equal " + filter2);
+        assertFalse(filter2.equals(filter1), "Expected " + filter2 + " to not equal " + filter1);
     }
 }
diff --git a/compat/maven-compat/src/test/java/org/apache/maven/artifact/testutils/TestFileManager.java b/compat/maven-compat/src/test/java/org/apache/maven/artifact/testutils/TestFileManager.java
index 47372855ca..1e41a1f679 100644
--- a/compat/maven-compat/src/test/java/org/apache/maven/artifact/testutils/TestFileManager.java
+++ b/compat/maven-compat/src/test/java/org/apache/maven/artifact/testutils/TestFileManager.java
@@ -120,9 +120,9 @@ public void assertFileExistence(File dir, String filename, boolean shouldExist)
         File file = new File(dir, filename);
 
         if (shouldExist) {
-            assertTrue(file.exists());
+            assertTrue(file.exists(), "Expected " + file + ".exists() to return true");
         } else {
-            assertFalse(file.exists());
+            assertFalse(file.exists(), "Expected " + file + ".exists() to return false");
         }
     }
 
diff --git a/compat/maven-compat/src/test/java/org/apache/maven/repository/LegacyRepositorySystemTest.java b/compat/maven-compat/src/test/java/org/apache/maven/repository/LegacyRepositorySystemTest.java
index 8f9709a175..dbdb15523b 100644
--- a/compat/maven-compat/src/test/java/org/apache/maven/repository/LegacyRepositorySystemTest.java
+++ b/compat/maven-compat/src/test/java/org/apache/maven/repository/LegacyRepositorySystemTest.java
@@ -185,7 +185,7 @@ public void setPath(ProducedArtifact artifact, Path path) {
         //
         d.setScope(Artifact.SCOPE_SYSTEM);
         File file = new File(getBasedir(), "src/test/repository-system/maven-core-2.1.0.jar");
-        assertTrue(file.exists());
+        assertTrue(file.exists(), "Expected " + file + ".exists() to return true");
         d.setSystemPath(file.getCanonicalPath());
 
         artifact = repositorySystem.createDependencyArtifact(d);
@@ -208,7 +208,7 @@ public void setPath(ProducedArtifact artifact, Path path) {
         // Put in a bogus file to make sure missing files cause the resolution to fail.
         //
         file = new File(getBasedir(), "src/test/repository-system/maven-monkey-2.1.0.jar");
-        assertFalse(file.exists());
+        assertFalse(file.exists(), "Expected " + file + ".exists() to return false");
         d.setSystemPath(file.getCanonicalPath());
         artifact = repositorySystem.createDependencyArtifact(d);
 
@@ -226,7 +226,7 @@ public void setPath(ProducedArtifact artifact, Path path) {
             result = repositorySystem.resolve(request);
             resolutionErrorHandler.throwErrors(request, result);
         } catch (Exception e) {
-            assertTrue(result.hasMissingArtifacts());
+            assertTrue(result.hasMissingArtifacts(), "Expected " + result + ".hasMissingArtifacts() to return true");
         }
     }
 
diff --git a/compat/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultUpdateCheckManagerTest.java b/compat/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultUpdateCheckManagerTest.java
index e06318c1db..6e61442f3a 100644
--- a/compat/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultUpdateCheckManagerTest.java
+++ b/compat/maven-compat/src/test/java/org/apache/maven/repository/legacy/DefaultUpdateCheckManagerTest.java
@@ -108,7 +108,7 @@ void testMissingArtifact() throws Exception {
 
         assertFalse(updateCheckManager.isUpdateRequired(a, remoteRepository));
 
-        assertFalse(file.exists());
+        assertFalse(file.exists(), "Expected " + file + ".exists() to return false");
         assertNotNull(
                 updateCheckManager.readLastUpdated(touchFile, updateCheckManager.getRepositoryKey(remoteRepository)));
     }
@@ -161,7 +161,7 @@ void testMissingPom() throws Exception {
 
         assertFalse(updateCheckManager.isUpdateRequired(a, remoteRepository));
 
-        assertFalse(file.exists());
+        assertFalse(file.exists(), "Expected " + file + ".exists() to return false");
         assertNotNull(
                 updateCheckManager.readLastUpdated(touchFile, updateCheckManager.getRepositoryKey(remoteRepository)));
     }
diff --git a/compat/maven-compat/src/test/java/org/apache/maven/repository/legacy/resolver/DefaultArtifactCollectorTest.java b/compat/maven-compat/src/test/java/org/apache/maven/repository/legacy/resolver/DefaultArtifactCollectorTest.java
index 641d3034df..72209b3dce 100644
--- a/compat/maven-compat/src/test/java/org/apache/maven/repository/legacy/resolver/DefaultArtifactCollectorTest.java
+++ b/compat/maven-compat/src/test/java/org/apache/maven/repository/legacy/resolver/DefaultArtifactCollectorTest.java
@@ -333,7 +333,7 @@ void testIncompatibleRanges() throws ArtifactResolutionException, InvalidVersion
 
         ArtifactResolutionResult res = collect(a);
 
-        assertTrue(res.hasVersionRangeViolations());
+        assertTrue(res.hasVersionRangeViolations(), "Expected " + res + ".hasVersionRangeViolations() to return true");
     }
 
     @Test
@@ -346,7 +346,7 @@ void testUnboundedRangeWhenVersionUnavailable()
 
         ArtifactResolutionResult res = collect(a);
 
-        assertTrue(res.hasVersionRangeViolations());
+        assertTrue(res.hasVersionRangeViolations(), "Expected " + res + ".hasVersionRangeViolations() to return true");
     }
 
     @Test
@@ -371,7 +371,7 @@ void testUnboundedRangeAboveLastRelease() throws ArtifactResolutionException, In
 
         ArtifactResolutionResult res = collect(a);
 
-        assertTrue(res.hasVersionRangeViolations());
+        assertTrue(res.hasVersionRangeViolations(), "Expected " + res + ".hasVersionRangeViolations() to return true");
     }
 
     @Test
@@ -665,7 +665,7 @@ void testSnapshotNotIncluded() throws ArtifactResolutionException, InvalidVersio
 
         ArtifactResolutionResult res = collect(a);
 
-        assertTrue(res.hasVersionRangeViolations());
+        assertTrue(res.hasVersionRangeViolations(), "Expected " + res + ".hasVersionRangeViolations() to return true");
 
         /*
          * try { ArtifactResolutionResult res = collect( a ); fail( "Expected b not to resolve: " + res ); } catch (
diff --git a/compat/maven-embedder/pom.xml b/compat/maven-embedder/pom.xml
index 811acfc9e1..2df8588ec1 100644
--- a/compat/maven-embedder/pom.xml
+++ b/compat/maven-embedder/pom.xml
@@ -205,11 +205,7 @@ under the License.
       <artifactId>junit-jupiter-params</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.hamcrest</groupId>
-      <artifactId>hamcrest</artifactId>
-      <scope>test</scope>
-    </dependency>
+
     <dependency>
       <groupId>org.mockito</groupId>
       <artifactId>mockito-core</artifactId>
diff --git a/compat/maven-embedder/src/test/java/org/apache/maven/cli/MavenCliTest.java b/compat/maven-embedder/src/test/java/org/apache/maven/cli/MavenCliTest.java
index 5867a4537c..bbaa3e622d 100644
--- a/compat/maven-embedder/src/test/java/org/apache/maven/cli/MavenCliTest.java
+++ b/compat/maven-embedder/src/test/java/org/apache/maven/cli/MavenCliTest.java
@@ -26,6 +26,7 @@
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.stream.Stream;
@@ -56,7 +57,6 @@
 import org.codehaus.plexus.DefaultPlexusContainer;
 import org.codehaus.plexus.PlexusContainer;
 import org.eclipse.aether.transfer.TransferListener;
-import org.hamcrest.CoreMatchers;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
@@ -68,14 +68,11 @@
 import static java.util.Arrays.asList;
 import static org.apache.maven.cli.MavenCli.performProfileActivation;
 import static org.apache.maven.cli.MavenCli.performProjectActivation;
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assumptions.assumeTrue;
@@ -105,6 +102,14 @@ void tearDown() throws Exception {
         }
     }
 
+    // Helper method for containsExactlyInAnyOrder assertion
+    private static <T> void assertContainsExactlyInAnyOrder(Collection<T> actual, T... expected) {
+        assertEquals(expected.length, actual.size(), "Collection size mismatch");
+        for (T item : expected) {
+            assertTrue(actual.contains(item), "Collection should contain: " + item);
+        }
+    }
+
     @Test
     void testPerformProfileActivation() throws ParseException {
         final CommandLineParser parser = new DefaultParser();
@@ -118,19 +123,19 @@ void testPerformProfileActivation() throws ParseException {
 
         activation = new ProfileActivation();
         performProfileActivation(parser.parse(options, new String[] {"-P", "test1,+test2,?test3,+?test4"}), activation);
-        assertThat(activation.getRequiredActiveProfileIds(), containsInAnyOrder("test1", "test2"));
-        assertThat(activation.getOptionalActiveProfileIds(), containsInAnyOrder("test3", "test4"));
+        assertContainsExactlyInAnyOrder(activation.getRequiredActiveProfileIds(), "test1", "test2");
+        assertContainsExactlyInAnyOrder(activation.getOptionalActiveProfileIds(), "test3", "test4");
 
         activation = new ProfileActivation();
         performProfileActivation(
                 parser.parse(options, new String[] {"-P", "!test1,-test2,-?test3,!?test4"}), activation);
-        assertThat(activation.getRequiredInactiveProfileIds(), containsInAnyOrder("test1", "test2"));
-        assertThat(activation.getOptionalInactiveProfileIds(), containsInAnyOrder("test3", "test4"));
+        assertContainsExactlyInAnyOrder(activation.getRequiredInactiveProfileIds(), "test1", "test2");
+        assertContainsExactlyInAnyOrder(activation.getOptionalInactiveProfileIds(), "test3", "test4");
 
         activation = new ProfileActivation();
         performProfileActivation(parser.parse(options, new String[] {"-P", "-test1,+test2"}), activation);
-        assertThat(activation.getRequiredActiveProfileIds(), containsInAnyOrder("test2"));
-        assertThat(activation.getRequiredInactiveProfileIds(), containsInAnyOrder("test1"));
+        assertContainsExactlyInAnyOrder(activation.getRequiredActiveProfileIds(), "test2");
+        assertContainsExactlyInAnyOrder(activation.getRequiredInactiveProfileIds(), "test1");
     }
 
     @Test
@@ -145,19 +150,19 @@ void testDetermineProjectActivation() throws ParseException {
         activation = new ProjectActivation();
         performProjectActivation(
                 parser.parse(options, new String[] {"-pl", "test1,+test2,?test3,+?test4"}), activation);
-        assertThat(activation.getRequiredActiveProjectSelectors(), containsInAnyOrder("test1", "test2"));
-        assertThat(activation.getOptionalActiveProjectSelectors(), containsInAnyOrder("test3", "test4"));
+        assertContainsExactlyInAnyOrder(activation.getRequiredActiveProjectSelectors(), "test1", "test2");
+        assertContainsExactlyInAnyOrder(activation.getOptionalActiveProjectSelectors(), "test3", "test4");
 
         activation = new ProjectActivation();
         performProjectActivation(
                 parser.parse(options, new String[] {"-pl", "!test1,-test2,-?test3,!?test4"}), activation);
-        assertThat(activation.getRequiredInactiveProjectSelectors(), containsInAnyOrder("test1", "test2"));
-        assertThat(activation.getOptionalInactiveProjectSelectors(), containsInAnyOrder("test3", "test4"));
+        assertContainsExactlyInAnyOrder(activation.getRequiredInactiveProjectSelectors(), "test1", "test2");
+        assertContainsExactlyInAnyOrder(activation.getOptionalInactiveProjectSelectors(), "test3", "test4");
 
         activation = new ProjectActivation();
         performProjectActivation(parser.parse(options, new String[] {"-pl", "-test1,+test2"}), activation);
-        assertThat(activation.getRequiredActiveProjectSelectors(), containsInAnyOrder("test2"));
-        assertThat(activation.getRequiredInactiveProjectSelectors(), containsInAnyOrder("test1"));
+        assertContainsExactlyInAnyOrder(activation.getRequiredActiveProjectSelectors(), "test2");
+        assertContainsExactlyInAnyOrder(activation.getRequiredInactiveProjectSelectors(), "test1");
     }
 
     @Test
@@ -347,21 +352,21 @@ void testStyleColors() throws Exception {
         cli.cli(request);
         cli.properties(request);
         cli.logging(request);
-        assertFalse(MessageUtils.isColorEnabled());
+        assertFalse(MessageUtils.isColorEnabled(), "Expected MessageUtils.isColorEnabled() to return false");
 
         MessageUtils.setColorEnabled(true);
         request = new CliRequest(new String[] {"--non-interactive"}, null);
         cli.cli(request);
         cli.properties(request);
         cli.logging(request);
-        assertFalse(MessageUtils.isColorEnabled());
+        assertFalse(MessageUtils.isColorEnabled(), "Expected MessageUtils.isColorEnabled() to return false");
 
         MessageUtils.setColorEnabled(true);
         request = new CliRequest(new String[] {"--force-interactive", "--non-interactive"}, null);
         cli.cli(request);
         cli.properties(request);
         cli.logging(request);
-        assertTrue(MessageUtils.isColorEnabled());
+        assertTrue(MessageUtils.isColorEnabled(), "Expected MessageUtils.isColorEnabled() to return true");
 
         MessageUtils.setColorEnabled(true);
         request = new CliRequest(new String[] {"-l", "target/temp/mvn.log"}, null);
@@ -369,21 +374,21 @@ void testStyleColors() throws Exception {
         cli.cli(request);
         cli.properties(request);
         cli.logging(request);
-        assertFalse(MessageUtils.isColorEnabled());
+        assertFalse(MessageUtils.isColorEnabled(), "Expected MessageUtils.isColorEnabled() to return false");
 
         MessageUtils.setColorEnabled(false);
         request = new CliRequest(new String[] {"-Dstyle.color=always"}, null);
         cli.cli(request);
         cli.properties(request);
         cli.logging(request);
-        assertTrue(MessageUtils.isColorEnabled());
+        assertTrue(MessageUtils.isColorEnabled(), "Expected MessageUtils.isColorEnabled() to return true");
 
         MessageUtils.setColorEnabled(true);
         request = new CliRequest(new String[] {"-Dstyle.color=never"}, null);
         cli.cli(request);
         cli.properties(request);
         cli.logging(request);
-        assertFalse(MessageUtils.isColorEnabled());
+        assertFalse(MessageUtils.isColorEnabled(), "Expected MessageUtils.isColorEnabled() to return false");
 
         MessageUtils.setColorEnabled(false);
         request = new CliRequest(new String[] {"-Dstyle.color=always", "-B", "-l", "target/temp/mvn.log"}, null);
@@ -391,7 +396,7 @@ void testStyleColors() throws Exception {
         cli.cli(request);
         cli.properties(request);
         cli.logging(request);
-        assertTrue(MessageUtils.isColorEnabled());
+        assertTrue(MessageUtils.isColorEnabled(), "Expected MessageUtils.isColorEnabled() to return true");
 
         MessageUtils.setColorEnabled(false);
         CliRequest maybeColorRequest =
@@ -445,7 +450,7 @@ void resumeFromSelectorIsSuggestedWithoutGroupId() {
 
         String selector = cli.getResumeFromSelector(allProjects, failedProject);
 
-        assertThat(selector, is(":module-a"));
+        assertEquals(":module-a", selector);
     }
 
     @Test
@@ -456,7 +461,7 @@ void resumeFromSelectorContainsGroupIdWhenArtifactIdIsNotUnique() {
 
         String selector = cli.getResumeFromSelector(allProjects, failedProject);
 
-        assertThat(selector, is("group-a:module"));
+        assertEquals("group-a:module", selector);
     }
 
     @Test
@@ -469,19 +474,23 @@ void verifyLocalRepositoryPath() throws Exception {
         // Use default
         cli.cli(request);
         executionRequest = cli.populateRequest(request);
-        assertThat(executionRequest.getLocalRepositoryPath(), is(nullValue()));
+        assertNull(executionRequest.getLocalRepositoryPath());
 
         // System-properties override default
         request.getSystemProperties().setProperty(Constants.MAVEN_REPO_LOCAL, "." + File.separatorChar + "custom1");
         executionRequest = cli.populateRequest(request);
-        assertThat(executionRequest.getLocalRepositoryPath(), is(notNullValue()));
-        assertThat(executionRequest.getLocalRepositoryPath().toString(), is("." + File.separatorChar + "custom1"));
+        assertNotNull(executionRequest.getLocalRepositoryPath());
+        assertEquals(
+                "." + File.separatorChar + "custom1",
+                executionRequest.getLocalRepositoryPath().toString());
 
         // User-properties override system properties
         request.getUserProperties().setProperty(Constants.MAVEN_REPO_LOCAL, "." + File.separatorChar + "custom2");
         executionRequest = cli.populateRequest(request);
-        assertThat(executionRequest.getLocalRepositoryPath(), is(notNullValue()));
-        assertThat(executionRequest.getLocalRepositoryPath().toString(), is("." + File.separatorChar + "custom2"));
+        assertNotNull(executionRequest.getLocalRepositoryPath());
+        assertEquals(
+                "." + File.separatorChar + "custom2",
+                executionRequest.getLocalRepositoryPath().toString());
     }
 
     /**
@@ -522,7 +531,7 @@ void populatePropertiesCanContainEqualsSign() throws Exception {
         cli.properties(request);
 
         // Assert
-        assertThat(request.getUserProperties().getProperty("w"), is("x=y"));
+        assertEquals("x=y", request.getUserProperties().getProperty("w"));
     }
 
     @Test
@@ -535,7 +544,7 @@ void populatePropertiesSpace() throws Exception {
         cli.properties(request);
 
         // Assert
-        assertThat(request.getUserProperties().getProperty("z"), is("2"));
+        assertEquals("2", request.getUserProperties().getProperty("z"));
     }
 
     @Test
@@ -548,7 +557,7 @@ void populatePropertiesShorthand() throws Exception {
         cli.properties(request);
 
         // Assert
-        assertThat(request.getUserProperties().getProperty("x"), is("true"));
+        assertEquals("true", request.getUserProperties().getProperty("x"));
     }
 
     @Test
@@ -561,8 +570,8 @@ void populatePropertiesMultiple() throws Exception {
         cli.properties(request);
 
         // Assert
-        assertThat(request.getUserProperties().getProperty("x"), is("1"));
-        assertThat(request.getUserProperties().getProperty("y"), is("true"));
+        assertEquals("1", request.getUserProperties().getProperty("x"));
+        assertEquals("true", request.getUserProperties().getProperty("y"));
     }
 
     @Test
@@ -575,7 +584,7 @@ void populatePropertiesOverwrite() throws Exception {
         cli.properties(request);
 
         // Assert
-        assertThat(request.getUserProperties().getProperty("x"), is("false"));
+        assertEquals("false", request.getUserProperties().getProperty("x"));
     }
 
     @Test
@@ -628,18 +637,20 @@ public void testPropertiesInterpolation() throws Exception {
         cli.properties(request);
 
         // Assert
-        assertThat(request.getUserProperties().getProperty("fro"), CoreMatchers.startsWith("chti"));
-        assertThat(request.getUserProperties().getProperty("valFound"), is("sbari"));
-        assertThat(request.getUserProperties().getProperty("valNotFound"), is("s${foz}i"));
-        assertThat(request.getUserProperties().getProperty("valRootDirectory"), is("C:\\myRootDirectory/.mvn/foo"));
-        assertThat(
-                request.getUserProperties().getProperty("valTopDirectory"),
-                is("C:\\myRootDirectory\\myTopDirectory/pom.xml"));
-        assertThat(request.getCommandLine().getOptionValue('f'), is("C:\\myRootDirectory/my-child"));
-        assertThat(request.getCommandLine().getArgs(), equalTo(new String[] {"prefix:3.0.0:bar", "validate"}));
+        assertTrue(request.getUserProperties().getProperty("fro").startsWith("chti"));
+        assertEquals("sbari", request.getUserProperties().getProperty("valFound"));
+        assertEquals("s${foz}i", request.getUserProperties().getProperty("valNotFound"));
+        assertEquals("C:\\myRootDirectory/.mvn/foo", request.getUserProperties().getProperty("valRootDirectory"));
+        assertEquals(
+                "C:\\myRootDirectory\\myTopDirectory/pom.xml",
+                request.getUserProperties().getProperty("valTopDirectory"));
+        assertEquals("C:\\myRootDirectory/my-child", request.getCommandLine().getOptionValue('f'));
+        assertArrayEquals(
+                new String[] {"prefix:3.0.0:bar", "validate"},
+                request.getCommandLine().getArgs());
 
         Path p = fs.getPath(request.getUserProperties().getProperty("valTopDirectory"));
-        assertThat(p.toString(), is("C:\\myRootDirectory\\myTopDirectory\\pom.xml"));
+        assertEquals("C:\\myRootDirectory\\myTopDirectory\\pom.xml", p.toString());
     }
 
     @Test
@@ -667,7 +678,7 @@ public void activateBatchMode(boolean ciEnv, String[] cliArgs, boolean isBatchMo
 
         boolean batchMode = !cli.populateRequest(request).isInteractiveMode();
 
-        assertThat(batchMode, is(isBatchMode));
+        assertEquals(isBatchMode, batchMode);
     }
 
     public static Stream<Arguments> activateBatchModeArguments() {
@@ -699,7 +710,7 @@ public void calculateTransferListener(boolean ciEnv, String[] cliArgs, Class<Tra
             transferListener = simplexTransferListener.getDelegate();
         }
 
-        assertThat(transferListener.getClass(), is(expectedSubClass));
+        assertEquals(expectedSubClass, transferListener.getClass());
     }
 
     public static Stream<Arguments> calculateTransferListenerArguments() {
diff --git a/compat/maven-model-builder/pom.xml b/compat/maven-model-builder/pom.xml
index 01a3819f17..79ebf1b143 100644
--- a/compat/maven-model-builder/pom.xml
+++ b/compat/maven-model-builder/pom.xml
@@ -86,14 +86,10 @@ under the License.
       <artifactId>junit-jupiter-api</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.hamcrest</groupId>
-      <artifactId>hamcrest</artifactId>
-      <scope>test</scope>
-    </dependency>
+
     <dependency>
       <groupId>org.xmlunit</groupId>
-      <artifactId>xmlunit-matchers</artifactId>
+      <artifactId>xmlunit-core</artifactId>
       <scope>test</scope>
     </dependency>
   </dependencies>
diff --git a/compat/maven-model-builder/src/test/java/org/apache/maven/model/building/FileModelSourceTest.java b/compat/maven-model-builder/src/test/java/org/apache/maven/model/building/FileModelSourceTest.java
index a03184de6b..9f5d43427f 100644
--- a/compat/maven-model-builder/src/test/java/org/apache/maven/model/building/FileModelSourceTest.java
+++ b/compat/maven-model-builder/src/test/java/org/apache/maven/model/building/FileModelSourceTest.java
@@ -43,9 +43,9 @@ void testEquals() throws Exception {
         File tempFile = createTempFile("pomTest");
         FileModelSource instance = new FileModelSource(tempFile);
 
-        assertFalse(instance.equals(null));
+        assertFalse(instance.equals(null), "Expected " + instance + " to not equal " + null);
         assertFalse(instance.equals(new Object()));
-        assertTrue(instance.equals(instance));
+        assertTrue(instance.equals(instance), "Expected " + instance + " to equal " + instance);
         assertTrue(instance.equals(new FileModelSource(tempFile)));
     }
 
@@ -60,7 +60,9 @@ void testWindowsPaths() throws Exception {
         FileModelSource upperCaseFileSource = new FileModelSource(upperCaseFile);
         FileModelSource lowerCaseFileSource = new FileModelSource(lowerCaseFile);
 
-        assertTrue(upperCaseFileSource.equals(lowerCaseFileSource));
+        assertTrue(
+                upperCaseFileSource.equals(lowerCaseFileSource),
+                "Expected " + upperCaseFileSource + " to equal " + lowerCaseFileSource);
     }
 
     private File createTempFile(String name) throws IOException {
diff --git a/compat/maven-model-builder/src/test/java/org/apache/maven/model/building/FileToRawModelMergerTest.java b/compat/maven-model-builder/src/test/java/org/apache/maven/model/building/FileToRawModelMergerTest.java
index e5ad5b01d3..640579cb88 100644
--- a/compat/maven-model-builder/src/test/java/org/apache/maven/model/building/FileToRawModelMergerTest.java
+++ b/compat/maven-model-builder/src/test/java/org/apache/maven/model/building/FileToRawModelMergerTest.java
@@ -28,8 +28,7 @@
 import org.apache.maven.model.v4.MavenMerger;
 import org.junit.jupiter.api.Test;
 
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.hasItems;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 @Deprecated
 class FileToRawModelMergerTest {
@@ -65,6 +64,8 @@ void testOverriddenMergeMethods() {
                 .filter(m -> m.startsWith("merge"))
                 .collect(Collectors.toList());
 
-        assertThat(overriddenMethods, hasItems(methodNames.toArray(new String[0])));
+        assertTrue(
+                overriddenMethods.containsAll(methodNames),
+                "Expected overriddenMethods " + overriddenMethods + " to contain all methodNames " + methodNames);
     }
 }
diff --git a/compat/maven-model-builder/src/test/java/org/apache/maven/model/inheritance/DefaultInheritanceAssemblerTest.java b/compat/maven-model-builder/src/test/java/org/apache/maven/model/inheritance/DefaultInheritanceAssemblerTest.java
index 72d742a136..cf3e45267f 100644
--- a/compat/maven-model-builder/src/test/java/org/apache/maven/model/inheritance/DefaultInheritanceAssemblerTest.java
+++ b/compat/maven-model-builder/src/test/java/org/apache/maven/model/inheritance/DefaultInheritanceAssemblerTest.java
@@ -28,9 +28,10 @@
 import org.apache.maven.model.io.ModelWriter;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.xmlunit.matchers.CompareMatcher;
+import org.xmlunit.builder.DiffBuilder;
+import org.xmlunit.diff.Diff;
 
-import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
@@ -190,8 +191,12 @@ public void testInheritance(String baseName, boolean fromRepo) throws IOExceptio
         // check with getPom( baseName + "-expected" )
         File expected = getPom(baseName + "-expected");
 
-        assertThat(
-                actual, CompareMatcher.isIdenticalTo(expected).ignoreComments().ignoreWhitespace());
+        Diff diff = DiffBuilder.compare(expected)
+                .withTest(actual)
+                .ignoreComments()
+                .ignoreWhitespace()
+                .build();
+        assertFalse(diff.hasDifferences(), "XML files should be identical: " + diff.toString());
     }
 
     @Test
@@ -211,7 +216,11 @@ void testModulePathNotArtifactId() throws IOException {
         // check with getPom( "module-path-not-artifactId-effective" )
         File expected = getPom("module-path-not-artifactId-expected");
 
-        assertThat(
-                actual, CompareMatcher.isIdenticalTo(expected).ignoreComments().ignoreWhitespace());
+        Diff diff = DiffBuilder.compare(expected)
+                .withTest(actual)
+                .ignoreComments()
+                .ignoreWhitespace()
+                .build();
+        assertFalse(diff.hasDifferences(), "XML files should be identical: " + diff.toString());
     }
 }
diff --git a/compat/maven-model-builder/src/test/java/org/apache/maven/model/profile/DefaultProfileSelectorTest.java b/compat/maven-model-builder/src/test/java/org/apache/maven/model/profile/DefaultProfileSelectorTest.java
index 84f5d4390a..a5ba09c686 100644
--- a/compat/maven-model-builder/src/test/java/org/apache/maven/model/profile/DefaultProfileSelectorTest.java
+++ b/compat/maven-model-builder/src/test/java/org/apache/maven/model/profile/DefaultProfileSelectorTest.java
@@ -64,7 +64,8 @@ public boolean presentInConfig(
         DefaultProfileActivationContext context = new DefaultProfileActivationContext();
         SimpleProblemCollector problems = new SimpleProblemCollector();
         List<Profile> active = selector.getActiveProfiles(profiles, context, problems);
-        assertTrue(active.isEmpty());
+        assertTrue(
+                active.isEmpty(), "Expected collection to be empty but had " + active.size() + " elements: " + active);
         assertEquals(1, problems.getErrors().size());
         assertEquals(
                 "Failed to determine activation for profile one: BOOM",
diff --git a/compat/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java b/compat/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java
index d856b6ae94..a5f5d8548c 100644
--- a/compat/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java
+++ b/compat/maven-model-builder/src/test/java/org/apache/maven/model/validation/DefaultModelValidatorTest.java
@@ -267,10 +267,18 @@ void testMissingAll() throws Exception {
 
         List<String> messages = result.getErrors();
 
-        assertTrue(messages.contains("'modelVersion' is missing."));
-        assertTrue(messages.contains("'groupId' is missing."));
-        assertTrue(messages.contains("'artifactId' is missing."));
-        assertTrue(messages.contains("'version' is missing."));
+        assertTrue(
+                messages.contains("'modelVersion' is missing."),
+                "Expected " + messages + " to contain " + "'modelVersion' is missing.");
+        assertTrue(
+                messages.contains("'groupId' is missing."),
+                "Expected " + messages + " to contain " + "'groupId' is missing.");
+        assertTrue(
+                messages.contains("'artifactId' is missing."),
+                "Expected " + messages + " to contain " + "'artifactId' is missing.");
+        assertTrue(
+                messages.contains("'version' is missing."),
+                "Expected " + messages + " to contain " + "'version' is missing.");
         // type is inherited from the super pom
     }
 
diff --git a/compat/maven-model/pom.xml b/compat/maven-model/pom.xml
index a1d0be7ed9..fc1eecff4b 100644
--- a/compat/maven-model/pom.xml
+++ b/compat/maven-model/pom.xml
@@ -63,11 +63,6 @@ under the License.
       <artifactId>junit-jupiter-api</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.hamcrest</groupId>
-      <artifactId>hamcrest</artifactId>
-      <scope>test</scope>
-    </dependency>
     <dependency>
       <groupId>org.openjdk.jmh</groupId>
       <artifactId>jmh-core</artifactId>
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/ActivationFileTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/ActivationFileTest.java
index 5f5dcd1876..bba906b8a6 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/ActivationFileTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/ActivationFileTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         ActivationFile thing = new ActivationFile();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/ActivationOSTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/ActivationOSTest.java
index 5ca7bec65e..7d5777a413 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/ActivationOSTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/ActivationOSTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         ActivationOS thing = new ActivationOS();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/ActivationPropertyTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/ActivationPropertyTest.java
index 32b69dc046..54f0ea8f76 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/ActivationPropertyTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/ActivationPropertyTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         ActivationProperty thing = new ActivationProperty();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/ActivationTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/ActivationTest.java
index 545aab5a78..13c58db2b5 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/ActivationTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/ActivationTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         Activation thing = new Activation();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/BuildTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/BuildTest.java
index bd78314954..bb1e74f822 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/BuildTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/BuildTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         Build thing = new Build();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/CiManagementTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/CiManagementTest.java
index 71a402747b..4b24446627 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/CiManagementTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/CiManagementTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         CiManagement thing = new CiManagement();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/ContributorTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/ContributorTest.java
index f6ddcc4699..eca3b4cb0a 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/ContributorTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/ContributorTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         Contributor thing = new Contributor();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/DependencyManagementTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/DependencyManagementTest.java
index 1a32e0e8e3..2cfa2a7f0d 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/DependencyManagementTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/DependencyManagementTest.java
@@ -46,7 +46,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         DependencyManagement thing = new DependencyManagement();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/DependencyTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/DependencyTest.java
index 39d7bb30d7..8a82a302f6 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/DependencyTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/DependencyTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         Dependency thing = new Dependency();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/DeploymentRepositoryTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/DeploymentRepositoryTest.java
index 8b25cc6263..6c9820c8bb 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/DeploymentRepositoryTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/DeploymentRepositoryTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         DeploymentRepository thing = new DeploymentRepository();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/DeveloperTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/DeveloperTest.java
index b6897aea37..90d870623a 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/DeveloperTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/DeveloperTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         Developer thing = new Developer();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/DistributionManagementTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/DistributionManagementTest.java
index 18c57a8c90..e4c6d6ba2c 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/DistributionManagementTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/DistributionManagementTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         DistributionManagement thing = new DistributionManagement();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/ExclusionTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/ExclusionTest.java
index 625f20ec2c..5b7cc96537 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/ExclusionTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/ExclusionTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         Exclusion thing = new Exclusion();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/ExtensionTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/ExtensionTest.java
index 3afa12c8ec..98d49f93ed 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/ExtensionTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/ExtensionTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         Extension thing = new Extension();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/IssueManagementTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/IssueManagementTest.java
index a6905a28be..634636c66f 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/IssueManagementTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/IssueManagementTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         IssueManagement thing = new IssueManagement();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/LicenseTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/LicenseTest.java
index 270993c20b..31d2f95a49 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/LicenseTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/LicenseTest.java
@@ -46,7 +46,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         License thing = new License();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/MailingListTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/MailingListTest.java
index c758c7e76e..1ab66b6f05 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/MailingListTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/MailingListTest.java
@@ -46,7 +46,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         MailingList thing = new MailingList();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/NotifierTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/NotifierTest.java
index 33f1c139d9..c2c25ee805 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/NotifierTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/NotifierTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         Notifier thing = new Notifier();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/OrganizationTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/OrganizationTest.java
index 62e51a1608..14e499cb4e 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/OrganizationTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/OrganizationTest.java
@@ -46,7 +46,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         Organization thing = new Organization();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/ParentTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/ParentTest.java
index 79f33785ba..552b29a372 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/ParentTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/ParentTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         Parent thing = new Parent();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/PluginConfigurationTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/PluginConfigurationTest.java
index 996bf56bd8..304ec91e9f 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/PluginConfigurationTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/PluginConfigurationTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         PluginConfiguration thing = new PluginConfiguration();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/PluginContainerTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/PluginContainerTest.java
index bc4c61404e..e7e1cbdf73 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/PluginContainerTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/PluginContainerTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         PluginContainer thing = new PluginContainer();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/PluginExecutionTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/PluginExecutionTest.java
index 110ed253d7..0a4a6c7008 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/PluginExecutionTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/PluginExecutionTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         PluginExecution thing = new PluginExecution();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/PluginManagementTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/PluginManagementTest.java
index c657890a95..1038725ad7 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/PluginManagementTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/PluginManagementTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         PluginManagement thing = new PluginManagement();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/PluginTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/PluginTest.java
index c023199854..8bf07fe4f5 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/PluginTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/PluginTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         Plugin thing = new Plugin();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/PrerequisitesTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/PrerequisitesTest.java
index c886fd86a3..2e4e965842 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/PrerequisitesTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/PrerequisitesTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         Prerequisites thing = new Prerequisites();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/ProfileTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/ProfileTest.java
index aa8b0dbc95..13ad3b208e 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/ProfileTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/ProfileTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         Profile thing = new Profile();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/RelocationTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/RelocationTest.java
index 9956b12a92..751cbbdcad 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/RelocationTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/RelocationTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         Relocation thing = new Relocation();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/ReportPluginTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/ReportPluginTest.java
index 37f0acf336..8562c67dee 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/ReportPluginTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/ReportPluginTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         ReportPlugin thing = new ReportPlugin();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/ReportSetTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/ReportSetTest.java
index 7314675b26..4403c7488b 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/ReportSetTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/ReportSetTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         ReportSet thing = new ReportSet();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/ReportingTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/ReportingTest.java
index 8d3d7d93ac..0ba2195c00 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/ReportingTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/ReportingTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         Reporting thing = new Reporting();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/RepositoryPolicyTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/RepositoryPolicyTest.java
index 24b9e049a4..01236ee1f8 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/RepositoryPolicyTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/RepositoryPolicyTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         RepositoryPolicy thing = new RepositoryPolicy();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/RepositoryTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/RepositoryTest.java
index afcc13b88d..e97699ba50 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/RepositoryTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/RepositoryTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         Repository thing = new Repository();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/ResourceTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/ResourceTest.java
index 7ed52946a6..9382da4f2f 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/ResourceTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/ResourceTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         Resource thing = new Resource();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/ScmTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/ScmTest.java
index 0dde84e4a9..a14f2a6077 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/ScmTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/ScmTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         Scm thing = new Scm();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/SiteTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/SiteTest.java
index 41565017b3..a01ae688e1 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/SiteTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/SiteTest.java
@@ -45,7 +45,7 @@ void testEqualsNullSafe() {
     @Test
     void testEqualsIdentity() {
         Site thing = new Site();
-        assertTrue(thing.equals(thing));
+        assertTrue(thing.equals(thing), "Expected " + thing + " to equal " + thing);
     }
 
     @Test
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/merge/MavenMergerTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/merge/MavenMergerTest.java
index 92c8c55122..f2d9767259 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/merge/MavenMergerTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/merge/MavenMergerTest.java
@@ -26,9 +26,8 @@
 import org.apache.maven.model.v4.MavenMerger;
 import org.junit.jupiter.api.Test;
 
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.contains;
-import static org.hamcrest.Matchers.is;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * MavenMerger is based on same instances, subclasses should override KeyComputer per type
@@ -43,10 +42,16 @@ void mergeArtifactId() {
         Model source = Model.newBuilder().artifactId("SOURCE").build();
 
         Model merged = mavenMerger.merge(target, source, true, null);
-        assertThat(merged.getArtifactId(), is("SOURCE"));
+        assertEquals(
+                "SOURCE",
+                merged.getArtifactId(),
+                "Expected merged artifactId to be SOURCE but was " + merged.getArtifactId());
 
         merged = mavenMerger.merge(target, source, false, null);
-        assertThat(merged.getArtifactId(), is("TARGET"));
+        assertEquals(
+                "TARGET",
+                merged.getArtifactId(),
+                "Expected merged artifactId to be TARGET but was " + merged.getArtifactId());
     }
 
     @Test
@@ -62,7 +67,10 @@ void mergeSameContributors() {
 
         Model merged = mavenMerger.merge(target, source, true, null);
 
-        assertThat(merged.getContributors(), contains(contributor));
+        assertEquals(1, merged.getContributors().size(), "Expected exactly 1 contributor");
+        assertTrue(
+                merged.getContributors().contains(contributor),
+                "Expected contributors to contain " + contributor + " but was " + merged.getContributors());
     }
 
     @Test
@@ -81,6 +89,9 @@ void mergeSameDependencies() {
 
         Model merged = mavenMerger.merge(target, source, true, null);
 
-        assertThat(merged.getDependencies(), contains(dependency));
+        assertEquals(1, merged.getDependencies().size(), "Expected exactly 1 dependency");
+        assertTrue(
+                merged.getDependencies().contains(dependency),
+                "Expected dependencies to contain " + dependency + " but was " + merged.getDependencies());
     }
 }
diff --git a/compat/maven-model/src/test/java/org/apache/maven/model/v4/ModelXmlTest.java b/compat/maven-model/src/test/java/org/apache/maven/model/v4/ModelXmlTest.java
index b7d17e808d..048c17cfe1 100644
--- a/compat/maven-model/src/test/java/org/apache/maven/model/v4/ModelXmlTest.java
+++ b/compat/maven-model/src/test/java/org/apache/maven/model/v4/ModelXmlTest.java
@@ -83,7 +83,7 @@ void testNamespaceInXmlNode() throws XMLStreamException {
         assertEquals("", myConfig.prefix());
         assertEquals("myConfig", myConfig.name());
         String config = node.toString();
-        assertFalse(config.isEmpty());
+        assertFalse(config.isEmpty(), "Expected collection to not be empty but was empty");
     }
 
     String toXml(Model model) throws IOException, XMLStreamException {
diff --git a/compat/maven-plugin-api/src/test/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilderTest.java b/compat/maven-plugin-api/src/test/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilderTest.java
index f9839369e2..5b4eeaa284 100644
--- a/compat/maven-plugin-api/src/test/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilderTest.java
+++ b/compat/maven-plugin-api/src/test/java/org/apache/maven/plugin/descriptor/PluginDescriptorBuilderTest.java
@@ -54,8 +54,8 @@ void testBuildReader() throws Exception {
         assertEquals("2.3-SNAPSHOT", pd.getVersion());
         assertEquals("jar", pd.getGoalPrefix());
         assertEquals("plugin-description", pd.getDescription());
-        assertFalse(pd.isIsolatedRealm());
-        assertTrue(pd.isInheritedByDefault());
+        assertFalse(pd.isIsolatedRealm(), "Expected " + pd + ".isIsolatedRealm() to return false");
+        assertTrue(pd.isInheritedByDefault(), "Expected " + pd + ".isInheritedByDefault() to return true");
         assertEquals(2, pd.getMojos().size());
         assertEquals(1, pd.getDependencies().size());
 
@@ -65,12 +65,12 @@ void testBuildReader() throws Exception {
         assertEquals("mojo-description", md.getDescription());
         assertEquals("runtime", md.getDependencyResolutionRequired());
         assertEquals("test", md.getDependencyCollectionRequired());
-        assertFalse(md.isAggregator());
-        assertFalse(md.isDirectInvocationOnly());
-        assertTrue(md.isInheritedByDefault());
-        assertFalse(md.isOnlineRequired());
-        assertTrue(md.isProjectRequired());
-        assertFalse(md.isThreadSafe());
+        assertFalse(md.isAggregator(), "Expected " + md + ".isAggregator() to return false");
+        assertFalse(md.isDirectInvocationOnly(), "Expected " + md + ".isDirectInvocationOnly() to return false");
+        assertTrue(md.isInheritedByDefault(), "Expected " + md + ".isInheritedByDefault() to return true");
+        assertFalse(md.isOnlineRequired(), "Expected " + md + ".isOnlineRequired() to return false");
+        assertTrue(md.isProjectRequired(), "Expected " + md + ".isProjectRequired() to return true");
+        assertFalse(md.isThreadSafe(), "Expected " + md + ".isThreadSafe() to return false");
         assertEquals("package", md.getPhase());
         assertEquals("org.apache.maven.plugin.jar.JarMojo", md.getImplementation());
         assertEquals("antrun", md.getComponentConfigurator());
@@ -99,8 +99,8 @@ void testBuildReader() throws Exception {
         assertEquals("jarName", mp.getAlias());
         assertEquals("java.lang.String", mp.getType());
         assertEquals("java.lang.String", mp.getImplementation());
-        assertTrue(mp.isEditable());
-        assertFalse(mp.isRequired());
+        assertTrue(mp.isEditable(), "Expected " + mp + ".isEditable() to return true");
+        assertFalse(mp.isRequired(), "Expected " + mp + ".isRequired() to return false");
         assertEquals("parameter-description", mp.getDescription());
         assertEquals("deprecated-parameter", mp.getDeprecated());
         assertEquals("${jar.finalName}", mp.getExpression());
@@ -125,6 +125,6 @@ void testBuildReader() throws Exception {
         assertEquals("war", md.getGoal());
         assertNull(md.getDependencyResolutionRequired());
         assertNull(md.getDependencyCollectionRequired());
-        assertTrue(md.isThreadSafe());
+        assertTrue(md.isThreadSafe(), "Expected " + md + ".isThreadSafe() to return true");
     }
 }
diff --git a/compat/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/RepositorySystemTest.java b/compat/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/RepositorySystemTest.java
index ce33186a73..a8547b58eb 100644
--- a/compat/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/RepositorySystemTest.java
+++ b/compat/maven-resolver-provider/src/test/java/org/apache/maven/repository/internal/RepositorySystemTest.java
@@ -73,7 +73,7 @@ void testReadArtifactDescriptor() throws Exception {
      */
     private void checkUtSimpleArtifactDependencies(Dependency dep1, Dependency dep2) {
         assertEquals("compile", dep1.getScope());
-        assertFalse(dep1.isOptional());
+        assertFalse(dep1.isOptional(), "Expected " + dep1 + ".isOptional() to return false");
         assertEquals(0, dep1.getExclusions().size());
         Artifact depArtifact = dep1.getArtifact();
         assertEquals("ut.simple", depArtifact.getGroupId());
@@ -81,7 +81,7 @@ private void checkUtSimpleArtifactDependencies(Dependency dep1, Dependency dep2)
         assertEquals("1.0", depArtifact.getVersion());
         assertEquals("1.0", depArtifact.getBaseVersion());
         assertNull(depArtifact.getFile());
-        assertFalse(depArtifact.isSnapshot());
+        assertFalse(depArtifact.isSnapshot(), "Expected " + depArtifact + ".isSnapshot() to return false");
         assertEquals("", depArtifact.getClassifier());
         assertEquals("jar", depArtifact.getExtension());
         assertEquals("java", depArtifact.getProperty("language", null));
@@ -91,7 +91,7 @@ private void checkUtSimpleArtifactDependencies(Dependency dep1, Dependency dep2)
         assertEquals(4, depArtifact.getProperties().size());
 
         assertEquals("compile", dep2.getScope());
-        assertFalse(dep2.isOptional());
+        assertFalse(dep2.isOptional(), "Expected " + dep2 + ".isOptional() to return false");
         assertEquals(0, dep2.getExclusions().size());
         depArtifact = dep2.getArtifact();
         assertEquals("ut.simple", depArtifact.getGroupId());
@@ -99,7 +99,7 @@ private void checkUtSimpleArtifactDependencies(Dependency dep1, Dependency dep2)
         assertEquals("1.0", depArtifact.getVersion());
         assertEquals("1.0", depArtifact.getBaseVersion());
         assertNull(depArtifact.getFile());
-        assertFalse(depArtifact.isSnapshot());
+        assertFalse(depArtifact.isSnapshot(), "Expected " + depArtifact + ".isSnapshot() to return false");
         assertEquals("sources", depArtifact.getClassifier());
         assertEquals("jar", depArtifact.getExtension());
         assertEquals("java", depArtifact.getProperty("language", null));
@@ -152,8 +152,8 @@ void testResolveArtifact() throws Exception {
     }
 
     private void checkArtifactResult(ArtifactResult result, String filename) {
-        assertFalse(result.isMissing());
-        assertTrue(result.isResolved());
+        assertFalse(result.isMissing(), "Expected " + result + ".isMissing() to return false");
+        assertTrue(result.isResolved(), "Expected " + result + ".isResolved() to return true");
         Artifact artifact = result.getArtifact();
         assertNotNull(artifact.getFile());
         assertEquals(filename, artifact.getFile().getName());
diff --git a/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/BaseParserTest.java b/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/BaseParserTest.java
index 90b533fd33..9053ec88f2 100644
--- a/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/BaseParserTest.java
+++ b/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/BaseParserTest.java
@@ -77,7 +77,8 @@ void notHappy() {
                         .build());
 
         Assertions.assertFalse(invokerRequest.options().isPresent());
-        Assertions.assertTrue(invokerRequest.parsingFailed());
+        Assertions.assertTrue(
+                invokerRequest.parsingFailed(), "Expected " + invokerRequest + ".parsingFailed() to return true");
     }
 
     @Test
diff --git a/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/mvnup/goals/GAVUtilsTest.java b/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/mvnup/goals/GAVUtilsTest.java
index 1b14223a3a..5585616ec4 100644
--- a/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/mvnup/goals/GAVUtilsTest.java
+++ b/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/mvnup/goals/GAVUtilsTest.java
@@ -233,7 +233,7 @@ void shouldHandleEmptyPOMMap() {
             Set<GAV> gavs = GAVUtils.computeAllGAVs(context, pomMap);
 
             assertNotNull(gavs);
-            assertTrue(gavs.isEmpty());
+            assertTrue(gavs.isEmpty(), "Expected collection to be empty but had " + gavs.size() + " elements: " + gavs);
         }
 
         @Test
diff --git a/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/mvnup/goals/ModelVersionUtilsTest.java b/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/mvnup/goals/ModelVersionUtilsTest.java
index 026cd5579b..531c52c1ab 100644
--- a/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/mvnup/goals/ModelVersionUtilsTest.java
+++ b/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/mvnup/goals/ModelVersionUtilsTest.java
@@ -366,7 +366,7 @@ class SchemaLocationOperationTests {
         void shouldGetSchemaLocationForModelVersion() {
             String schemaLocation410 = ModelVersionUtils.getSchemaLocationForModelVersion("4.1.0");
             assertNotNull(schemaLocation410);
-            assertTrue(schemaLocation410.contains("4.1.0"));
+            assertTrue(schemaLocation410.contains("4.1.0"), "Expected " + schemaLocation410 + " to contain " + "4.1.0");
         }
 
         @Test
@@ -374,7 +374,7 @@ void shouldGetSchemaLocationForModelVersion() {
         void shouldGetSchemaLocationFor400() {
             String schemaLocation400 = ModelVersionUtils.getSchemaLocationForModelVersion("4.0.0");
             assertNotNull(schemaLocation400);
-            assertTrue(schemaLocation400.contains("4.0.0"));
+            assertTrue(schemaLocation400.contains("4.0.0"), "Expected " + schemaLocation400 + " to contain " + "4.0.0");
         }
 
         @Test
diff --git a/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/mvnup/goals/UpgradeWorkflowIntegrationTest.java b/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/mvnup/goals/UpgradeWorkflowIntegrationTest.java
index 5a652d557f..ea75e835ba 100644
--- a/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/mvnup/goals/UpgradeWorkflowIntegrationTest.java
+++ b/impl/maven-cli/src/test/java/org/apache/maven/cling/invoker/mvnup/goals/UpgradeWorkflowIntegrationTest.java
@@ -165,7 +165,9 @@ void applyShouldModifyFiles() throws Exception {
 
             // Verify POM was potentially modified (depending on strategy applicability)
             String pomContent = Files.readString(pomFile);
-            assertTrue(pomContent.contains("<groupId>com.example</groupId>"));
+            assertTrue(
+                    pomContent.contains("<groupId>com.example</groupId>"),
+                    "Expected " + pomContent + " to contain " + "<groupId>com.example</groupId>");
             // Note: The exact modifications depend on which strategies are applicable
             // This test mainly verifies that apply goal can modify files
         }
diff --git a/impl/maven-core/pom.xml b/impl/maven-core/pom.xml
index 8c9291ac7d..bc85a4b8ac 100644
--- a/impl/maven-core/pom.xml
+++ b/impl/maven-core/pom.xml
@@ -199,11 +199,7 @@ under the License.
       <artifactId>junit-jupiter-params</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.hamcrest</groupId>
-      <artifactId>hamcrest</artifactId>
-      <scope>test</scope>
-    </dependency>
+
     <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-simple</artifactId>
@@ -216,7 +212,7 @@ under the License.
     </dependency>
     <dependency>
       <groupId>org.xmlunit</groupId>
-      <artifactId>xmlunit-assertj</artifactId>
+      <artifactId>xmlunit-core</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>
@@ -235,11 +231,7 @@ under the License.
       <artifactId>mockito-core</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.assertj</groupId>
-      <artifactId>assertj-core</artifactId>
-      <scope>test</scope>
-    </dependency>
+
     <dependency>
       <groupId>org.openjdk.jmh</groupId>
       <artifactId>jmh-core</artifactId>
diff --git a/impl/maven-core/src/test/java/org/apache/maven/artifact/resolver/filter/ExclusionArtifactFilterTest.java b/impl/maven-core/src/test/java/org/apache/maven/artifact/resolver/filter/ExclusionArtifactFilterTest.java
index 4347e1a8dc..eba03f5fa7 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/artifact/resolver/filter/ExclusionArtifactFilterTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/artifact/resolver/filter/ExclusionArtifactFilterTest.java
@@ -26,8 +26,8 @@
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -53,7 +53,7 @@ void testExcludeExact() {
         exclusion.setArtifactId("maven-core");
         ExclusionArtifactFilter filter = new ExclusionArtifactFilter(Collections.singletonList(exclusion));
 
-        assertThat(filter.include(artifact), is(false));
+        assertFalse(filter.include(artifact), "Artifact should be excluded by exact match");
     }
 
     @Test
@@ -63,7 +63,7 @@ void testExcludeNoMatch() {
         exclusion.setArtifactId("maven-model");
         ExclusionArtifactFilter filter = new ExclusionArtifactFilter(Collections.singletonList(exclusion));
 
-        assertThat(filter.include(artifact), is(true));
+        assertTrue(filter.include(artifact), "Artifact should not be excluded when no match");
     }
 
     @Test
@@ -73,7 +73,7 @@ void testExcludeGroupIdWildcard() {
         exclusion.setArtifactId("maven-core");
         ExclusionArtifactFilter filter = new ExclusionArtifactFilter(Collections.singletonList(exclusion));
 
-        assertThat(filter.include(artifact), is(false));
+        assertFalse(filter.include(artifact), "Artifact should be excluded by groupId wildcard");
     }
 
     @Test
@@ -83,7 +83,9 @@ void testExcludeGroupIdWildcardNoMatch() {
         exclusion.setArtifactId("maven-compat");
         ExclusionArtifactFilter filter = new ExclusionArtifactFilter(Collections.singletonList(exclusion));
 
-        assertThat(filter.include(artifact), is(true));
+        assertTrue(
+                filter.include(artifact),
+                "Artifact should not be excluded when groupId wildcard doesn't match artifactId");
     }
 
     @Test
@@ -93,7 +95,7 @@ void testExcludeArtifactIdWildcard() {
         exclusion.setArtifactId("*");
         ExclusionArtifactFilter filter = new ExclusionArtifactFilter(Collections.singletonList(exclusion));
 
-        assertThat(filter.include(artifact), is(false));
+        assertFalse(filter.include(artifact), "Artifact should be excluded by artifactId wildcard");
     }
 
     @Test
@@ -103,7 +105,9 @@ void testExcludeArtifactIdWildcardNoMatch() {
         exclusion.setArtifactId("*");
         ExclusionArtifactFilter filter = new ExclusionArtifactFilter(Collections.singletonList(exclusion));
 
-        assertThat(filter.include(artifact), is(true));
+        assertTrue(
+                filter.include(artifact),
+                "Artifact should not be excluded when artifactId wildcard doesn't match groupId");
     }
 
     @Test
@@ -113,7 +117,7 @@ void testExcludeAllWildcard() {
         exclusion.setArtifactId("*");
         ExclusionArtifactFilter filter = new ExclusionArtifactFilter(Collections.singletonList(exclusion));
 
-        assertThat(filter.include(artifact), is(false));
+        assertFalse(filter.include(artifact), "Artifact should be excluded by all wildcard");
     }
 
     @Test
@@ -128,7 +132,7 @@ void testMultipleExclusionsExcludeArtifactIdWildcard() {
 
         ExclusionArtifactFilter filter = new ExclusionArtifactFilter(Arrays.asList(exclusion1, exclusion2));
 
-        assertThat(filter.include(artifact), is(false));
+        assertFalse(filter.include(artifact), "Artifact should be excluded by multiple exclusions");
     }
 
     @Test
@@ -143,7 +147,8 @@ void testMultipleExclusionsExcludeGroupIdWildcard() {
 
         ExclusionArtifactFilter filter = new ExclusionArtifactFilter(Arrays.asList(exclusion1, exclusion2));
 
-        assertThat(filter.include(artifact), is(false));
+        assertFalse(
+                filter.include(artifact), "Artifact should be excluded by multiple exclusions with groupId wildcard");
     }
 
     @Test
@@ -153,8 +158,8 @@ void testExcludeWithGlob() {
         exclusion.setArtifactId("maven-*");
         ExclusionArtifactFilter filter = new ExclusionArtifactFilter(Collections.singletonList(exclusion));
 
-        assertThat(filter.include(artifact), is(false));
-        assertThat(filter.include(artifact2), is(true));
+        assertFalse(filter.include(artifact), "Maven artifact should be excluded by glob pattern");
+        assertTrue(filter.include(artifact2), "JUnit artifact should not be excluded by maven-* glob pattern");
     }
 
     @Test
@@ -164,7 +169,7 @@ void testExcludeWithGlobStar() {
         exclusion.setArtifactId("maven-**");
         ExclusionArtifactFilter filter = new ExclusionArtifactFilter(Collections.singletonList(exclusion));
 
-        assertThat(filter.include(artifact), is(false));
-        assertThat(filter.include(artifact2), is(true));
+        assertFalse(filter.include(artifact), "Maven artifact should be excluded by glob star pattern");
+        assertTrue(filter.include(artifact2), "JUnit artifact should not be excluded by maven-** glob star pattern");
     }
 }
diff --git a/impl/maven-core/src/test/java/org/apache/maven/classrealm/DefaultClassRealmManagerTest.java b/impl/maven-core/src/test/java/org/apache/maven/classrealm/DefaultClassRealmManagerTest.java
index c90e75bece..411a483b22 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/classrealm/DefaultClassRealmManagerTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/classrealm/DefaultClassRealmManagerTest.java
@@ -38,9 +38,8 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.endsWith;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.calls;
 import static org.mockito.Mockito.inOrder;
 import static org.mockito.Mockito.mock;
@@ -119,7 +118,9 @@ void testDebugEnabled() throws PlexusContainerException {
         assertEquals(classRealmManager.getMavenApiRealm(), classRealm.getParentClassLoader());
         assertEquals("project>modelGroup1:modelArtifact1:modelVersion1", classRealm.getId());
         assertEquals(1, classRealm.getURLs().length);
-        assertThat(classRealm.getURLs()[0].getPath(), endsWith("local/repository/some/path"));
+        assertTrue(
+                classRealm.getURLs()[0].getPath().endsWith("local/repository/some/path"),
+                "ClassRealm URL should end with local repository path");
 
         verifier.verify(logger, calls(1)).debug("Importing foreign packages into class realm {}", "maven.api");
         verifier.verify(logger, calls(1)).debug("  Imported: {} < {}", "group1:artifact1", "test");
@@ -153,7 +154,9 @@ void testDebugDisabled() throws PlexusContainerException {
         assertEquals(classRealmManager.getMavenApiRealm(), classRealm.getParentClassLoader());
         assertEquals("project>modelGroup1:modelArtifact1:modelVersion1", classRealm.getId());
         assertEquals(1, classRealm.getURLs().length);
-        assertThat(classRealm.getURLs()[0].getPath(), endsWith("local/repository/some/path"));
+        assertTrue(
+                classRealm.getURLs()[0].getPath().endsWith("local/repository/some/path"),
+                "ClassRealm URL should end with local repository path");
 
         verifier.verify(logger, calls(1)).debug("Importing foreign packages into class realm {}", "maven.api");
         verifier.verify(logger, calls(1)).debug("  Imported: {} < {}", "group1:artifact1", "test");
diff --git a/impl/maven-core/src/test/java/org/apache/maven/configuration/internal/EnhancedCompositeBeanHelperTest.java b/impl/maven-core/src/test/java/org/apache/maven/configuration/internal/EnhancedCompositeBeanHelperTest.java
index 031c62b69b..ab954855a8 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/configuration/internal/EnhancedCompositeBeanHelperTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/configuration/internal/EnhancedCompositeBeanHelperTest.java
@@ -124,7 +124,7 @@ void testPerformanceWithRepeatedCalls() throws Exception {
 
         // Second call should be faster (though this is not guaranteed in all environments)
         // We mainly verify that both calls work correctly
-        assertTrue(time2 >= 0); // Just verify it completed
+        assertTrue(time2 >= 0, "Expected " + time2 + " to be >= " + 0); // Just verify it completed
     }
 
     @Test
diff --git a/impl/maven-core/src/test/java/org/apache/maven/execution/DefaultBuildResumptionAnalyzerTest.java b/impl/maven-core/src/test/java/org/apache/maven/execution/DefaultBuildResumptionAnalyzerTest.java
index 6ed0ecfb8b..010fef95c0 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/execution/DefaultBuildResumptionAnalyzerTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/execution/DefaultBuildResumptionAnalyzerTest.java
@@ -28,8 +28,9 @@
 
 import static java.util.Arrays.asList;
 import static java.util.Collections.singletonList;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.is;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 class DefaultBuildResumptionAnalyzerTest {
     private final DefaultBuildResumptionAnalyzer analyzer = new DefaultBuildResumptionAnalyzer();
@@ -49,8 +50,8 @@ void resumeFromGetsDetermined() {
 
         Optional<BuildResumptionData> result = analyzer.determineBuildResumptionData(executionResult);
 
-        assertThat(result.isPresent(), is(true));
-        assertThat(result.get().getRemainingProjects(), is(asList("test:B")));
+        assertTrue(result.isPresent(), "Expected " + result + ".isPresent() to return true");
+        assertEquals(asList("test:B"), result.get().getRemainingProjects());
     }
 
     @Test
@@ -61,7 +62,7 @@ void resumeFromIsIgnoredWhenFirstProjectFails() {
 
         Optional<BuildResumptionData> result = analyzer.determineBuildResumptionData(executionResult);
 
-        assertThat(result.isPresent(), is(false));
+        assertFalse(result.isPresent(), "Expected " + result + ".isPresent() to return false");
     }
 
     @Test
@@ -73,8 +74,8 @@ void projectsSucceedingAfterFailedProjectsAreExcluded() {
 
         Optional<BuildResumptionData> result = analyzer.determineBuildResumptionData(executionResult);
 
-        assertThat(result.isPresent(), is(true));
-        assertThat(result.get().getRemainingProjects(), is(asList("test:B")));
+        assertTrue(result.isPresent(), "Expected " + result + ".isPresent() to return true");
+        assertEquals(asList("test:B"), result.get().getRemainingProjects());
     }
 
     @Test
@@ -87,8 +88,8 @@ void projectsDependingOnFailedProjectsAreNotExcluded() {
 
         Optional<BuildResumptionData> result = analyzer.determineBuildResumptionData(executionResult);
 
-        assertThat(result.isPresent(), is(true));
-        assertThat(result.get().getRemainingProjects(), is(asList("test:B", "test:C")));
+        assertTrue(result.isPresent(), "Expected " + result + ".isPresent() to return true");
+        assertEquals(asList("test:B", "test:C"), result.get().getRemainingProjects());
     }
 
     @Test
@@ -101,8 +102,8 @@ void projectsFailingAfterAnotherFailedProjectAreNotExcluded() {
 
         Optional<BuildResumptionData> result = analyzer.determineBuildResumptionData(executionResult);
 
-        assertThat(result.isPresent(), is(true));
-        assertThat(result.get().getRemainingProjects(), is(asList("test:B", "test:D")));
+        assertTrue(result.isPresent(), "Expected " + result + ".isPresent() to return true");
+        assertEquals(asList("test:B", "test:D"), result.get().getRemainingProjects());
     }
 
     private MavenProject createMavenProject(String artifactId) {
diff --git a/impl/maven-core/src/test/java/org/apache/maven/execution/DefaultBuildResumptionDataRepositoryTest.java b/impl/maven-core/src/test/java/org/apache/maven/execution/DefaultBuildResumptionDataRepositoryTest.java
index 009c7e7529..1dbb0e5ee3 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/execution/DefaultBuildResumptionDataRepositoryTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/execution/DefaultBuildResumptionDataRepositoryTest.java
@@ -27,10 +27,8 @@
 import org.junit.jupiter.api.Test;
 
 import static java.util.Collections.singleton;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.containsInAnyOrder;
-import static org.hamcrest.Matchers.empty;
-import static org.hamcrest.Matchers.is;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 class DefaultBuildResumptionDataRepositoryTest {
     private final DefaultBuildResumptionDataRepository repository = new DefaultBuildResumptionDataRepository();
@@ -43,7 +41,7 @@ void resumeFromPropertyGetsApplied() {
 
         repository.applyResumptionProperties(request, properties);
 
-        assertThat(request.getProjectActivation().getOptionalActiveProjectSelectors(), is(singleton(":module-a")));
+        assertEquals(singleton(":module-a"), request.getProjectActivation().getOptionalActiveProjectSelectors());
     }
 
     @Test
@@ -55,7 +53,7 @@ void resumeFromPropertyDoesNotOverrideExistingRequestParameters() {
 
         repository.applyResumptionProperties(request, properties);
 
-        assertThat(request.getResumeFrom(), is(":module-b"));
+        assertEquals(":module-b", request.getResumeFrom());
     }
 
     @Test
@@ -69,9 +67,11 @@ void projectsFromPropertyGetsAddedToExistingRequestParameters() {
 
         repository.applyResumptionProperties(request, properties);
 
-        assertThat(
-                request.getProjectActivation().getOptionalActiveProjectSelectors(),
-                containsInAnyOrder(":module-a", ":module-b", ":module-c"));
+        var selectors = request.getProjectActivation().getOptionalActiveProjectSelectors();
+        assertEquals(3, selectors.size());
+        assertTrue(selectors.contains(":module-a"), "Expected selectors " + selectors + " to contain :module-a");
+        assertTrue(selectors.contains(":module-b"), "Expected selectors " + selectors + " to contain :module-b");
+        assertTrue(selectors.contains(":module-c"), "Expected selectors " + selectors + " to contain :module-c");
     }
 
     @Test
@@ -82,7 +82,9 @@ void selectedProjectsAreNotAddedWhenPropertyValueIsEmpty() {
 
         repository.applyResumptionProperties(request, properties);
 
-        assertThat(request.getProjectActivation().getOptionalActiveProjectSelectors(), is(empty()));
+        assertTrue(request.getProjectActivation()
+                .getOptionalActiveProjectSelectors()
+                .isEmpty());
     }
 
     @Test
@@ -95,8 +97,7 @@ void applyResumptionDataShouldLoadData() {
 
         repository.applyResumptionData(request, rootProject);
 
-        assertThat(
-                request.getProjectActivation().getOptionalActiveProjectSelectors(),
-                containsInAnyOrder("example:module-c"));
+        assertEquals(
+                singleton("example:module-c"), request.getProjectActivation().getOptionalActiveProjectSelectors());
     }
 }
diff --git a/impl/maven-core/src/test/java/org/apache/maven/execution/DefaultMavenExecutionTest.java b/impl/maven-core/src/test/java/org/apache/maven/execution/DefaultMavenExecutionTest.java
index 605137abae..b486b6abc3 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/execution/DefaultMavenExecutionTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/execution/DefaultMavenExecutionTest.java
@@ -23,11 +23,9 @@
 import org.apache.maven.project.MavenProject;
 import org.junit.jupiter.api.Test;
 
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.empty;
-import static org.hamcrest.Matchers.is;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNotSame;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  */
@@ -46,6 +44,8 @@ void testResultWithNullTopologicallySortedProjectsIsEmptyList() {
         result.setTopologicallySortedProjects(null);
         List<MavenProject> projects = result.getTopologicallySortedProjects();
         assertNotNull(projects);
-        assertThat(projects, is(empty()));
+        assertTrue(
+                projects.isEmpty(),
+                "Expected collection to be empty but had " + projects.size() + " elements: " + projects);
     }
 }
diff --git a/impl/maven-core/src/test/java/org/apache/maven/graph/DefaultGraphBuilderTest.java b/impl/maven-core/src/test/java/org/apache/maven/graph/DefaultGraphBuilderTest.java
index cabbf41e18..07bcbf90d4 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/graph/DefaultGraphBuilderTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/graph/DefaultGraphBuilderTest.java
@@ -63,8 +63,9 @@
 import static org.apache.maven.execution.MavenExecutionRequest.REACTOR_MAKE_DOWNSTREAM;
 import static org.apache.maven.execution.MavenExecutionRequest.REACTOR_MAKE_UPSTREAM;
 import static org.apache.maven.graph.DefaultGraphBuilderTest.ScenarioBuilder.scenario;
-import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyList;
@@ -314,25 +315,22 @@ void testGetReactorProjects(
 
         // Then
         if (parameterExpectedResult instanceof SelectedProjectsResult selectedProjectsResult) {
-            assertThat(result.hasErrors())
-                    .withFailMessage("Expected result not to have errors")
-                    .isFalse();
+            assertFalse(result.hasErrors(), "Expected result not to have errors");
             List<String> expectedProjectNames = selectedProjectsResult.projectNames;
             List<MavenProject> actualReactorProjects = result.get().getSortedProjects();
             List<MavenProject> expectedReactorProjects =
                     expectedProjectNames.stream().map(artifactIdProjectMap::get).collect(toList());
             assertEquals(expectedReactorProjects, actualReactorProjects, parameterDescription);
         } else {
-            assertThat(result.hasErrors())
-                    .withFailMessage("Expected result to have errors")
-                    .isTrue();
+            assertTrue(result.hasErrors(), "Expected result to have errors");
             Class<? extends Throwable> expectedException = ((ExceptionThrown) parameterExpectedResult).expected;
             String partOfMessage = ((ExceptionThrown) parameterExpectedResult).partOfMessage;
 
-            assertThat(result.getProblems()).hasSize(1);
-            result.getProblems().forEach(p -> assertThat(p.getException())
-                    .isInstanceOf(expectedException)
-                    .hasMessageContaining(partOfMessage));
+            assertEquals(1, ((Collection) result.getProblems()).size());
+            result.getProblems().forEach(p -> {
+                assertTrue(expectedException.isInstance(p.getException()));
+                assertTrue(p.getException().getMessage().contains(partOfMessage));
+            });
         }
     }
 
@@ -368,9 +366,7 @@ void testProcessPackagingAttribute() throws ProjectBuildingException {
 
         Result<ProjectDependencyGraph> result = graphBuilder.build(session);
 
-        assertThat(result.hasErrors())
-                .withFailMessage("Expected result not to have errors")
-                .isFalse();
+        assertFalse(result.hasErrors(), "Expected result not to have errors");
         List<MavenProject> actualReactorProjects = result.get().getSortedProjects();
         assertEquals(2, actualReactorProjects.size());
         assertEquals("pom", actualReactorProjects.get(1).getPackaging());
diff --git a/impl/maven-core/src/test/java/org/apache/maven/graph/DefaultProjectDependencyGraphTest.java b/impl/maven-core/src/test/java/org/apache/maven/graph/DefaultProjectDependencyGraphTest.java
index 090702135f..9774625ccf 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/graph/DefaultProjectDependencyGraphTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/graph/DefaultProjectDependencyGraphTest.java
@@ -100,8 +100,8 @@ public void testGetDownstreamDoesNotDuplicateProjects() throws CycleDetectedExce
         graph = new FilteredProjectDependencyGraph(graph, Arrays.asList(aProject, dProject, eProject));
         final List<MavenProject> downstreamProjects = graph.getDownstreamProjects(aProject, false);
         assertEquals(2, downstreamProjects.size());
-        assertTrue(downstreamProjects.contains(dProject));
-        assertTrue(downstreamProjects.contains(eProject));
+        assertTrue(downstreamProjects.contains(dProject), "Expected " + downstreamProjects + " to contain " + dProject);
+        assertTrue(downstreamProjects.contains(eProject), "Expected " + downstreamProjects + " to contain " + eProject);
     }
 
     @Test
diff --git a/impl/maven-core/src/test/java/org/apache/maven/graph/ProjectSelectorTest.java b/impl/maven-core/src/test/java/org/apache/maven/graph/ProjectSelectorTest.java
index 2cdeac39b8..9c897f8bec 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/graph/ProjectSelectorTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/graph/ProjectSelectorTest.java
@@ -35,13 +35,11 @@
 import org.junit.jupiter.params.provider.EmptySource;
 import org.junit.jupiter.params.provider.ValueSource;
 
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.contains;
-import static org.hamcrest.Matchers.containsString;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.notNullValue;
-import static org.hamcrest.Matchers.nullValue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -55,7 +53,7 @@ void getBaseDirectoryFromRequestWhenDirectoryIsNullReturnNull() {
 
         final File baseDirectoryFromRequest = sut.getBaseDirectoryFromRequest(mavenExecutionRequest);
 
-        assertThat(baseDirectoryFromRequest, nullValue());
+        assertNull(baseDirectoryFromRequest);
     }
 
     @Test
@@ -64,8 +62,8 @@ void getBaseDirectoryFromRequestWhenDirectoryIsValidReturnFile() {
 
         final File baseDirectoryFromRequest = sut.getBaseDirectoryFromRequest(mavenExecutionRequest);
 
-        assertThat(baseDirectoryFromRequest, notNullValue());
-        assertThat(baseDirectoryFromRequest.getPath(), is(new File("path/to/file").getPath()));
+        assertNotNull(baseDirectoryFromRequest);
+        assertEquals(new File("path/to/file").getPath(), baseDirectoryFromRequest.getPath());
     }
 
     @ParameterizedTest
@@ -73,14 +71,14 @@ void getBaseDirectoryFromRequestWhenDirectoryIsValidReturnFile() {
     @EmptySource
     void isMatchingProjectNoMatchOnSelectorReturnsFalse(String selector) {
         final boolean result = sut.isMatchingProject(createMavenProject("maven-core"), selector, null);
-        assertThat(result, is(false));
+        assertEquals(false, result);
     }
 
     @ParameterizedTest
     @ValueSource(strings = {":maven-core", "org.apache.maven:maven-core"})
     void isMatchingProjectMatchOnSelectorReturnsTrue(String selector) {
         final boolean result = sut.isMatchingProject(createMavenProject("maven-core"), selector, null);
-        assertThat(result, is(true));
+        assertEquals(true, result);
     }
 
     @Test
@@ -93,7 +91,7 @@ void isMatchingProjectMatchOnFileReturnsTrue() throws IOException {
         final boolean result = sut.isMatchingProject(mavenProject, selector, tempFile.getParentFile());
 
         tempFile.delete();
-        assertThat(result, is(true));
+        assertEquals(true, result);
     }
 
     @Test
@@ -107,7 +105,7 @@ void isMatchingProjectMatchOnDirectoryReturnsTrue(@TempDir File tempDir) {
         final boolean result = sut.isMatchingProject(mavenProject, selector, tempDir);
 
         tempProjectDir.delete();
-        assertThat(result, is(true));
+        assertEquals(true, result);
     }
 
     @Test
@@ -122,8 +120,8 @@ void getOptionalProjectsBySelectorsReturnsMatches() {
         final Set<MavenProject> optionalProjectsBySelectors =
                 sut.getOptionalProjectsBySelectors(mavenExecutionRequest, listOfProjects, selectors);
 
-        assertThat(optionalProjectsBySelectors.size(), is(1));
-        assertThat(optionalProjectsBySelectors, contains(mavenProject));
+        assertEquals(1, optionalProjectsBySelectors.size());
+        assertEquals(List.of(mavenProject), List.copyOf(optionalProjectsBySelectors));
     }
 
     @Test
@@ -138,8 +136,8 @@ void getRequiredProjectsBySelectorsThrowsMavenExecutionException() {
         final MavenExecutionException exception = assertThrows(
                 MavenExecutionException.class,
                 () -> sut.getRequiredProjectsBySelectors(mavenExecutionRequest, listOfProjects, selectors));
-        assertThat(exception.getMessage(), containsString("Could not find"));
-        assertThat(exception.getMessage(), containsString(":required"));
+        assertTrue(exception.getMessage().contains("Could not find"));
+        assertTrue(exception.getMessage().contains(":required"));
     }
 
     @Test
@@ -153,8 +151,8 @@ void getRequiredProjectsBySelectorsReturnsProject() throws MavenExecutionExcepti
         final Set<MavenProject> requiredProjectsBySelectors =
                 sut.getRequiredProjectsBySelectors(mavenExecutionRequest, listOfProjects, selectors);
 
-        assertThat(requiredProjectsBySelectors.size(), is(1));
-        assertThat(requiredProjectsBySelectors, contains(mavenProject));
+        assertEquals(1, requiredProjectsBySelectors.size());
+        assertEquals(List.of(mavenProject), List.copyOf(requiredProjectsBySelectors));
     }
 
     @Test
@@ -172,8 +170,8 @@ void getRequiredProjectsBySelectorsReturnsProjectWithChildProjects() throws Mave
         final Set<MavenProject> requiredProjectsBySelectors =
                 sut.getRequiredProjectsBySelectors(mavenExecutionRequest, listOfProjects, selectors);
 
-        assertThat(requiredProjectsBySelectors.size(), is(2));
-        assertThat(requiredProjectsBySelectors, contains(mavenProject, child));
+        assertEquals(2, requiredProjectsBySelectors.size());
+        assertEquals(List.of(mavenProject, child), List.copyOf(requiredProjectsBySelectors));
     }
 
     @Test
@@ -191,8 +189,8 @@ void getOptionalProjectsBySelectorsReturnsProjectWithChildProjects() {
         final Set<MavenProject> optionalProjectsBySelectors =
                 sut.getOptionalProjectsBySelectors(mavenExecutionRequest, listOfProjects, selectors);
 
-        assertThat(optionalProjectsBySelectors.size(), is(2));
-        assertThat(optionalProjectsBySelectors, contains(mavenProject, child));
+        assertEquals(2, optionalProjectsBySelectors.size());
+        assertEquals(List.of(mavenProject, child), List.copyOf(optionalProjectsBySelectors));
     }
 
     private MavenProject createMavenProject(String artifactId) {
diff --git a/impl/maven-core/src/test/java/org/apache/maven/internal/aether/ReverseTreeRepositoryListenerTest.java b/impl/maven-core/src/test/java/org/apache/maven/internal/aether/ReverseTreeRepositoryListenerTest.java
index 8e7210b979..55698bb093 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/internal/aether/ReverseTreeRepositoryListenerTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/internal/aether/ReverseTreeRepositoryListenerTest.java
@@ -27,10 +27,10 @@
 import org.eclipse.aether.repository.LocalRepository;
 import org.junit.jupiter.api.Test;
 
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.hamcrest.CoreMatchers.sameInstance;
-import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -51,12 +51,9 @@ void isLocalRepositoryArtifactTest() {
         Artifact nonLocalReposioryArtifact = mock(Artifact.class);
         when(nonLocalReposioryArtifact.getFile()).thenReturn(new File("something/completely/different"));
 
-        assertThat(
-                ReverseTreeRepositoryListener.isLocalRepositoryArtifactOrMissing(session, localRepositoryArtifact),
-                equalTo(true));
-        assertThat(
-                ReverseTreeRepositoryListener.isLocalRepositoryArtifactOrMissing(session, nonLocalReposioryArtifact),
-                equalTo(false));
+        assertTrue(ReverseTreeRepositoryListener.isLocalRepositoryArtifactOrMissing(session, localRepositoryArtifact));
+        assertFalse(
+                ReverseTreeRepositoryListener.isLocalRepositoryArtifactOrMissing(session, nonLocalReposioryArtifact));
     }
 
     @Test
@@ -69,16 +66,14 @@ void isMissingArtifactTest() {
         Artifact localRepositoryArtifact = mock(Artifact.class);
         when(localRepositoryArtifact.getFile()).thenReturn(null);
 
-        assertThat(
-                ReverseTreeRepositoryListener.isLocalRepositoryArtifactOrMissing(session, localRepositoryArtifact),
-                equalTo(true));
+        assertTrue(ReverseTreeRepositoryListener.isLocalRepositoryArtifactOrMissing(session, localRepositoryArtifact));
     }
 
     @Test
     void lookupCollectStepDataTest() {
         RequestTrace doesNotHaveIt =
                 RequestTrace.newChild(null, "foo").newChild("bar").newChild("baz");
-        assertThat(ReverseTreeRepositoryListener.lookupCollectStepData(doesNotHaveIt), nullValue());
+        assertNull(ReverseTreeRepositoryListener.lookupCollectStepData(doesNotHaveIt));
 
         final CollectStepData data = mock(CollectStepData.class);
 
@@ -86,18 +81,18 @@ void lookupCollectStepDataTest() {
                 .newChild("foo")
                 .newChild("bar")
                 .newChild("baz");
-        assertThat(ReverseTreeRepositoryListener.lookupCollectStepData(haveItFirst), sameInstance(data));
+        assertSame(data, ReverseTreeRepositoryListener.lookupCollectStepData(haveItFirst));
 
         RequestTrace haveItLast = RequestTrace.newChild(null, "foo")
                 .newChild("bar")
                 .newChild("baz")
                 .newChild(data);
-        assertThat(ReverseTreeRepositoryListener.lookupCollectStepData(haveItLast), sameInstance(data));
+        assertSame(data, ReverseTreeRepositoryListener.lookupCollectStepData(haveItLast));
 
         RequestTrace haveIt = RequestTrace.newChild(null, "foo")
                 .newChild("bar")
                 .newChild(data)
                 .newChild("baz");
-        assertThat(ReverseTreeRepositoryListener.lookupCollectStepData(haveIt), sameInstance(data));
+        assertSame(data, ReverseTreeRepositoryListener.lookupCollectStepData(haveIt));
     }
 }
diff --git a/impl/maven-core/src/test/java/org/apache/maven/internal/impl/PropertiesAsMapTest.java b/impl/maven-core/src/test/java/org/apache/maven/internal/impl/PropertiesAsMapTest.java
index b0afd8632c..b3b0ec7f2e 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/internal/impl/PropertiesAsMapTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/internal/impl/PropertiesAsMapTest.java
@@ -47,13 +47,13 @@ void testPropertiesAsMap() {
         assertEquals(2, set.size());
         Iterator<Entry<String, String>> iterator = set.iterator();
         assertNotNull(iterator);
-        assertTrue(iterator.hasNext());
-        assertTrue(iterator.hasNext());
+        assertTrue(iterator.hasNext(), "Expected " + iterator + ".hasNext() to return true");
+        assertTrue(iterator.hasNext(), "Expected " + iterator + ".hasNext() to return true");
         Entry<String, String> entry = iterator.next();
         assertNotNull(entry);
         entry = iterator.next();
         assertNotNull(entry);
         assertThrows(NoSuchElementException.class, () -> iterator.next());
-        assertFalse(iterator.hasNext());
+        assertFalse(iterator.hasNext(), "Expected " + iterator + ".hasNext() to return false");
     }
 }
diff --git a/impl/maven-core/src/test/java/org/apache/maven/internal/impl/TestApi.java b/impl/maven-core/src/test/java/org/apache/maven/internal/impl/TestApi.java
index 82526ddebd..04802ccbee 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/internal/impl/TestApi.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/internal/impl/TestApi.java
@@ -157,7 +157,7 @@ void testCreateAndResolveArtifact() {
         assertNotNull(resolved);
         assertNotNull(resolved.getPath());
         Optional<Path> op = session.getArtifactPath(resolved);
-        assertTrue(op.isPresent());
+        assertTrue(op.isPresent(), "Expected " + op + ".isPresent() to return true");
         assertEquals(resolved.getPath(), op.get());
     }
 
diff --git a/impl/maven-core/src/test/java/org/apache/maven/internal/transformation/impl/ConsumerPomArtifactTransformerTest.java b/impl/maven-core/src/test/java/org/apache/maven/internal/transformation/impl/ConsumerPomArtifactTransformerTest.java
index f9bb018592..37c98e39b5 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/internal/transformation/impl/ConsumerPomArtifactTransformerTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/internal/transformation/impl/ConsumerPomArtifactTransformerTest.java
@@ -39,9 +39,12 @@
 import org.eclipse.aether.installation.InstallRequest;
 import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
-import org.xmlunit.assertj.XmlAssert;
+import org.xmlunit.builder.DiffBuilder;
+import org.xmlunit.diff.Diff;
 
-import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.when;
 
 class ConsumerPomArtifactTransformerTest {
@@ -70,7 +73,12 @@ void transform() throws Exception {
 
             t.transform(project, systemSessionMock, beforePomFile, tempFile);
         }
-        XmlAssert.assertThat(tempFile.toFile()).and(afterPomFile.toFile()).areIdentical();
+        Diff diff = DiffBuilder.compare(afterPomFile.toFile())
+                .withTest(tempFile.toFile())
+                .ignoreComments()
+                .ignoreWhitespace()
+                .build();
+        assertFalse(diff.hasDifferences(), "XML files should be identical: " + diff.toString());
     }
 
     @Test
@@ -97,7 +105,12 @@ void transformJarConsumerPom() throws Exception {
 
             t.transform(project, systemSessionMock, beforePomFile, tempFile);
         }
-        XmlAssert.assertThat(afterPomFile.toFile()).and(tempFile.toFile()).areIdentical();
+        Diff diff = DiffBuilder.compare(afterPomFile.toFile())
+                .withTest(tempFile.toFile())
+                .ignoreComments()
+                .ignoreWhitespace()
+                .build();
+        assertFalse(diff.hasDifferences(), "XML files should be identical: " + diff.toString());
     }
 
     @Test
@@ -111,7 +124,7 @@ void injectTransformedArtifactsWithoutPomShouldNotInjectAnyArtifacts() throws IO
         new ConsumerPomArtifactTransformer((session, project, src) -> null)
                 .injectTransformedArtifacts(systemSessionMock, emptyProject);
 
-        assertThat(emptyProject.getAttachedArtifacts()).isEmpty();
+        assertTrue(emptyProject.getAttachedArtifacts().isEmpty());
     }
 
     @Test
@@ -126,10 +139,11 @@ void testDeployBuildPomEnabledByDefault() {
 
         // Should have both consumer POM (no classifier) and build POM (with "build" classifier)
         Collection<Artifact> artifacts = result.getArtifacts();
-        assertThat(artifacts).hasSize(3); // original jar + consumer pom + build pom
+        assertEquals(3, artifacts.size()); // original jar + consumer pom + build pom
 
-        assertThat(artifacts).anyMatch(a -> "pom".equals(a.getExtension()) && "".equals(a.getClassifier()));
-        assertThat(artifacts).anyMatch(a -> "pom".equals(a.getExtension()) && "build".equals(a.getClassifier()));
+        assertTrue(artifacts.stream().anyMatch(a -> "pom".equals(a.getExtension()) && "".equals(a.getClassifier())));
+        assertTrue(
+                artifacts.stream().anyMatch(a -> "pom".equals(a.getExtension()) && "build".equals(a.getClassifier())));
     }
 
     @Test
@@ -145,10 +159,11 @@ void testDeployBuildPomDisabled() {
 
         // Should have only consumer POM (no classifier), no build POM
         Collection<Artifact> artifacts = result.getArtifacts();
-        assertThat(artifacts).hasSize(2); // original jar + consumer pom (no build pom)
+        assertEquals(2, artifacts.size()); // original jar + consumer pom (no build pom)
 
-        assertThat(artifacts).anyMatch(a -> "pom".equals(a.getExtension()) && "".equals(a.getClassifier()));
-        assertThat(artifacts).noneMatch(a -> "pom".equals(a.getExtension()) && "build".equals(a.getClassifier()));
+        assertTrue(artifacts.stream().anyMatch(a -> "pom".equals(a.getExtension()) && "".equals(a.getClassifier())));
+        assertTrue(
+                artifacts.stream().noneMatch(a -> "pom".equals(a.getExtension()) && "build".equals(a.getClassifier())));
     }
 
     @Test
@@ -164,10 +179,11 @@ void testDeployBuildPomExplicitlyEnabled() {
 
         // Should have both consumer POM (no classifier) and build POM (with "build" classifier)
         Collection<Artifact> artifacts = result.getArtifacts();
-        assertThat(artifacts).hasSize(3); // original jar + consumer pom + build pom
+        assertEquals(3, artifacts.size()); // original jar + consumer pom + build pom
 
-        assertThat(artifacts).anyMatch(a -> "pom".equals(a.getExtension()) && "".equals(a.getClassifier()));
-        assertThat(artifacts).anyMatch(a -> "pom".equals(a.getExtension()) && "build".equals(a.getClassifier()));
+        assertTrue(artifacts.stream().anyMatch(a -> "pom".equals(a.getExtension()) && "".equals(a.getClassifier())));
+        assertTrue(
+                artifacts.stream().anyMatch(a -> "pom".equals(a.getExtension()) && "build".equals(a.getClassifier())));
     }
 
     @Test
@@ -183,10 +199,11 @@ void testDeployBuildPomWithBooleanValue() {
 
         // Should have only consumer POM (no classifier), no build POM
         Collection<Artifact> artifacts = result.getArtifacts();
-        assertThat(artifacts).hasSize(2); // original jar + consumer pom (no build pom)
+        assertEquals(2, artifacts.size()); // original jar + consumer pom (no build pom)
 
-        assertThat(artifacts).anyMatch(a -> "pom".equals(a.getExtension()) && "".equals(a.getClassifier()));
-        assertThat(artifacts).noneMatch(a -> "pom".equals(a.getExtension()) && "build".equals(a.getClassifier()));
+        assertTrue(artifacts.stream().anyMatch(a -> "pom".equals(a.getExtension()) && "".equals(a.getClassifier())));
+        assertTrue(
+                artifacts.stream().noneMatch(a -> "pom".equals(a.getExtension()) && "build".equals(a.getClassifier())));
     }
 
     @Test
@@ -202,10 +219,11 @@ void testInstallAlwaysIncludesBuildPom() {
 
         // Should have both consumer POM and build POM even when deployment is disabled
         Collection<Artifact> artifacts = result.getArtifacts();
-        assertThat(artifacts).hasSize(3); // original jar + consumer pom + build pom
+        assertEquals(3, artifacts.size()); // original jar + consumer pom + build pom
 
-        assertThat(artifacts).anyMatch(a -> "pom".equals(a.getExtension()) && "".equals(a.getClassifier()));
-        assertThat(artifacts).anyMatch(a -> "pom".equals(a.getExtension()) && "build".equals(a.getClassifier()));
+        assertTrue(artifacts.stream().anyMatch(a -> "pom".equals(a.getExtension()) && "".equals(a.getClassifier())));
+        assertTrue(
+                artifacts.stream().anyMatch(a -> "pom".equals(a.getExtension()) && "build".equals(a.getClassifier())));
     }
 
     @Test
@@ -220,7 +238,7 @@ void testDeployWithoutConsumerPomIsUnaffected() {
         DeployRequest result = transformer.remapDeployArtifacts(session, request);
 
         // Should be unchanged since there's no consumer POM
-        assertThat(result.getArtifacts()).isEqualTo(request.getArtifacts());
+        assertEquals(request.getArtifacts(), result.getArtifacts());
     }
 
     private RepositorySystemSession createMockSession(Map<String, Object> configProperties) {
diff --git a/impl/maven-core/src/test/java/org/apache/maven/lifecycle/DefaultLifecyclesTest.java b/impl/maven-core/src/test/java/org/apache/maven/lifecycle/DefaultLifecyclesTest.java
index 0856e5ce6e..0b36378871 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/lifecycle/DefaultLifecyclesTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/lifecycle/DefaultLifecyclesTest.java
@@ -34,10 +34,7 @@
 import org.codehaus.plexus.testing.PlexusTest;
 import org.junit.jupiter.api.Test;
 
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.arrayWithSize;
-import static org.hamcrest.Matchers.hasSize;
-import static org.hamcrest.Matchers.is;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -51,29 +48,29 @@ class DefaultLifecyclesTest {
     @Test
     void testDefaultLifecycles() {
         final List<Lifecycle> lifecycles = defaultLifeCycles.getLifeCycles();
-        assertThat(lifecycles, hasSize(3));
-        assertThat(DefaultLifecycles.STANDARD_LIFECYCLES, arrayWithSize(3));
+        assertEquals(3, lifecycles.size());
+        assertEquals(3, DefaultLifecycles.STANDARD_LIFECYCLES.length);
     }
 
     @Test
     void testDefaultLifecycle() {
         final Lifecycle lifecycle = getLifeCycleById("default");
-        assertThat(lifecycle.getId(), is("default"));
-        assertThat(lifecycle.getPhases(), hasSize(54));
+        assertEquals("default", lifecycle.getId());
+        assertEquals(54, lifecycle.getPhases().size());
     }
 
     @Test
     void testCleanLifecycle() {
         final Lifecycle lifecycle = getLifeCycleById("clean");
-        assertThat(lifecycle.getId(), is("clean"));
-        assertThat(lifecycle.getPhases(), hasSize(3));
+        assertEquals("clean", lifecycle.getId());
+        assertEquals(3, lifecycle.getPhases().size());
     }
 
     @Test
     void testSiteLifecycle() {
         final Lifecycle lifecycle = getLifeCycleById("site");
-        assertThat(lifecycle.getId(), is("site"));
-        assertThat(lifecycle.getPhases(), hasSize(6));
+        assertEquals("site", lifecycle.getId());
+        assertEquals(6, lifecycle.getPhases().size());
     }
 
     @Test
@@ -93,10 +90,10 @@ void testCustomLifecycle() throws ComponentLookupException {
                         List.of(new DefaultLifecycleRegistry.LifecycleWrapperProvider(mockedPlexusContainer))),
                 new DefaultLookup(mockedPlexusContainer));
 
-        assertThat(dl.getLifeCycles().get(0).getId(), is("clean"));
-        assertThat(dl.getLifeCycles().get(1).getId(), is("default"));
-        assertThat(dl.getLifeCycles().get(2).getId(), is("site"));
-        assertThat(dl.getLifeCycles().get(3).getId(), is("etl"));
+        assertEquals("clean", dl.getLifeCycles().get(0).getId());
+        assertEquals("default", dl.getLifeCycles().get(1).getId());
+        assertEquals("site", dl.getLifeCycles().get(2).getId());
+        assertEquals("etl", dl.getLifeCycles().get(3).getId());
     }
 
     private Lifecycle getLifeCycleById(String id) {
diff --git a/impl/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleExecutorTest.java b/impl/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleExecutorTest.java
index ca45e941b4..09f1027e99 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleExecutorTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/lifecycle/LifecycleExecutorTest.java
@@ -49,8 +49,6 @@
 import org.apache.maven.project.MavenProject;
 import org.junit.jupiter.api.Test;
 
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.hasSize;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
@@ -288,7 +286,7 @@ void testLifecycleQueryingUsingADefaultLifecyclePhase() throws Exception {
     void testLifecyclePluginsRetrievalForDefaultLifecycle() throws Exception {
         List<Plugin> plugins = new ArrayList<>(lifecycleExecutor.getPluginsBoundByDefaultToAllLifecycles("jar"));
 
-        assertThat(plugins.toString(), plugins, hasSize(8));
+        assertEquals(8, plugins.size(), plugins.toString());
     }
 
     @Test
diff --git a/impl/maven-core/src/test/java/org/apache/maven/lifecycle/internal/ProjectBuildListTest.java b/impl/maven-core/src/test/java/org/apache/maven/lifecycle/internal/ProjectBuildListTest.java
index 761ac82ec4..676a7b3f94 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/lifecycle/internal/ProjectBuildListTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/lifecycle/internal/ProjectBuildListTest.java
@@ -22,10 +22,8 @@
 import org.apache.maven.lifecycle.internal.stub.ProjectDependencyGraphStub;
 import org.junit.jupiter.api.Test;
 
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.greaterThanOrEqualTo;
-import static org.hamcrest.Matchers.is;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  */
@@ -35,10 +33,9 @@ void testGetByTaskSegment() throws Exception {
         final MavenSession session = ProjectDependencyGraphStub.getMavenSession();
         ProjectBuildList projectBuildList = ProjectDependencyGraphStub.getProjectBuildList(session);
         TaskSegment taskSegment = projectBuildList.get(0).getTaskSegment();
-        assertThat(
-                "This test assumes there are at least 6 elements in projectBuilds",
-                projectBuildList.size(),
-                is(greaterThanOrEqualTo(6)));
+        assertTrue(
+                projectBuildList.size() >= 6,
+                "Expected size " + projectBuildList.size() + " to be >= 6 for collection: " + projectBuildList);
 
         final ProjectBuildList byTaskSegment = projectBuildList.getByTaskSegment(taskSegment);
         assertEquals(projectBuildList.size(), byTaskSegment.size()); // TODO Make multiple segments on projectBuildList
diff --git a/impl/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/ProjectDependencyGraphStubTest.java b/impl/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/ProjectDependencyGraphStubTest.java
index 2a12af0725..fc85cf772c 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/ProjectDependencyGraphStubTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/lifecycle/internal/stub/ProjectDependencyGraphStubTest.java
@@ -43,21 +43,29 @@ void testADependencies() {
     void testBDependencies() {
         final List<MavenProject> bProjects = stub.getUpstreamProjects(ProjectDependencyGraphStub.B, false);
         assertEquals(1, bProjects.size());
-        assertTrue(bProjects.contains(ProjectDependencyGraphStub.A));
+        assertTrue(
+                bProjects.contains(ProjectDependencyGraphStub.A),
+                "Expected " + bProjects + " to contain " + ProjectDependencyGraphStub.A);
     }
 
     @Test
     void testCDependencies() {
         final List<MavenProject> cProjects = stub.getUpstreamProjects(ProjectDependencyGraphStub.C, false);
         assertEquals(1, cProjects.size());
-        assertTrue(cProjects.contains(ProjectDependencyGraphStub.A));
+        assertTrue(
+                cProjects.contains(ProjectDependencyGraphStub.A),
+                "Expected " + cProjects + " to contain " + ProjectDependencyGraphStub.A);
     }
 
     @Test
     void testXDependencies() {
         final List<MavenProject> cProjects = stub.getUpstreamProjects(ProjectDependencyGraphStub.X, false);
         assertEquals(2, cProjects.size());
-        assertTrue(cProjects.contains(ProjectDependencyGraphStub.C));
-        assertTrue(cProjects.contains(ProjectDependencyGraphStub.B));
+        assertTrue(
+                cProjects.contains(ProjectDependencyGraphStub.C),
+                "Expected " + cProjects + " to contain " + ProjectDependencyGraphStub.C);
+        assertTrue(
+                cProjects.contains(ProjectDependencyGraphStub.B),
+                "Expected " + cProjects + " to contain " + ProjectDependencyGraphStub.B);
     }
 }
diff --git a/impl/maven-core/src/test/java/org/apache/maven/plugin/internal/MavenPluginValidatorTest.java b/impl/maven-core/src/test/java/org/apache/maven/plugin/internal/MavenPluginValidatorTest.java
index 12c0bba71d..8456e54cdf 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/plugin/internal/MavenPluginValidatorTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/plugin/internal/MavenPluginValidatorTest.java
@@ -59,7 +59,8 @@ void testValidate() {
         descriptor.setVersion("0.1");
         List<String> errors = new ArrayList<>();
         mavenPluginValidator.validate(plugin, descriptor, errors);
-        assertTrue(errors.isEmpty());
+        assertTrue(
+                errors.isEmpty(), "Expected collection to be empty but had " + errors.size() + " elements: " + errors);
     }
 
     @Test
@@ -78,7 +79,7 @@ void testInvalidGroupId() {
         descriptor.setVersion("0.1");
         List<String> errors = new ArrayList<>();
         mavenPluginValidator.validate(plugin, descriptor, errors);
-        assertFalse(errors.isEmpty());
+        assertFalse(errors.isEmpty(), "Expected collection to not be empty but was empty");
     }
 
     @Test
@@ -97,7 +98,7 @@ void testInvalidArtifactId() {
         descriptor.setVersion("0.1");
         List<String> errors = new ArrayList<>();
         mavenPluginValidator.validate(plugin, descriptor, errors);
-        assertFalse(errors.isEmpty());
+        assertFalse(errors.isEmpty(), "Expected collection to not be empty but was empty");
     }
 
     @Test
@@ -115,6 +116,6 @@ void testInvalidVersion() {
         descriptor.setArtifactId("maven-it-plugin");
         List<String> errors = new ArrayList<>();
         mavenPluginValidator.validate(plugin, descriptor, errors);
-        assertFalse(errors.isEmpty());
+        assertFalse(errors.isEmpty(), "Expected collection to not be empty but was empty");
     }
 }
diff --git a/impl/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java b/impl/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java
index 3c5bcdd0ac..b891b66d0a 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/project/DefaultMavenProjectBuilderTest.java
@@ -39,13 +39,7 @@
 import org.junit.jupiter.api.io.TempDir;
 import org.mockito.Mockito;
 
-import static org.apache.maven.project.ProjectBuildingResultWithProblemMessageMatcher.projectBuildingResultWithProblemMessage;
 import static org.codehaus.plexus.testing.PlexusExtension.getTestFile;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.contains;
-import static org.hamcrest.Matchers.containsString;
-import static org.hamcrest.Matchers.greaterThan;
-import static org.hamcrest.Matchers.is;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -107,7 +101,7 @@ void testFutureModelVersion() throws Exception {
 
         ProjectBuildingException e = assertThrows(
                 ProjectBuildingException.class, () -> getProject(f1), "Expected to fail for future versions");
-        assertThat(e.getMessage(), containsString("Building this project requires a newer version of Maven"));
+        assertTrue(e.getMessage().contains("Building this project requires a newer version of Maven"));
     }
 
     @Test
@@ -118,7 +112,7 @@ void testPastModelVersion() throws Exception {
 
         ProjectBuildingException e = assertThrows(
                 ProjectBuildingException.class, () -> getProject(f1), "Expected to fail for past versions");
-        assertThat(e.getMessage(), containsString("Building this project requires an older version of Maven"));
+        assertTrue(e.getMessage().contains("Building this project requires an older version of Maven"));
     }
 
     @Test
@@ -127,7 +121,7 @@ void testFutureSchemaModelVersion() throws Exception {
 
         ProjectBuildingException e = assertThrows(
                 ProjectBuildingException.class, () -> getProject(f1), "Expected to fail for future versions");
-        assertThat(e.getMessage(), containsString("Building this project requires a newer version of Maven"));
+        assertTrue(e.getMessage().contains("Building this project requires a newer version of Maven"));
     }
 
     @Test
@@ -146,7 +140,7 @@ void testBuildStubModelForMissingRemotePom() throws Exception {
         assertNull(project.getParent());
         assertNull(project.getParentArtifact());
 
-        assertFalse(project.isExecutionRoot());
+        assertFalse(project.isExecutionRoot(), "Expected " + project + ".isExecutionRoot() to return false");
     }
 
     @Test
@@ -200,7 +194,9 @@ void testBuildParentVersionRangeLocallyWithoutChildVersion() throws Exception {
                 ProjectBuildingException.class,
                 () -> getProject(f1),
                 "Expected 'ProjectBuildingException' not thrown.");
-        assertThat(e.getResults(), contains(projectBuildingResultWithProblemMessage("Version must be a constant")));
+        assertEquals(1, e.getResults().size());
+        ProjectBuildingResultWithProblemMessageAssert.assertThat(e.getResults().get(0))
+                .hasProblemMessage("Version must be a constant");
     }
 
     /**
@@ -215,7 +211,9 @@ void testBuildParentVersionRangeLocallyWithChildProjectVersionExpression() throw
                 ProjectBuildingException.class,
                 () -> getProject(f1),
                 "Expected 'ProjectBuildingException' not thrown.");
-        assertThat(e.getResults(), contains(projectBuildingResultWithProblemMessage("Version must be a constant")));
+        assertEquals(1, e.getResults().size());
+        ProjectBuildingResultWithProblemMessageAssert.assertThat(e.getResults().get(0))
+                .hasProblemMessage("Version must be a constant");
     }
 
     /**
@@ -278,7 +276,9 @@ void testBuildParentVersionRangeExternallyWithoutChildVersion() throws Exception
                 ProjectBuildingException.class,
                 () -> getProjectFromRemoteRepository(f1),
                 "Expected 'ProjectBuildingException' not thrown.");
-        assertThat(e.getResults(), contains(projectBuildingResultWithProblemMessage("Version must be a constant")));
+        assertEquals(1, e.getResults().size());
+        ProjectBuildingResultWithProblemMessageAssert.assertThat(e.getResults().get(0))
+                .hasProblemMessage("Version must be a constant");
     }
 
     /**
@@ -293,7 +293,9 @@ void testBuildParentVersionRangeExternallyWithChildProjectVersionExpression() th
                 ProjectBuildingException.class,
                 () -> getProjectFromRemoteRepository(f1),
                 "Expected 'ProjectBuildingException' not thrown.");
-        assertThat(e.getResults(), contains(projectBuildingResultWithProblemMessage("Version must be a constant")));
+        assertEquals(1, e.getResults().size());
+        ProjectBuildingResultWithProblemMessageAssert.assertThat(e.getResults().get(0))
+                .hasProblemMessage("Version must be a constant");
     }
 
     /**
@@ -316,7 +318,7 @@ void rereadPomMng7063() throws Exception {
 
         MavenProject project =
                 projectBuilder.build(pom.toFile(), buildingRequest).getProject();
-        assertThat(project.getName(), is("aid")); // inherited from artifactId
+        assertEquals("aid", project.getName()); // inherited from artifactId
 
         try (InputStream pomResource =
                 DefaultMavenProjectBuilderTest.class.getResourceAsStream("/projects/reread/pom2.xml")) {
@@ -324,7 +326,7 @@ void rereadPomMng7063() throws Exception {
         }
 
         project = projectBuilder.build(pom.toFile(), buildingRequest).getProject();
-        assertThat(project.getName(), is("PROJECT NAME"));
+        assertEquals("PROJECT NAME", project.getName());
     }
 
     @Test
@@ -368,10 +370,10 @@ void testActivatedDefaultProfileBySource() throws Exception {
         assertEquals("active-by-default", profile.getId());
         InputLocation location = profile.getLocation("");
         assertNotNull(location);
-        assertThat(location.getLineNumber(), greaterThan(0));
-        assertThat(location.getColumnNumber(), greaterThan(0));
+        assertTrue(location.getLineNumber() > 0);
+        assertTrue(location.getColumnNumber() > 0);
         assertNotNull(location.getSource());
-        assertThat(location.getSource().getLocation(), containsString("pom-with-profiles/pom.xml"));
+        assertTrue(location.getSource().getLocation().contains("pom-with-profiles/pom.xml"));
     }
 
     @Test
@@ -406,18 +408,18 @@ void testActivatedExternalProfileBySource() throws Exception {
         assertEquals("active-by-default", profile.getId());
         InputLocation location = profile.getLocation("");
         assertNotNull(location);
-        assertThat(location.getLineNumber(), greaterThan(0));
-        assertThat(location.getColumnNumber(), greaterThan(0));
+        assertTrue(location.getLineNumber() > 0);
+        assertTrue(location.getColumnNumber() > 0);
         assertNotNull(location.getSource());
-        assertThat(location.getSource().getLocation(), containsString("pom-with-profiles/pom.xml"));
+        assertTrue(location.getSource().getLocation().contains("pom-with-profiles/pom.xml"));
         profile = activeProfiles.get(1);
         assertEquals("external-profile", profile.getId());
         location = profile.getLocation("");
         assertNotNull(location);
-        assertThat(location.getLineNumber(), greaterThan(0));
-        assertThat(location.getColumnNumber(), greaterThan(0));
+        assertTrue(location.getLineNumber() > 0);
+        assertTrue(location.getColumnNumber() > 0);
         assertNotNull(location.getSource());
-        assertThat(location.getSource().getLocation(), containsString("settings.xml"));
+        assertTrue(location.getSource().getLocation().contains("settings.xml"));
     }
 
     @Test
diff --git a/impl/maven-core/src/test/java/org/apache/maven/project/ExtensionDescriptorBuilderTest.java b/impl/maven-core/src/test/java/org/apache/maven/project/ExtensionDescriptorBuilderTest.java
index 5e73daa279..4232e08c23 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/project/ExtensionDescriptorBuilderTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/project/ExtensionDescriptorBuilderTest.java
@@ -27,11 +27,9 @@
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.empty;
-import static org.hamcrest.Matchers.is;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * Tests {@link ExtensionDescriptorBuilder}.
@@ -63,9 +61,9 @@ void testEmptyDescriptor() throws Exception {
 
         assertNotNull(ed);
         assertNotNull(ed.getExportedPackages());
-        assertThat(ed.getExportedPackages(), is(empty()));
+        assertTrue(ed.getExportedPackages().isEmpty());
         assertNotNull(ed.getExportedArtifacts());
-        assertThat(ed.getExportedArtifacts(), is(empty()));
+        assertTrue(ed.getExportedArtifacts().isEmpty());
     }
 
     @Test
diff --git a/impl/maven-core/src/test/java/org/apache/maven/project/GraphTest.java b/impl/maven-core/src/test/java/org/apache/maven/project/GraphTest.java
index ef2b83278d..d96551e449 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/project/GraphTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/project/GraphTest.java
@@ -78,10 +78,10 @@ public void testGraph() throws CycleDetectedException {
 
         Set<String> labels = graph.getVertices().stream().map(Vertex::getLabel).collect(Collectors.toSet());
         assertEquals(4, labels.size());
-        assertTrue(labels.contains("a"));
-        assertTrue(labels.contains("b"));
-        assertTrue(labels.contains("c"));
-        assertTrue(labels.contains("d"));
+        assertTrue(labels.contains("a"), "Expected " + labels + " to contain " + "a");
+        assertTrue(labels.contains("b"), "Expected " + labels + " to contain " + "b");
+        assertTrue(labels.contains("c"), "Expected " + labels + " to contain " + "c");
+        assertTrue(labels.contains("d"), "Expected " + labels + " to contain " + "d");
 
         addEdge(graph, "a", "d");
         assertEquals(2, a.getChildren().size());
diff --git a/impl/maven-core/src/test/java/org/apache/maven/project/MavenProjectTest.java b/impl/maven-core/src/test/java/org/apache/maven/project/MavenProjectTest.java
index 402fd3014f..67af48b502 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/project/MavenProjectTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/project/MavenProjectTest.java
@@ -213,6 +213,6 @@ void testAddDotFile() {
     }
 
     private void assertNoNulls(List<String> elements) {
-        assertFalse(elements.contains(null));
+        assertFalse(elements.contains(null), "Expected " + elements + " to not contain " + null);
     }
 }
diff --git a/impl/maven-core/src/test/java/org/apache/maven/project/PomConstructionTest.java b/impl/maven-core/src/test/java/org/apache/maven/project/PomConstructionTest.java
index d53b81cc4e..a6513e4091 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/project/PomConstructionTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/project/PomConstructionTest.java
@@ -51,10 +51,6 @@
 import org.junit.jupiter.api.Test;
 
 import static org.codehaus.plexus.testing.PlexusExtension.getBasedir;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.endsWith;
-import static org.hamcrest.Matchers.lessThan;
-import static org.hamcrest.Matchers.startsWith;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
@@ -1033,13 +1029,17 @@ void testMergedFilterOrder() throws Exception {
         PomTestWrapper pom = buildPom("merged-filter-order/sub");
 
         assertEquals(7, ((List<?>) pom.getValue("build/filters")).size());
-        assertThat(pom.getValue("build/filters[1]").toString(), endsWith("child-a.properties"));
-        assertThat(pom.getValue("build/filters[2]").toString(), endsWith("child-c.properties"));
-        assertThat(pom.getValue("build/filters[3]").toString(), endsWith("child-b.properties"));
-        assertThat(pom.getValue("build/filters[4]").toString(), endsWith("child-d.properties"));
-        assertThat(pom.getValue("build/filters[5]").toString(), endsWith("parent-c.properties"));
-        assertThat(pom.getValue("build/filters[6]").toString(), endsWith("parent-b.properties"));
-        assertThat(pom.getValue("build/filters[7]").toString(), endsWith("parent-d.properties"));
+        assertTrue(
+                pom.getValue("build/filters[1]").toString().endsWith("child-a.properties"),
+                "Expected " + pom.getValue("build/filters[1]") + " to end with child-a.properties");
+        assertTrue(
+                pom.getValue("build/filters[2]").toString().endsWith("child-c.properties"),
+                "Expected " + pom.getValue("build/filters[2]") + " to end with child-c.properties");
+        assertTrue(pom.getValue("build/filters[3]").toString().endsWith("child-b.properties"));
+        assertTrue(pom.getValue("build/filters[4]").toString().endsWith("child-d.properties"));
+        assertTrue(pom.getValue("build/filters[5]").toString().endsWith("parent-c.properties"));
+        assertTrue(pom.getValue("build/filters[6]").toString().endsWith("parent-b.properties"));
+        assertTrue(pom.getValue("build/filters[7]").toString().endsWith("parent-d.properties"));
     }
 
     /** MNG-4027*/
@@ -1180,7 +1180,7 @@ void testInterpolationOfRfc3986BaseUri() throws Exception {
         PomTestWrapper pom = buildPom("baseuri-interpolation/pom.xml");
         String prop1 = pom.getValue("properties/prop1").toString();
         assertEquals(pom.getBasedir().toPath().toUri().toASCIIString(), prop1);
-        assertThat(prop1, startsWith("file:///"));
+        assertTrue(prop1.startsWith("file:///"), "Expected " + prop1 + " to start with " + "file:///");
     }
 
     /* MNG-3811*/
@@ -1771,10 +1771,10 @@ void testPluginDeclarationsRetainPomOrderAfterInjectionOfDefaultPlugins() throws
         for (int i = 0; i < plugins.size(); i++) {
             Plugin plugin = plugins.get(i);
             if ("maven-resources-plugin".equals(plugin.getArtifactId())) {
-                assertThat(resourcesPlugin, lessThan(0));
+                assertTrue(resourcesPlugin < 0, "Expected " + resourcesPlugin + " to be < " + 0);
                 resourcesPlugin = i;
             } else if ("maven-it-plugin-log-file".equals(plugin.getArtifactId())) {
-                assertThat(customPlugin, lessThan(0));
+                assertTrue(customPlugin < 0, "Expected " + customPlugin + " to be < " + 0);
                 customPlugin = i;
             }
         }
diff --git a/impl/maven-core/src/test/java/org/apache/maven/project/ProjectBuilderTest.java b/impl/maven-core/src/test/java/org/apache/maven/project/ProjectBuilderTest.java
index 541ac8063c..69b1aef227 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/project/ProjectBuilderTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/project/ProjectBuilderTest.java
@@ -39,15 +39,6 @@
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.io.TempDir;
 
-import static org.apache.maven.project.ProjectBuildingResultWithLocationMatcher.projectBuildingResultWithLocation;
-import static org.apache.maven.project.ProjectBuildingResultWithProblemMessageMatcher.projectBuildingResultWithProblemMessage;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.contains;
-import static org.hamcrest.Matchers.containsString;
-import static org.hamcrest.Matchers.empty;
-import static org.hamcrest.Matchers.greaterThan;
-import static org.hamcrest.Matchers.hasKey;
-import static org.hamcrest.Matchers.is;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -98,12 +89,12 @@ void testVersionlessManagedDependency() throws Exception {
         ProjectBuildingException e = assertThrows(ProjectBuildingException.class, () -> getContainer()
                 .lookup(org.apache.maven.project.ProjectBuilder.class)
                 .build(pomFile, configuration));
-        assertThat(
-                e.getResults(),
-                contains(
-                        projectBuildingResultWithProblemMessage(
-                                "'dependencies.dependency.version' for groupId='org.apache.maven.its', artifactId='a', type='jar' is missing")));
-        assertThat(e.getResults(), contains(projectBuildingResultWithLocation(5, 9)));
+        assertEquals(1, e.getResults().size());
+        ProjectBuildingResultWithProblemMessageAssert.assertThat(e.getResults().get(0))
+                .hasProblemMessage(
+                        "'dependencies.dependency.version' for groupId='org.apache.maven.its', artifactId='a', type='jar' is missing");
+        ProjectBuildingResultWithLocationAssert.assertThat(e.getResults().get(0))
+                .hasLocation(5, 9);
     }
 
     @Test
@@ -187,7 +178,7 @@ void testReadModifiedPoms(@TempDir Path tempDir) throws Exception {
         Files.write(parent.toPath(), parentContent.getBytes(StandardCharsets.UTF_8));
         // re-build pom with modified parent
         ProjectBuildingResult result = projectBuilder.build(child, configuration);
-        assertThat(result.getProject().getProperties(), hasKey((Object) "addedProperty"));
+        assertTrue(result.getProject().getProperties().containsKey("addedProperty"));
     }
 
     @Test
@@ -235,7 +226,7 @@ void testReadInvalidPom() throws Exception {
 
         // single project build entry point
         Exception ex = assertThrows(Exception.class, () -> projectBuilder.build(pomFile, configuration));
-        assertThat(ex.getMessage(), containsString("Received non-all-whitespace CHARACTERS or CDATA event"));
+        assertTrue(ex.getMessage().contains("Received non-all-whitespace CHARACTERS or CDATA event"));
 
         // multi projects build entry point
         ProjectBuildingException pex = assertThrows(
@@ -243,11 +234,10 @@ void testReadInvalidPom() throws Exception {
                 () -> projectBuilder.build(Collections.singletonList(pomFile), false, configuration));
         assertEquals(1, pex.getResults().size());
         assertNotNull(pex.getResults().get(0).getPomFile());
-        assertThat(pex.getResults().get(0).getProblems().size(), greaterThan(0));
-        assertThat(
-                pex.getResults(),
-                contains(projectBuildingResultWithProblemMessage(
-                        "Received non-all-whitespace CHARACTERS or CDATA event in nextTag()")));
+        assertTrue(pex.getResults().get(0).getProblems().size() > 0);
+        ProjectBuildingResultWithProblemMessageAssert.assertThat(
+                        pex.getResults().get(0))
+                .hasProblemMessage("Received non-all-whitespace CHARACTERS or CDATA event in nextTag()");
     }
 
     @Test
@@ -298,7 +288,7 @@ private MavenProject findChildProject(List<ProjectBuildingResult> results) {
 
     private void assertResultShowNoError(List<ProjectBuildingResult> results) {
         for (ProjectBuildingResult result : results) {
-            assertThat(result.getProblems(), is(empty()));
+            assertTrue(result.getProblems().isEmpty());
             assertNotNull(result.getProject());
         }
     }
diff --git a/impl/maven-core/src/test/java/org/apache/maven/project/ProjectBuildingResultWithLocationAssert.java b/impl/maven-core/src/test/java/org/apache/maven/project/ProjectBuildingResultWithLocationAssert.java
new file mode 100644
index 0000000000..3e15ce14ad
--- /dev/null
+++ b/impl/maven-core/src/test/java/org/apache/maven/project/ProjectBuildingResultWithLocationAssert.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.project;
+
+import static java.util.stream.Collectors.joining;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * JUnit custom assertion to help create fluent assertions about {@link ProjectBuildingResult} instances.
+ */
+class ProjectBuildingResultWithLocationAssert {
+    private final ProjectBuildingResult actual;
+
+    ProjectBuildingResultWithLocationAssert(ProjectBuildingResult actual) {
+        this.actual = actual;
+    }
+
+    public static ProjectBuildingResultWithLocationAssert assertThat(ProjectBuildingResult actual) {
+        return new ProjectBuildingResultWithLocationAssert(actual);
+    }
+
+    public ProjectBuildingResultWithLocationAssert hasLocation(int columnNumber, int lineNumber) {
+        assertNotNull(actual);
+
+        boolean hasLocation = actual.getProblems().stream()
+                .anyMatch(p -> p.getLineNumber() == lineNumber && p.getColumnNumber() == columnNumber);
+
+        if (!hasLocation) {
+            String actualLocations = actual.getProblems().stream()
+                    .map(p -> formatLocation(p.getColumnNumber(), p.getLineNumber()))
+                    .collect(joining(", "));
+            String message = String.format(
+                    "Expected ProjectBuildingResult to have location <%s> but had locations <%s>",
+                    formatLocation(columnNumber, lineNumber), actualLocations);
+            assertTrue(false, message);
+        }
+
+        return this;
+    }
+
+    private String formatLocation(int columnNumber, int lineNumber) {
+        return String.format("line %d, column %d", lineNumber, columnNumber);
+    }
+
+    // Helper method for backward compatibility
+    static ProjectBuildingResultWithLocationAssert projectBuildingResultWithLocation(int columnNumber, int lineNumber) {
+        return new ProjectBuildingResultWithLocationAssert(null).hasLocation(columnNumber, lineNumber);
+    }
+}
diff --git a/impl/maven-core/src/test/java/org/apache/maven/project/ProjectBuildingResultWithLocationMatcher.java b/impl/maven-core/src/test/java/org/apache/maven/project/ProjectBuildingResultWithLocationMatcher.java
deleted file mode 100644
index ac46ca37e5..0000000000
--- a/impl/maven-core/src/test/java/org/apache/maven/project/ProjectBuildingResultWithLocationMatcher.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.maven.project;
-
-import org.hamcrest.BaseMatcher;
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-
-import static java.util.stream.Collectors.joining;
-
-/**
- * Hamcrest matcher to help create fluent assertions about {@link ProjectBuildingResult} instances.
- */
-class ProjectBuildingResultWithLocationMatcher extends BaseMatcher<ProjectBuildingResult> {
-    private final int columnNumber;
-    private final int lineNumber;
-
-    ProjectBuildingResultWithLocationMatcher(int columnNumber, int lineNumber) {
-        this.columnNumber = columnNumber;
-        this.lineNumber = lineNumber;
-    }
-
-    @Override
-    public boolean matches(Object o) {
-        if (o instanceof ProjectBuildingResult r) {
-            return r.getProblems().stream()
-                    .anyMatch(p -> p.getLineNumber() == lineNumber && p.getColumnNumber() == columnNumber);
-        } else {
-            return false;
-        }
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description
-                .appendText("a ProjectBuildingResult with location ")
-                .appendText(formatLocation(columnNumber, lineNumber));
-    }
-
-    private String formatLocation(int columnNumber, int lineNumber) {
-        return String.format("line %d, column %d", lineNumber, columnNumber);
-    }
-
-    @Override
-    public void describeMismatch(final Object o, final Description description) {
-        if (o instanceof ProjectBuildingResult r) {
-            description.appendText("was a ProjectBuildingResult with locations ");
-            String messages = r.getProblems().stream()
-                    .map(p -> formatLocation(p.getColumnNumber(), p.getLineNumber()))
-                    .collect(joining(", "));
-            description.appendText(messages);
-        } else {
-            super.describeMismatch(o, description);
-        }
-    }
-
-    static Matcher<ProjectBuildingResult> projectBuildingResultWithLocation(int columnNumber, int lineNumber) {
-        return new ProjectBuildingResultWithLocationMatcher(columnNumber, lineNumber);
-    }
-}
diff --git a/impl/maven-core/src/test/java/org/apache/maven/project/ProjectBuildingResultWithProblemMessageAssert.java b/impl/maven-core/src/test/java/org/apache/maven/project/ProjectBuildingResultWithProblemMessageAssert.java
new file mode 100644
index 0000000000..ed7a4c9558
--- /dev/null
+++ b/impl/maven-core/src/test/java/org/apache/maven/project/ProjectBuildingResultWithProblemMessageAssert.java
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.maven.project;
+
+import org.apache.maven.model.building.ModelProblem;
+
+import static java.util.stream.Collectors.joining;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * JUnit custom assertion to help create fluent assertions about {@link ProjectBuildingResult} instances.
+ */
+class ProjectBuildingResultWithProblemMessageAssert {
+    private final ProjectBuildingResult actual;
+
+    ProjectBuildingResultWithProblemMessageAssert(ProjectBuildingResult actual) {
+        this.actual = actual;
+    }
+
+    public static ProjectBuildingResultWithProblemMessageAssert assertThat(ProjectBuildingResult actual) {
+        return new ProjectBuildingResultWithProblemMessageAssert(actual);
+    }
+
+    public ProjectBuildingResultWithProblemMessageAssert hasProblemMessage(String problemMessage) {
+        assertNotNull(actual);
+
+        boolean hasMessage =
+                actual.getProblems().stream().anyMatch(p -> p.getMessage().contains(problemMessage));
+
+        if (!hasMessage) {
+            String actualMessages = actual.getProblems().stream()
+                    .map(ModelProblem::getMessage)
+                    .map(m -> "\"" + m + "\"")
+                    .collect(joining(", "));
+            String message = String.format(
+                    "Expected ProjectBuildingResult to have problem message containing <%s> but had messages <%s>",
+                    problemMessage, actualMessages);
+            assertTrue(false, message);
+        }
+
+        return this;
+    }
+
+    // Helper method for backward compatibility
+    static ProjectBuildingResultWithProblemMessageAssert projectBuildingResultWithProblemMessage(String message) {
+        return new ProjectBuildingResultWithProblemMessageAssert(null).hasProblemMessage(message);
+    }
+}
diff --git a/impl/maven-core/src/test/java/org/apache/maven/project/ProjectBuildingResultWithProblemMessageMatcher.java b/impl/maven-core/src/test/java/org/apache/maven/project/ProjectBuildingResultWithProblemMessageMatcher.java
deleted file mode 100644
index a180175c2a..0000000000
--- a/impl/maven-core/src/test/java/org/apache/maven/project/ProjectBuildingResultWithProblemMessageMatcher.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.maven.project;
-
-import org.apache.maven.model.building.ModelProblem;
-import org.hamcrest.BaseMatcher;
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-
-import static java.util.stream.Collectors.joining;
-
-/**
- * Hamcrest matcher to help create fluent assertions about {@link ProjectBuildingResult} instances.
- */
-class ProjectBuildingResultWithProblemMessageMatcher extends BaseMatcher<ProjectBuildingResult> {
-    private final String problemMessage;
-
-    ProjectBuildingResultWithProblemMessageMatcher(String problemMessage) {
-        this.problemMessage = problemMessage;
-    }
-
-    @Override
-    public boolean matches(Object o) {
-        if (o instanceof ProjectBuildingResult r) {
-            return r.getProblems().stream().anyMatch(p -> p.getMessage().contains(problemMessage));
-        } else {
-            return false;
-        }
-    }
-
-    @Override
-    public void describeTo(Description description) {
-        description.appendText("a ProjectBuildingResult with message ").appendValue(problemMessage);
-    }
-
-    @Override
-    public void describeMismatch(final Object o, final Description description) {
-        if (o instanceof ProjectBuildingResult r) {
-            description.appendText("was a ProjectBuildingResult with messages ");
-            String messages = r.getProblems().stream()
-                    .map(ModelProblem::getMessage)
-                    .map(m -> "\"" + m + "\"" + System.lineSeparator())
-                    .collect(joining(", "));
-            description.appendText(messages);
-        } else {
-            super.describeMismatch(o, description);
-        }
-    }
-
-    static Matcher<ProjectBuildingResult> projectBuildingResultWithProblemMessage(String message) {
-        return new ProjectBuildingResultWithProblemMessageMatcher(message);
-    }
-}
diff --git a/impl/maven-core/src/test/java/org/apache/maven/project/ProjectModelResolverTest.java b/impl/maven-core/src/test/java/org/apache/maven/project/ProjectModelResolverTest.java
index 522fc58e03..684ac70ef8 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/project/ProjectModelResolverTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/project/ProjectModelResolverTest.java
@@ -35,11 +35,10 @@
 import org.junit.jupiter.api.Test;
 
 import static org.codehaus.plexus.testing.PlexusExtension.getBasedir;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.containsString;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * Test cases for the project {@code ModelResolver} implementation.
@@ -67,7 +66,7 @@ void testResolveParentThrowsUnresolvableModelExceptionWhenNotFound() throws Exce
                 () -> newModelResolver().resolveModel(parent),
                 "Expected 'UnresolvableModelException' not thrown.");
         assertNotNull(e.getMessage());
-        assertThat(e.getMessage(), containsString("Could not find artifact org.apache:apache:pom:0 in central"));
+        assertTrue(e.getMessage().contains("Could not find artifact org.apache:apache:pom:0 in central"));
     }
 
     @Test
@@ -132,7 +131,7 @@ void testResolveDependencyThrowsUnresolvableModelExceptionWhenNotFound() throws
                 () -> newModelResolver().resolveModel(dependency),
                 "Expected 'UnresolvableModelException' not thrown.");
         assertNotNull(e.getMessage());
-        assertThat(e.getMessage(), containsString("Could not find artifact org.apache:apache:pom:0 in central"));
+        assertTrue(e.getMessage().contains("Could not find artifact org.apache:apache:pom:0 in central"));
     }
 
     @Test
diff --git a/impl/maven-core/src/test/java/org/apache/maven/project/ProjectSorterTest.java b/impl/maven-core/src/test/java/org/apache/maven/project/ProjectSorterTest.java
index ada0b514b4..209f3e44f9 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/project/ProjectSorterTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/project/ProjectSorterTest.java
@@ -31,10 +31,9 @@
 import org.apache.maven.model.PluginManagement;
 import org.junit.jupiter.api.Test;
 
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.hasItem;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * Test sorting projects by dependencies.
@@ -239,8 +238,10 @@ void testPluginDependenciesInfluenceSorting() throws Exception {
         assertEquals(parentProject, projects.get(0));
 
         // the order of these two is non-deterministic, based on when they're added to the reactor.
-        assertThat(projects, hasItem(pluginProject));
-        assertThat(projects, hasItem(pluginLevelDepProject));
+        assertTrue(projects.contains(pluginProject), "Expected " + projects + " to contain " + pluginProject);
+        assertTrue(
+                projects.contains(pluginLevelDepProject),
+                "Expected " + projects + " to contain " + pluginLevelDepProject);
 
         // the declaring project MUST be listed after the plugin and its plugin-level dep, though.
         assertEquals(declaringProject, projects.get(3));
@@ -276,8 +277,10 @@ void testPluginDependenciesInfluenceSortingDeclarationInParent() throws Exceptio
         assertEquals(parentProject, projects.get(0));
 
         // the order of these two is non-deterministic, based on when they're added to the reactor.
-        assertThat(projects, hasItem(pluginProject));
-        assertThat(projects, hasItem(pluginLevelDepProject));
+        assertTrue(projects.contains(pluginProject), "Expected " + projects + " to contain " + pluginProject);
+        assertTrue(
+                projects.contains(pluginLevelDepProject),
+                "Expected " + projects + " to contain " + pluginLevelDepProject);
     }
 
     @Test
@@ -294,8 +297,8 @@ void testPluginVersionsAreConsidered() throws Exception {
 
         projects = new ProjectSorter(projects).getSortedProjects();
 
-        assertThat(projects, hasItem(pluginProjectA));
-        assertThat(projects, hasItem(pluginProjectB));
+        assertTrue(projects.contains(pluginProjectA), "Expected " + projects + " to contain " + pluginProjectA);
+        assertTrue(projects.contains(pluginProjectB), "Expected " + projects + " to contain " + pluginProjectB);
     }
 
     @Test
diff --git a/impl/maven-core/src/test/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformationTest.java b/impl/maven-core/src/test/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformationTest.java
index e04b13aca0..1c474c69ed 100644
--- a/impl/maven-core/src/test/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformationTest.java
+++ b/impl/maven-core/src/test/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformationTest.java
@@ -38,7 +38,7 @@ class DefaultRuntimeInformationTest {
     void testGetMavenVersion() {
         String mavenVersion = rtInfo.getMavenVersion();
         assertNotNull(mavenVersion);
-        assertTrue(!mavenVersion.isEmpty());
+        assertTrue(!mavenVersion.isEmpty(), "Expected Maven version to not be empty but was: " + mavenVersion);
     }
 
     @Test
diff --git a/impl/maven-di/pom.xml b/impl/maven-di/pom.xml
index e554641efc..4068da194b 100644
--- a/impl/maven-di/pom.xml
+++ b/impl/maven-di/pom.xml
@@ -45,11 +45,6 @@ under the License.
       <artifactId>junit-jupiter-api</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.assertj</groupId>
-      <artifactId>assertj-core</artifactId>
-      <scope>test</scope>
-    </dependency>
   </dependencies>
 
 </project>
diff --git a/impl/maven-di/src/test/java/org/apache/maven/di/impl/InjectorImplTest.java b/impl/maven-di/src/test/java/org/apache/maven/di/impl/InjectorImplTest.java
index fff936fdfa..46ea1b3318 100644
--- a/impl/maven-di/src/test/java/org/apache/maven/di/impl/InjectorImplTest.java
+++ b/impl/maven-di/src/test/java/org/apache/maven/di/impl/InjectorImplTest.java
@@ -38,7 +38,6 @@
 import org.junit.jupiter.api.Test;
 
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertInstanceOf;
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
@@ -46,6 +45,7 @@
 import static org.junit.jupiter.api.Assertions.assertNotSame;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 @SuppressWarnings("unused")
 public class InjectorImplTest {
@@ -416,11 +416,20 @@ void testCircularPriorityDependency() {
         DIException exception = assertThrows(DIException.class, () -> {
             injector.getInstance(CircularPriorityTest.MyService.class);
         });
-        assertThat(exception).isInstanceOf(DIException.class).hasMessageContaining("HighPriorityServiceImpl");
-        assertThat(exception.getCause())
-                .isInstanceOf(DIException.class)
-                .hasMessageContaining("Cyclic dependency detected")
-                .hasMessageContaining("MyService");
+        assertInstanceOf(DIException.class, exception, "Expected exception to be DIException");
+        assertTrue(
+                exception.getMessage().contains("HighPriorityServiceImpl"),
+                "Expected exception message to contain 'HighPriorityServiceImpl' but was: " + exception.getMessage());
+
+        assertInstanceOf(DIException.class, exception.getCause(), "Expected cause to be DIException");
+        assertTrue(
+                exception.getCause().getMessage().contains("Cyclic dependency detected"),
+                "Expected cause message to contain 'Cyclic dependency detected' but was: "
+                        + exception.getCause().getMessage());
+        assertTrue(
+                exception.getCause().getMessage().contains("MyService"),
+                "Expected cause message to contain 'MyService' but was: "
+                        + exception.getCause().getMessage());
     }
 
     @Test
diff --git a/impl/maven-impl/pom.xml b/impl/maven-impl/pom.xml
index 09e9074494..ca1b5ddbe8 100644
--- a/impl/maven-impl/pom.xml
+++ b/impl/maven-impl/pom.xml
@@ -145,16 +145,6 @@ under the License.
       <artifactId>mockito-junit-jupiter</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.hamcrest</groupId>
-      <artifactId>hamcrest</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.assertj</groupId>
-      <artifactId>assertj-core</artifactId>
-      <scope>test</scope>
-    </dependency>
     <dependency>
       <groupId>org.apache.maven.resolver</groupId>
       <artifactId>maven-resolver-transport-file</artifactId>
diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultPluginXmlFactoryTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultPluginXmlFactoryTest.java
index 4031fb9186..e566e4d9fc 100644
--- a/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultPluginXmlFactoryTest.java
+++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultPluginXmlFactoryTest.java
@@ -21,6 +21,7 @@
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.io.Writer;
@@ -40,10 +41,11 @@
 import org.junit.jupiter.api.io.TempDir;
 
 import static java.util.UUID.randomUUID;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.AssertionsForClassTypes.assertThatExceptionOfType;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -72,37 +74,37 @@ void readFromInputStreamParsesPluginDescriptorCorrectly() {
         PluginDescriptor descriptor = defaultPluginXmlFactory.read(XmlReaderRequest.builder()
                 .inputStream(new ByteArrayInputStream(SAMPLE_PLUGIN_XML.getBytes()))
                 .build());
-        assertThat(descriptor.getName()).isEqualTo(NAME);
-        assertThat(descriptor.getGroupId()).isEqualTo("org.example");
-        assertThat(descriptor.getArtifactId()).isEqualTo("sample-plugin");
-        assertThat(descriptor.getVersion()).isEqualTo("1.0.0");
+        assertEquals(NAME, descriptor.getName());
+        assertEquals("org.example", descriptor.getGroupId());
+        assertEquals("sample-plugin", descriptor.getArtifactId());
+        assertEquals("1.0.0", descriptor.getVersion());
     }
 
     @Test
     void parsePlugin() {
-        assertThat(defaultPluginXmlFactory
-                        .read(XmlReaderRequest.builder()
-                                .reader(new StringReader(SAMPLE_PLUGIN_XML))
-                                .build())
-                        .getName())
-                .isEqualTo(NAME);
+        String actualName = defaultPluginXmlFactory
+                .read(XmlReaderRequest.builder()
+                        .reader(new StringReader(SAMPLE_PLUGIN_XML))
+                        .build())
+                .getName();
+        assertEquals(NAME, actualName, "Expected plugin name to be " + NAME + " but was " + actualName);
     }
 
     @Test
     void readFromPathParsesPluginDescriptorCorrectly() throws Exception {
         Path xmlFile = tempDir.resolve("plugin.xml");
         Files.write(xmlFile, SAMPLE_PLUGIN_XML.getBytes());
-        assertThat(defaultPluginXmlFactory
-                        .read(XmlReaderRequest.builder().path(xmlFile).build())
-                        .getName())
-                .isEqualTo(NAME);
+        String actualName = defaultPluginXmlFactory
+                .read(XmlReaderRequest.builder().path(xmlFile).build())
+                .getName();
+        assertEquals(NAME, actualName, "Expected plugin name to be " + NAME + " but was " + actualName);
     }
 
     @Test
     void readWithNoInputThrowsIllegalArgumentException() {
-        assertThatExceptionOfType(IllegalArgumentException.class)
-                .isThrownBy(() ->
-                        defaultPluginXmlFactory.read(XmlReaderRequest.builder().build()));
+        assertThrows(
+                IllegalArgumentException.class,
+                () -> defaultPluginXmlFactory.read(XmlReaderRequest.builder().build()));
     }
 
     @Test
@@ -118,8 +120,12 @@ void writeToWriterGeneratesValidXml() {
                         .build())
                 .build());
         String output = writer.toString();
-        assertThat(output).contains("<name>" + NAME + "</name>");
-        assertThat(output).contains("<groupId>org.example</groupId>");
+        assertTrue(
+                output.contains("<name>" + NAME + "</name>"),
+                "Expected " + output + " to contain " + "<name>" + NAME + "</name>");
+        assertTrue(
+                output.contains("<groupId>org.example</groupId>"),
+                "Expected " + output + " to contain " + "<groupId>org.example</groupId>");
     }
 
     @Test
@@ -129,7 +135,10 @@ void writeToOutputStreamGeneratesValidXml() {
                 .outputStream(outputStream)
                 .content(PluginDescriptor.newBuilder().name(NAME).build())
                 .build());
-        assertThat(outputStream.toString()).contains("<name>" + NAME + "</name>");
+        String output = outputStream.toString();
+        assertTrue(
+                output.contains("<name>" + NAME + "</name>"),
+                "Expected output to contain <name>" + NAME + "</name> but was: " + output);
     }
 
     @Test
@@ -139,16 +148,31 @@ void writeToPathGeneratesValidXmlFile() throws Exception {
                 .path(xmlFile)
                 .content(PluginDescriptor.newBuilder().name(NAME).build())
                 .build());
-        assertThat(Files.readString(xmlFile)).contains("<name>" + NAME + "</name>");
+        String fileContent = Files.readString(xmlFile);
+        assertTrue(
+                fileContent.contains("<name>" + NAME + "</name>"),
+                "Expected file content to contain <name>" + NAME + "</name> but was: " + fileContent);
     }
 
     @Test
     void fromXmlStringParsesValidXml() {
         PluginDescriptor descriptor = defaultPluginXmlFactory.fromXmlString(SAMPLE_PLUGIN_XML);
-        assertThat(descriptor.getName()).isEqualTo(NAME);
-        assertThat(descriptor.getGroupId()).isEqualTo("org.example");
-        assertThat(descriptor.getArtifactId()).isEqualTo("sample-plugin");
-        assertThat(descriptor.getVersion()).isEqualTo("1.0.0");
+        assertEquals(
+                NAME,
+                descriptor.getName(),
+                "Expected descriptor name to be " + NAME + " but was " + descriptor.getName());
+        assertEquals(
+                "org.example",
+                descriptor.getGroupId(),
+                "Expected descriptor groupId to be org.example but was " + descriptor.getGroupId());
+        assertEquals(
+                "sample-plugin",
+                descriptor.getArtifactId(),
+                "Expected descriptor artifactId to be sample-plugin but was " + descriptor.getArtifactId());
+        assertEquals(
+                "1.0.0",
+                descriptor.getVersion(),
+                "Expected descriptor version to be 1.0.0 but was " + descriptor.getVersion());
     }
 
     @Test
@@ -159,19 +183,39 @@ void toXmlStringGeneratesValidXml() {
                 .artifactId("sample-plugin")
                 .version("1.0.0")
                 .build());
-        assertThat(xml).contains("<name>" + NAME + "</name>");
-        assertThat(xml).contains("<groupId>org.example</groupId>");
-        assertThat(xml).contains("<artifactId>sample-plugin</artifactId>");
-        assertThat(xml).contains("<version>1.0.0</version>");
+        assertTrue(
+                xml.contains("<name>" + NAME + "</name>"),
+                "Expected " + xml + " to contain " + "<name>" + NAME + "</name>");
+        assertTrue(
+                xml.contains("<groupId>org.example</groupId>"),
+                "Expected " + xml + " to contain " + "<groupId>org.example</groupId>");
+        assertTrue(
+                xml.contains("<artifactId>sample-plugin</artifactId>"),
+                "Expected " + xml + " to contain " + "<artifactId>sample-plugin</artifactId>");
+        assertTrue(
+                xml.contains("<version>1.0.0</version>"),
+                "Expected " + xml + " to contain " + "<version>1.0.0</version>");
     }
 
     @Test
     void staticFromXmlParsesValidXml() {
         PluginDescriptor descriptor = DefaultPluginXmlFactory.fromXml(SAMPLE_PLUGIN_XML);
-        assertThat(descriptor.getName()).isEqualTo(NAME);
-        assertThat(descriptor.getGroupId()).isEqualTo("org.example");
-        assertThat(descriptor.getArtifactId()).isEqualTo("sample-plugin");
-        assertThat(descriptor.getVersion()).isEqualTo("1.0.0");
+        assertEquals(
+                NAME,
+                descriptor.getName(),
+                "Expected descriptor name to be " + NAME + " but was " + descriptor.getName());
+        assertEquals(
+                "org.example",
+                descriptor.getGroupId(),
+                "Expected descriptor groupId to be org.example but was " + descriptor.getGroupId());
+        assertEquals(
+                "sample-plugin",
+                descriptor.getArtifactId(),
+                "Expected descriptor artifactId to be sample-plugin but was " + descriptor.getArtifactId());
+        assertEquals(
+                "1.0.0",
+                descriptor.getVersion(),
+                "Expected descriptor version to be 1.0.0 but was " + descriptor.getVersion());
     }
 
     @Test
@@ -182,19 +226,30 @@ void staticToXmlGeneratesValidXml() {
                 .artifactId("sample-plugin")
                 .version("1.0.0")
                 .build());
-        assertThat(xml).contains("<name>" + NAME + "</name>");
-        assertThat(xml).contains("<name>" + NAME + "</name>");
-        assertThat(xml).contains("<groupId>org.example</groupId>");
-        assertThat(xml).contains("<artifactId>sample-plugin</artifactId>");
-        assertThat(xml).contains("<version>1.0.0</version>");
+        assertTrue(
+                xml.contains("<name>" + NAME + "</name>"),
+                "Expected " + xml + " to contain " + "<name>" + NAME + "</name>");
+        assertTrue(
+                xml.contains("<name>" + NAME + "</name>"),
+                "Expected " + xml + " to contain " + "<name>" + NAME + "</name>");
+        assertTrue(
+                xml.contains("<groupId>org.example</groupId>"),
+                "Expected " + xml + " to contain " + "<groupId>org.example</groupId>");
+        assertTrue(
+                xml.contains("<artifactId>sample-plugin</artifactId>"),
+                "Expected " + xml + " to contain " + "<artifactId>sample-plugin</artifactId>");
+        assertTrue(
+                xml.contains("<version>1.0.0</version>"),
+                "Expected " + xml + " to contain " + "<version>1.0.0</version>");
     }
 
     @Test
     void writeWithFailingWriterThrowsXmlWriterException() {
         String unableToWritePlugin = "Unable to write plugin" + randomUUID();
         String ioEx = "ioEx" + randomUUID();
-        XmlWriterException exception = assertThatExceptionOfType(XmlWriterException.class)
-                .isThrownBy(() -> defaultPluginXmlFactory.write(XmlWriterRequest.<PluginDescriptor>builder()
+        XmlWriterException exception = assertThrows(
+                XmlWriterException.class,
+                () -> defaultPluginXmlFactory.write(XmlWriterRequest.<PluginDescriptor>builder()
                         .writer(new Writer() {
                             @Override
                             public void write(char[] cbuf, int off, int len) {
@@ -210,55 +265,72 @@ public void close() {}
                         .content(PluginDescriptor.newBuilder()
                                 .name("Failing Plugin")
                                 .build())
-                        .build()))
-                .actual();
-        assertThat(exception.getMessage()).contains(unableToWritePlugin);
-        assertThat(exception.getCause()).isInstanceOf(XmlWriterException.class);
-        assertThat(exception.getCause().getCause().getMessage()).isEqualTo(ioEx);
-        assertThat(exception.getCause().getMessage()).isEqualTo(unableToWritePlugin);
+                        .build()));
+        assertTrue(exception.getMessage().contains(unableToWritePlugin));
+        assertInstanceOf(XmlWriterException.class, exception.getCause());
+        assertEquals(ioEx, exception.getCause().getCause().getMessage());
+        assertEquals(unableToWritePlugin, exception.getCause().getMessage());
     }
 
     @Test
     void writeWithNoTargetThrowsIllegalArgumentException() {
-        assertThat(assertThrows(
-                                IllegalArgumentException.class,
-                                () -> defaultPluginXmlFactory.write(XmlWriterRequest.<PluginDescriptor>builder()
-                                        .content(PluginDescriptor.newBuilder()
-                                                .name("No Output Plugin")
-                                                .build())
-                                        .build()))
-                        .getMessage())
-                .isEqualTo("writer, outputStream or path must be non null");
+        IllegalArgumentException exception = assertThrows(
+                IllegalArgumentException.class,
+                () -> defaultPluginXmlFactory.write(XmlWriterRequest.<PluginDescriptor>builder()
+                        .content(PluginDescriptor.newBuilder()
+                                .name("No Output Plugin")
+                                .build())
+                        .build()));
+        assertEquals(
+                "writer, outputStream or path must be non null",
+                exception.getMessage(),
+                "Expected specific error message but was: " + exception.getMessage());
     }
 
     @Test
     void readMalformedXmlThrowsXmlReaderException() {
-        XmlReaderException exception = assertThatExceptionOfType(XmlReaderException.class)
-                .isThrownBy(() -> defaultPluginXmlFactory.read(XmlReaderRequest.builder()
+        XmlReaderException exception = assertThrows(
+                XmlReaderException.class,
+                () -> defaultPluginXmlFactory.read(XmlReaderRequest.builder()
                         .inputStream(new ByteArrayInputStream("<plugin><name>Broken Plugin".getBytes()))
-                        .build()))
-                .actual();
-        assertThat(exception.getMessage()).contains("Unable to read plugin");
-        assertThat(exception.getCause()).isInstanceOf(WstxEOFException.class);
+                        .build()));
+        assertTrue(exception.getMessage().contains("Unable to read plugin"));
+        assertInstanceOf(WstxEOFException.class, exception.getCause());
     }
 
     @Test
     void locateExistingPomWithFilePathShouldReturnSameFileIfRegularFile() throws IOException {
         Path pomFile = Files.createTempFile(tempDir, "pom", ".xml");
         DefaultModelProcessor processor = new DefaultModelProcessor(mock(ModelXmlFactory.class), List.of());
-        assertThat(processor.locateExistingPom(pomFile)).isEqualTo(pomFile);
+        assertEquals(
+                pomFile, processor.locateExistingPom(pomFile), "Expected locateExistingPom to return the same file");
     }
 
     @Test
     void readFromUrlParsesPluginDescriptorCorrectly() throws Exception {
         Path xmlFile = tempDir.resolve("plugin.xml");
         Files.write(xmlFile, SAMPLE_PLUGIN_XML.getBytes());
-        PluginDescriptor descriptor = defaultPluginXmlFactory.read(
-                XmlReaderRequest.builder().url(xmlFile.toUri().toURL()).build());
-        assertThat(descriptor.getName()).isEqualTo(NAME);
-        assertThat(descriptor.getGroupId()).isEqualTo("org.example");
-        assertThat(descriptor.getArtifactId()).isEqualTo("sample-plugin");
-        assertThat(descriptor.getVersion()).isEqualTo("1.0.0");
+        PluginDescriptor descriptor;
+        try (InputStream inputStream = xmlFile.toUri().toURL().openStream()) {
+            descriptor = defaultPluginXmlFactory.read(
+                    XmlReaderRequest.builder().inputStream(inputStream).build());
+        }
+        assertEquals(
+                NAME,
+                descriptor.getName(),
+                "Expected descriptor name to be " + NAME + " but was " + descriptor.getName());
+        assertEquals(
+                "org.example",
+                descriptor.getGroupId(),
+                "Expected descriptor groupId to be org.example but was " + descriptor.getGroupId());
+        assertEquals(
+                "sample-plugin",
+                descriptor.getArtifactId(),
+                "Expected descriptor artifactId to be sample-plugin but was " + descriptor.getArtifactId());
+        assertEquals(
+                "1.0.0",
+                descriptor.getVersion(),
+                "Expected descriptor version to be 1.0.0 but was " + descriptor.getVersion());
     }
 
     @Test
diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultProblemCollectorTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultProblemCollectorTest.java
index b6623e0337..dbfba563fb 100644
--- a/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultProblemCollectorTest.java
+++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultProblemCollectorTest.java
@@ -37,16 +37,16 @@ void severityFatalDetection() {
         ProblemCollector<BuilderProblem> collector = ProblemCollector.create(5);
 
         assertFalse(collector.hasProblemsFor(BuilderProblem.Severity.WARNING));
-        assertFalse(collector.hasErrorProblems());
-        assertFalse(collector.hasFatalProblems());
+        assertFalse(collector.hasErrorProblems(), "Expected " + collector + ".hasErrorProblems() to return false");
+        assertFalse(collector.hasFatalProblems(), "Expected " + collector + ".hasFatalProblems() to return false");
 
         collector.reportProblem(
                 new DefaultBuilderProblem("source", 0, 0, null, "message", BuilderProblem.Severity.FATAL));
 
         // fatal triggers all
         assertTrue(collector.hasProblemsFor(BuilderProblem.Severity.WARNING));
-        assertTrue(collector.hasErrorProblems());
-        assertTrue(collector.hasFatalProblems());
+        assertTrue(collector.hasErrorProblems(), "Expected " + collector + ".hasErrorProblems() to return true");
+        assertTrue(collector.hasFatalProblems(), "Expected " + collector + ".hasFatalProblems() to return true");
     }
 
     @Test
@@ -54,16 +54,16 @@ void severityErrorDetection() {
         ProblemCollector<BuilderProblem> collector = ProblemCollector.create(5);
 
         assertFalse(collector.hasProblemsFor(BuilderProblem.Severity.WARNING));
-        assertFalse(collector.hasErrorProblems());
-        assertFalse(collector.hasFatalProblems());
+        assertFalse(collector.hasErrorProblems(), "Expected " + collector + ".hasErrorProblems() to return false");
+        assertFalse(collector.hasFatalProblems(), "Expected " + collector + ".hasFatalProblems() to return false");
 
         collector.reportProblem(
                 new DefaultBuilderProblem("source", 0, 0, null, "message", BuilderProblem.Severity.ERROR));
 
         // error triggers error + warning
         assertTrue(collector.hasProblemsFor(BuilderProblem.Severity.WARNING));
-        assertTrue(collector.hasErrorProblems());
-        assertFalse(collector.hasFatalProblems());
+        assertTrue(collector.hasErrorProblems(), "Expected " + collector + ".hasErrorProblems() to return true");
+        assertFalse(collector.hasFatalProblems(), "Expected " + collector + ".hasFatalProblems() to return false");
     }
 
     @Test
@@ -71,16 +71,16 @@ void severityWarningDetection() {
         ProblemCollector<BuilderProblem> collector = ProblemCollector.create(5);
 
         assertFalse(collector.hasProblemsFor(BuilderProblem.Severity.WARNING));
-        assertFalse(collector.hasErrorProblems());
-        assertFalse(collector.hasFatalProblems());
+        assertFalse(collector.hasErrorProblems(), "Expected " + collector + ".hasErrorProblems() to return false");
+        assertFalse(collector.hasFatalProblems(), "Expected " + collector + ".hasFatalProblems() to return false");
 
         collector.reportProblem(
                 new DefaultBuilderProblem("source", 0, 0, null, "message", BuilderProblem.Severity.WARNING));
 
         // warning triggers warning only
         assertTrue(collector.hasProblemsFor(BuilderProblem.Severity.WARNING));
-        assertFalse(collector.hasErrorProblems());
-        assertFalse(collector.hasFatalProblems());
+        assertFalse(collector.hasErrorProblems(), "Expected " + collector + ".hasErrorProblems() to return false");
+        assertFalse(collector.hasFatalProblems(), "Expected " + collector + ".hasFatalProblems() to return false");
     }
 
     @Test
diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultToolchainManagerTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultToolchainManagerTest.java
index c916d0ca5f..cec13a2019 100644
--- a/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultToolchainManagerTest.java
+++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/DefaultToolchainManagerTest.java
@@ -87,7 +87,8 @@ void getToolchainsWithValidTypeAndRequirements() {
     @Test
     void getToolchainsWithInvalidType() {
         List<Toolchain> result = manager.getToolchains(session, "invalid", null);
-        assertTrue(result.isEmpty());
+        assertTrue(
+                result.isEmpty(), "Expected collection to be empty but had " + result.size() + " elements: " + result);
     }
 
     @Test
@@ -106,7 +107,7 @@ void storeAndRetrieveToolchainFromBuildContext() {
         manager.storeToolchainToBuildContext(session, mockToolchain);
         Optional<Toolchain> result = manager.getToolchainFromBuildContext(session, "jdk");
 
-        assertTrue(result.isPresent());
+        assertTrue(result.isPresent(), "Expected " + result + ".isPresent() to return true");
         assertEquals(mockToolchain, result.get());
     }
 
diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/PathSelectorTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/PathSelectorTest.java
index f541ee5e40..cc5297c724 100644
--- a/impl/maven-impl/src/test/java/org/apache/maven/impl/PathSelectorTest.java
+++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/PathSelectorTest.java
@@ -86,9 +86,13 @@ public void testExcludeOmission() {
         List<String> excludes = List.of("baz/**");
         PathMatcher matcher = PathSelector.of(directory, includes, excludes, true);
         String s = matcher.toString();
-        assertTrue(s.contains("glob:**/*.java") || s.contains("glob:{**/,}*.java"));
-        assertFalse(s.contains("project.pj")); // Unnecessary exclusion should have been omitted.
-        assertFalse(s.contains(".DS_Store"));
+        assertTrue(
+                s.contains("glob:**/*.java") || s.contains("glob:{**/,}*.java"),
+                "Expected " + s + " to contain " + "glob:**/*.java" + " or " + "glob:{**/,}*.java");
+        assertFalse(
+                s.contains("project.pj"),
+                "Expected " + s + " to not contain " + "project.pj"); // Unnecessary exclusion should have been omitted.
+        assertFalse(s.contains(".DS_Store"), "Expected " + s + " to not contain " + ".DS_Store");
     }
 
     /**
diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/RequestTraceHelperTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/RequestTraceHelperTest.java
index 33294298ad..94acf3848c 100644
--- a/impl/maven-impl/src/test/java/org/apache/maven/impl/RequestTraceHelperTest.java
+++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/RequestTraceHelperTest.java
@@ -56,7 +56,9 @@ void testInterpretTraceWithArtifactRequest() {
 
         String result = RequestTraceHelper.interpretTrace(false, trace);
 
-        assertTrue(result.startsWith("artifact request for "));
+        assertTrue(
+                result.startsWith("artifact request for "),
+                "Expected " + result + " to start with " + "artifact request for ");
     }
 
     @Test
diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultDependencyManagementImporterTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultDependencyManagementImporterTest.java
index 8e30494bf7..98ec997534 100644
--- a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultDependencyManagementImporterTest.java
+++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultDependencyManagementImporterTest.java
@@ -24,7 +24,8 @@
 import org.apache.maven.api.model.InputSource;
 import org.junit.jupiter.api.Test;
 
-import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 class DefaultDependencyManagementImporterTest {
     @Test
@@ -33,7 +34,7 @@ void testUpdateWithImportedFromDependencyLocationAndBomLocationAreNullDependency
         final DependencyManagement depMgmt = DependencyManagement.newBuilder().build();
         final Dependency result = DefaultDependencyManagementImporter.updateWithImportedFrom(dependency, depMgmt);
 
-        assertThat(dependency).isEqualTo(result);
+        assertEquals(result, dependency);
     }
 
     @Test
@@ -48,9 +49,13 @@ void testUpdateWithImportedFromDependencyManagementAndDependencyHaveSameSourceDe
 
         final Dependency result = DefaultDependencyManagementImporter.updateWithImportedFrom(dependency, bom);
 
-        assertThat(result).isNotNull();
-        assertThat(result.getImportedFrom().toString())
-                .isEqualTo(bom.getLocation("").toString());
+        assertNotNull(result);
+        String actualImportedFrom = result.getImportedFrom().toString();
+        String expectedImportedFrom = bom.getLocation("").toString();
+        assertEquals(
+                expectedImportedFrom,
+                actualImportedFrom,
+                "Expected importedFrom to be " + expectedImportedFrom + " but was " + actualImportedFrom);
     }
 
     @Test
@@ -69,9 +74,13 @@ public void testUpdateWithImportedFromSingleLevelImportedFromSet() {
         final Dependency result = DefaultDependencyManagementImporter.updateWithImportedFrom(dependency, bom);
 
         // Assert
-        assertThat(result).isNotNull();
-        assertThat(result.getImportedFrom().toString())
-                .isEqualTo(bom.getLocation("").toString());
+        assertNotNull(result);
+        String actualImportedFrom = result.getImportedFrom().toString();
+        String expectedImportedFrom = bom.getLocation("").toString();
+        assertEquals(
+                expectedImportedFrom,
+                actualImportedFrom,
+                "Expected importedFrom to be " + expectedImportedFrom + " but was " + actualImportedFrom);
     }
 
     @Test
@@ -94,8 +103,12 @@ public void testUpdateWithImportedFromMultiLevelImportedFromSetChanged() {
         final Dependency result = DefaultDependencyManagementImporter.updateWithImportedFrom(dependency, bom);
 
         // Assert
-        assertThat(result.getImportedFrom().toString())
-                .isEqualTo(bom.getLocation("").toString());
+        String actualImportedFrom = result.getImportedFrom().toString();
+        String expectedImportedFrom = bom.getLocation("").toString();
+        assertEquals(
+                expectedImportedFrom,
+                actualImportedFrom,
+                "Expected importedFrom to be " + expectedImportedFrom + " but was " + actualImportedFrom);
     }
 
     @Test
@@ -118,7 +131,11 @@ public void testUpdateWithImportedFromMultiLevelAlreadyFoundInDifferentSourceImp
                 DefaultDependencyManagementImporter.updateWithImportedFrom(dependency, differentSource);
 
         // Assert
-        assertThat(result.getImportedFrom().toString())
-                .isEqualTo(differentSource.getLocation("").toString());
+        String actualImportedFrom = result.getImportedFrom().toString();
+        String expectedImportedFrom = differentSource.getLocation("").toString();
+        assertEquals(
+                expectedImportedFrom,
+                actualImportedFrom,
+                "Expected importedFrom to be " + expectedImportedFrom + " but was " + actualImportedFrom);
     }
 }
diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelValidatorTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelValidatorTest.java
index edbbbb0ae0..0403519dba 100644
--- a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelValidatorTest.java
+++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelValidatorTest.java
@@ -181,12 +181,14 @@ void testModelVersionMessageIncludesMavenVersion() throws Exception {
         assertViolations(result, 1, 0, 0);
 
         String errorMessage = result.getFatals().get(0);
-        assertTrue(errorMessage.contains("modelVersion"));
+        assertTrue(errorMessage.contains("modelVersion"), "Expected " + errorMessage + " to contain " + "modelVersion");
         // Should include Maven version (either "4.0.0-test" from mock or "unknown" as fallback)
         assertTrue(
                 errorMessage.contains("4.0.0-test") || errorMessage.contains("unknown"),
                 "Error message should include Maven version: " + errorMessage);
-        assertTrue(errorMessage.contains("is not supported by this Maven version"));
+        assertTrue(
+                errorMessage.contains("is not supported by this Maven version"),
+                "Expected " + errorMessage + " to contain " + "is not supported by this Maven version");
     }
 
     @Test
@@ -322,10 +324,18 @@ void testMissingAll() throws Exception {
 
         List<String> messages = result.getErrors();
 
-        assertTrue(messages.contains("'modelVersion' is missing."));
-        assertTrue(messages.contains("'groupId' is missing."));
-        assertTrue(messages.contains("'artifactId' is missing."));
-        assertTrue(messages.contains("'version' is missing."));
+        assertTrue(
+                messages.contains("'modelVersion' is missing."),
+                "Expected " + messages + " to contain " + "'modelVersion' is missing.");
+        assertTrue(
+                messages.contains("'groupId' is missing."),
+                "Expected " + messages + " to contain " + "'groupId' is missing.");
+        assertTrue(
+                messages.contains("'artifactId' is missing."),
+                "Expected " + messages + " to contain " + "'artifactId' is missing.");
+        assertTrue(
+                messages.contains("'version' is missing."),
+                "Expected " + messages + " to contain " + "'version' is missing.");
         // type is inherited from the super pom
     }
 
diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/InterningTransformerTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/InterningTransformerTest.java
index 03e8f9018c..5316352658 100644
--- a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/InterningTransformerTest.java
+++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/InterningTransformerTest.java
@@ -91,33 +91,92 @@ void testTransformerInternsCorrectContexts() {
     @Test
     void testTransformerContainsExpectedContexts() {
         // Verify that the DEFAULT_CONTEXTS set contains all the expected fields
-        assertTrue(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("groupId"));
-        assertTrue(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("artifactId"));
-        assertTrue(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("version"));
-        assertTrue(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("packaging"));
-        assertTrue(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("scope"));
-        assertTrue(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("type"));
-        assertTrue(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("classifier"));
-        assertTrue(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("goal"));
-        assertTrue(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("execution"));
-        assertTrue(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("phase"));
-        assertTrue(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("modelVersion"));
-        assertTrue(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("name"));
-        assertTrue(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("url"));
-        assertTrue(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("system"));
-        assertTrue(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("distribution"));
-        assertTrue(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("status"));
-        assertTrue(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("connection"));
-        assertTrue(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("developerConnection"));
-        assertTrue(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("tag"));
-        assertTrue(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("id"));
-        assertTrue(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("inherited"));
-        assertTrue(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("optional"));
+        assertTrue(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("groupId"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to contain " + "groupId");
+        assertTrue(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("artifactId"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to contain "
+                        + "artifactId");
+        assertTrue(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("version"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to contain " + "version");
+        assertTrue(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("packaging"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to contain " + "packaging");
+        assertTrue(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("scope"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to contain " + "scope");
+        assertTrue(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("type"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to contain " + "type");
+        assertTrue(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("classifier"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to contain "
+                        + "classifier");
+        assertTrue(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("goal"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to contain " + "goal");
+        assertTrue(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("execution"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to contain " + "execution");
+        assertTrue(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("phase"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to contain " + "phase");
+        assertTrue(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("modelVersion"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to contain "
+                        + "modelVersion");
+        assertTrue(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("name"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to contain " + "name");
+        assertTrue(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("url"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to contain " + "url");
+        assertTrue(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("system"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to contain " + "system");
+        assertTrue(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("distribution"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to contain "
+                        + "distribution");
+        assertTrue(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("status"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to contain " + "status");
+        assertTrue(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("connection"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to contain "
+                        + "connection");
+        assertTrue(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("developerConnection"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to contain "
+                        + "developerConnection");
+        assertTrue(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("tag"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to contain " + "tag");
+        assertTrue(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("id"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to contain " + "id");
+        assertTrue(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("inherited"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to contain " + "inherited");
+        assertTrue(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("optional"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to contain " + "optional");
 
         // Verify that non-interned contexts are not in the set
-        assertFalse(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("nonInterned"));
-        assertFalse(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("description"));
-        assertFalse(DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("randomField"));
+        assertFalse(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("nonInterned"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to not contain "
+                        + "nonInterned");
+        assertFalse(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("description"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to not contain "
+                        + "description");
+        assertFalse(
+                DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS.contains("randomField"),
+                "Expected " + DefaultModelBuilder.InterningTransformer.DEFAULT_CONTEXTS + " to not contain "
+                        + "randomField");
     }
 
     @Test
diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/resolver/DefaultModelResolverTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/resolver/DefaultModelResolverTest.java
index e680267895..1b5826938b 100644
--- a/impl/maven-impl/src/test/java/org/apache/maven/impl/resolver/DefaultModelResolverTest.java
+++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/resolver/DefaultModelResolverTest.java
@@ -39,11 +39,10 @@
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.containsString;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * Test cases for the project {@code ModelResolver} implementation.
@@ -80,7 +79,10 @@ void testResolveParentThrowsModelResolverExceptionWhenNotFound() throws Exceptio
                 () -> newModelResolver().resolveModel(session, null, parent, new AtomicReference<>()),
                 "Expected 'ModelResolverException' not thrown.");
         assertNotNull(e.getMessage());
-        assertThat(e.getMessage(), containsString("Could not find artifact org.apache:apache:pom:0 in central"));
+        String message = e.getMessage();
+        assertTrue(
+                message.contains("Could not find artifact org.apache:apache:pom:0 in central"),
+                "Expected exception message to contain artifact not found text but was: " + message);
     }
 
     @Test
@@ -151,7 +153,10 @@ void testResolveDependencyThrowsModelResolverExceptionWhenNotFound() throws Exce
                 () -> newModelResolver().resolveModel(session, null, dependency, new AtomicReference<>()),
                 "Expected 'ModelResolverException' not thrown.");
         assertNotNull(e.getMessage());
-        assertThat(e.getMessage(), containsString("Could not find artifact org.apache:apache:pom:0 in central"));
+        String message = e.getMessage();
+        assertTrue(
+                message.contains("Could not find artifact org.apache:apache:pom:0 in central"),
+                "Expected exception message to contain artifact not found text but was: " + message);
     }
 
     @Test
diff --git a/impl/maven-logging/pom.xml b/impl/maven-logging/pom.xml
index c684a3cde7..6f89f2bdbd 100644
--- a/impl/maven-logging/pom.xml
+++ b/impl/maven-logging/pom.xml
@@ -54,10 +54,5 @@ under the License.
       <artifactId>junit-jupiter-params</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.hamcrest</groupId>
-      <artifactId>hamcrest</artifactId>
-      <scope>test</scope>
-    </dependency>
   </dependencies>
 </project>
diff --git a/impl/maven-logging/src/test/java/org/apache/maven/slf4j/LogLevelRecorderTest.java b/impl/maven-logging/src/test/java/org/apache/maven/slf4j/LogLevelRecorderTest.java
index c2573b066c..77f008e67f 100644
--- a/impl/maven-logging/src/test/java/org/apache/maven/slf4j/LogLevelRecorderTest.java
+++ b/impl/maven-logging/src/test/java/org/apache/maven/slf4j/LogLevelRecorderTest.java
@@ -31,6 +31,6 @@ void createsLogLevelRecorder() {
         logLevelRecorder.setMaxLevelAllowed(LogLevelRecorder.Level.WARN);
         logLevelRecorder.record(Level.ERROR);
 
-        assertTrue(logLevelRecorder.metThreshold());
+        assertTrue(logLevelRecorder.metThreshold(), "Expected " + logLevelRecorder + ".metThreshold() to return true");
     }
 }
diff --git a/impl/maven-logging/src/test/java/org/apache/maven/slf4j/MavenBaseLoggerTimestampTest.java b/impl/maven-logging/src/test/java/org/apache/maven/slf4j/MavenBaseLoggerTimestampTest.java
index 862726fbe2..986e138b56 100644
--- a/impl/maven-logging/src/test/java/org/apache/maven/slf4j/MavenBaseLoggerTimestampTest.java
+++ b/impl/maven-logging/src/test/java/org/apache/maven/slf4j/MavenBaseLoggerTimestampTest.java
@@ -28,8 +28,7 @@
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
 
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.matchesPattern;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 class MavenBaseLoggerTimestampTest {
     private ByteArrayOutputStream logOutput;
@@ -71,8 +70,9 @@ void whenShowDateTimeIsFalseShouldNotIncludeTimestamp() {
         String output = getLastLine(logOutput.toString());
 
         // Then
-        assertThat(
-                "Should not include timestamp", output, matchesPattern("^\\[main\\] INFO test.logger - Test message$"));
+        assertTrue(
+                output.matches("^\\[main\\] INFO test.logger - Test message$"),
+                "Should not include timestamp but was: " + output);
     }
 
     @Test
@@ -86,10 +86,9 @@ void whenShowDateTimeIsTrueWithoutFormatShouldShowElapsedTime() { // Changed tes
         String output = getLastLine(logOutput.toString());
 
         // Then
-        assertThat(
-                "Should show elapsed time when no format specified",
-                output,
-                matchesPattern("^\\d+ \\[main\\] INFO test.logger - Test message$"));
+        assertTrue(
+                output.matches("^\\d+ \\[main\\] INFO test.logger - Test message$"),
+                "Should show elapsed time when no format specified but was: " + output);
     }
 
     @ParameterizedTest
@@ -116,10 +115,9 @@ void whenCustomDateFormatShouldFormatCorrectly(String dateFormat) {
                 .replace("/", "\\/")
                 .replace(".", "\\.");
 
-        assertThat(
-                "Should match custom date format",
-                output,
-                matchesPattern("^" + patternStr + " \\[main\\] INFO test.logger - Test message$"));
+        assertTrue(
+                output.matches("^" + patternStr + " \\[main\\] INFO test.logger - Test message$"),
+                "Should match custom date format but was: " + output);
     }
 
     @Test
@@ -134,10 +132,9 @@ void whenInvalidDateFormatShouldUseElapsedMillis() {
         String output = getLastLine(logOutput.toString());
 
         // Then
-        assertThat(
-                "Should show elapsed milliseconds when format is invalid",
-                output,
-                matchesPattern("^\\d+ \\[main\\] INFO test.logger - Test message$"));
+        assertTrue(
+                output.matches("^\\d+ \\[main\\] INFO test.logger - Test message$"),
+                "Should show elapsed milliseconds when format is invalid but was: " + output);
     }
 
     private void initializeLogger() {
diff --git a/impl/maven-logging/src/test/java/org/apache/maven/slf4j/MavenLoggerFactoryTest.java b/impl/maven-logging/src/test/java/org/apache/maven/slf4j/MavenLoggerFactoryTest.java
index a6fb8cbc96..20150855f0 100644
--- a/impl/maven-logging/src/test/java/org/apache/maven/slf4j/MavenLoggerFactoryTest.java
+++ b/impl/maven-logging/src/test/java/org/apache/maven/slf4j/MavenLoggerFactoryTest.java
@@ -22,9 +22,8 @@
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNotSame;
 import static org.junit.jupiter.api.Assertions.assertSame;
@@ -37,7 +36,7 @@ void createsSimpleLogger() {
 
         Logger logger = mavenLoggerFactory.getLogger("Test");
 
-        assertThat(logger, instanceOf(MavenSimpleLogger.class));
+        assertInstanceOf(MavenSimpleLogger.class, logger, "Expected logger to be instance of MavenSimpleLogger");
     }
 
     @Test
@@ -60,15 +59,23 @@ void reportsWhenFailOnSeverityThresholdHasBeenHit() {
         mavenLoggerFactory.logLevelRecorder.setMaxLevelAllowed(LogLevelRecorder.Level.ERROR);
 
         MavenFailOnSeverityLogger logger = (MavenFailOnSeverityLogger) mavenLoggerFactory.getLogger("Test");
-        assertFalse(mavenLoggerFactory.logLevelRecorder.metThreshold());
+        assertFalse(
+                mavenLoggerFactory.logLevelRecorder.metThreshold(),
+                "Expected " + mavenLoggerFactory.logLevelRecorder + ".metThreshold() to return false");
 
         logger.warn("This should not hit the fail threshold");
-        assertFalse(mavenLoggerFactory.logLevelRecorder.metThreshold());
+        assertFalse(
+                mavenLoggerFactory.logLevelRecorder.metThreshold(),
+                "Expected " + mavenLoggerFactory.logLevelRecorder + ".metThreshold() to return false");
 
         logger.error("This should hit the fail threshold");
-        assertTrue(mavenLoggerFactory.logLevelRecorder.metThreshold());
+        assertTrue(
+                mavenLoggerFactory.logLevelRecorder.metThreshold(),
+                "Expected " + mavenLoggerFactory.logLevelRecorder + ".metThreshold() to return true");
 
         logger.warn("This should not reset the fail threshold");
-        assertTrue(mavenLoggerFactory.logLevelRecorder.metThreshold());
+        assertTrue(
+                mavenLoggerFactory.logLevelRecorder.metThreshold(),
+                "Expected " + mavenLoggerFactory.logLevelRecorder + ".metThreshold() to return true");
     }
 }
diff --git a/its/core-it-suite/pom.xml b/its/core-it-suite/pom.xml
index 5312f2da2e..51b7dd8690 100644
--- a/its/core-it-suite/pom.xml
+++ b/its/core-it-suite/pom.xml
@@ -105,11 +105,6 @@ under the License.
       <artifactId>junit-jupiter</artifactId>
       <!-- NOTE: Use compile scope for transitivity. -->
     </dependency>
-    <dependency>
-      <groupId>org.hamcrest</groupId>
-      <artifactId>hamcrest</artifactId>
-      <version>3.0</version>
-    </dependency>
     <dependency>
       <groupId>org.codehaus.plexus</groupId>
       <artifactId>plexus-utils</artifactId>
diff --git a/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng7228LeakyModelTest.java b/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng7228LeakyModelTest.java
index af1812d057..5325b079d5 100644
--- a/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng7228LeakyModelTest.java
+++ b/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng7228LeakyModelTest.java
@@ -24,9 +24,8 @@
 import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
 import org.junit.jupiter.api.Test;
 
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.containsString;
-import static org.hamcrest.Matchers.not;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 class MavenITmng7228LeakyModelTest extends AbstractMavenIntegrationTestCase {
 
@@ -60,16 +59,16 @@ void testLeakyModel() throws Exception {
         String pom = FileUtils.readFileToString(new File(
                 verifier.getArtifactPath("org.apache.maven.its.mng7228", "test", "1.0.0-SNAPSHOT", "pom", classifier)));
 
-        assertThat(pom, containsString("projectProperty"));
-        assertThat(pom, not(containsString("activeProperty")));
-        assertThat(pom, not(containsString("manualProperty")));
+        assertTrue(pom.contains("projectProperty"));
+        assertFalse(pom.contains("activeProperty"), "POM should not contain activeProperty but was: " + pom);
+        assertFalse(pom.contains("manualProperty"), "POM should not contain manualProperty but was: " + pom);
 
-        assertThat(pom, containsString("project-repo"));
-        assertThat(pom, not(containsString("active-repo")));
-        assertThat(pom, not(containsString("manual-repo")));
+        assertTrue(pom.contains("project-repo"));
+        assertFalse(pom.contains("active-repo"), "POM should not contain active-repo but was: " + pom);
+        assertFalse(pom.contains("manual-repo"), "POM should not contain manual-repo but was: " + pom);
 
-        assertThat(pom, containsString("project-plugin-repo"));
-        assertThat(pom, not(containsString("active-plugin-repo")));
-        assertThat(pom, not(containsString("manual-plugin-repo")));
+        assertTrue(pom.contains("project-plugin-repo"));
+        assertFalse(pom.contains("active-plugin-repo"), "POM should not contain active-plugin-repo but was: " + pom);
+        assertFalse(pom.contains("manual-plugin-repo"), "POM should not contain manual-plugin-repo but was: " + pom);
     }
 }
diff --git a/its/core-it-suite/src/test/resources/mng-6118-submodule-invocation-full-reactor/app/pom.xml b/its/core-it-suite/src/test/resources/mng-6118-submodule-invocation-full-reactor/app/pom.xml
index 36d8c18cc2..53c9b3292d 100644
--- a/its/core-it-suite/src/test/resources/mng-6118-submodule-invocation-full-reactor/app/pom.xml
+++ b/its/core-it-suite/src/test/resources/mng-6118-submodule-invocation-full-reactor/app/pom.xml
@@ -30,8 +30,8 @@ under the License.
 
   <dependencies>
     <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.its.mng6118</groupId>
diff --git a/its/core-it-suite/src/test/resources/mng-6118-submodule-invocation-full-reactor/app/src/test/java/org/apache/its/mng6118/AppTest.java b/its/core-it-suite/src/test/resources/mng-6118-submodule-invocation-full-reactor/app/src/test/java/org/apache/its/mng6118/AppTest.java
index 333fdcfb29..fcdbf65fc0 100644
--- a/its/core-it-suite/src/test/resources/mng-6118-submodule-invocation-full-reactor/app/src/test/java/org/apache/its/mng6118/AppTest.java
+++ b/its/core-it-suite/src/test/resources/mng-6118-submodule-invocation-full-reactor/app/src/test/java/org/apache/its/mng6118/AppTest.java
@@ -37,9 +37,9 @@
  * under the License.
  */
 
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 public class AppTest {
     @Test
diff --git a/its/core-it-suite/src/test/resources/mng-6118-submodule-invocation-full-reactor/lib/pom.xml b/its/core-it-suite/src/test/resources/mng-6118-submodule-invocation-full-reactor/lib/pom.xml
index a96f223de5..29858f3f77 100644
--- a/its/core-it-suite/src/test/resources/mng-6118-submodule-invocation-full-reactor/lib/pom.xml
+++ b/its/core-it-suite/src/test/resources/mng-6118-submodule-invocation-full-reactor/lib/pom.xml
@@ -30,8 +30,8 @@ under the License.
 
   <dependencies>
     <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter</artifactId>
     </dependency>
   </dependencies>
 </project>
diff --git a/its/core-it-suite/src/test/resources/mng-6118-submodule-invocation-full-reactor/lib/src/test/java/org/apache/its/mng6118/HelperTest.java b/its/core-it-suite/src/test/resources/mng-6118-submodule-invocation-full-reactor/lib/src/test/java/org/apache/its/mng6118/HelperTest.java
index 5e8d4556e1..b5145d9005 100644
--- a/its/core-it-suite/src/test/resources/mng-6118-submodule-invocation-full-reactor/lib/src/test/java/org/apache/its/mng6118/HelperTest.java
+++ b/its/core-it-suite/src/test/resources/mng-6118-submodule-invocation-full-reactor/lib/src/test/java/org/apache/its/mng6118/HelperTest.java
@@ -37,17 +37,15 @@
  * under the License.
  */
 
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.junit.Assert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 public class HelperTest {
     private final Helper helper = new Helper();
 
     @Test
     public void shouldAnswerWithTrue() {
-        assertThat(helper.generateObject(), is(notNullValue()));
+        assertNotNull(helper.generateObject(), "Helper should generate a non-null object");
     }
 }
diff --git a/its/core-it-suite/src/test/resources/mng-6118-submodule-invocation-full-reactor/pom.xml b/its/core-it-suite/src/test/resources/mng-6118-submodule-invocation-full-reactor/pom.xml
index a7870aeb6f..01a38298e9 100644
--- a/its/core-it-suite/src/test/resources/mng-6118-submodule-invocation-full-reactor/pom.xml
+++ b/its/core-it-suite/src/test/resources/mng-6118-submodule-invocation-full-reactor/pom.xml
@@ -48,9 +48,9 @@ under the License.
         <version>${project.version}</version>
       </dependency>
       <dependency>
-        <groupId>junit</groupId>
-        <artifactId>junit</artifactId>
-        <version>4.12</version>
+        <groupId>org.junit.jupiter</groupId>
+        <artifactId>junit-jupiter</artifactId>
+        <version>5.9.3</version>
         <scope>test</scope>
       </dependency>
     </dependencies>
diff --git a/its/core-it-suite/src/test/resources/mng-8525-maven-di-plugin/pom.xml b/its/core-it-suite/src/test/resources/mng-8525-maven-di-plugin/pom.xml
index bbc21f6c92..e3939ba4b2 100644
--- a/its/core-it-suite/src/test/resources/mng-8525-maven-di-plugin/pom.xml
+++ b/its/core-it-suite/src/test/resources/mng-8525-maven-di-plugin/pom.xml
@@ -122,12 +122,7 @@ under the License.
       <artifactId>mockito-junit-jupiter</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.assertj</groupId>
-      <artifactId>assertj-core</artifactId>
-      <version>3.27.2</version>
-      <scope>test</scope>
-    </dependency>
+
   </dependencies>
 
   <build>
diff --git a/its/core-it-suite/src/test/resources/mng-8525-maven-di-plugin/src/test/java/org/apache/maven/plugins/HelloMojoTest.java b/its/core-it-suite/src/test/resources/mng-8525-maven-di-plugin/src/test/java/org/apache/maven/plugins/HelloMojoTest.java
index 3bf2bc10ce..96875b4a68 100644
--- a/its/core-it-suite/src/test/resources/mng-8525-maven-di-plugin/src/test/java/org/apache/maven/plugins/HelloMojoTest.java
+++ b/its/core-it-suite/src/test/resources/mng-8525-maven-di-plugin/src/test/java/org/apache/maven/plugins/HelloMojoTest.java
@@ -28,7 +28,7 @@
 import org.junit.jupiter.api.Test;
 import org.mockito.ArgumentCaptor;
 
-import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 
@@ -47,7 +47,7 @@ public void testHello(HelloMojo mojoUnderTest) {
 
         ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
         verify(componentMock).hello(captor.capture());
-        assertThat(captor.getValue()).isEqualTo("World");
+        assertEquals("World", captor.getValue(), "Expected captured value to be 'World'");
     }
 
     @Singleton
diff --git a/pom.xml b/pom.xml
index 672ec65031..d374794e09 100644
--- a/pom.xml
+++ b/pom.xml
@@ -142,7 +142,6 @@ under the License.
     <maven.site.path>ref/4-LATEST</maven.site.path>
     <project.build.outputTimestamp>2025-06-24T20:18:00Z</project.build.outputTimestamp>
     <!-- various versions -->
-    <assertjVersion>3.27.4</assertjVersion>
     <asmVersion>9.8</asmVersion>
     <byteBuddyVersion>1.17.7</byteBuddyVersion>
     <classWorldsVersion>2.9.0</classWorldsVersion>
@@ -150,7 +149,7 @@ under the License.
     <guiceVersion>5.1.0</guiceVersion>
     <guavaVersion>33.4.8-jre</guavaVersion>
     <guavafailureaccessVersion>1.0.1</guavafailureaccessVersion>
-    <hamcrestVersion>3.0</hamcrestVersion>
+
     <jakartaInjectApiVersion>2.0.1</jakartaInjectApiVersion>
     <javaxAnnotationApiVersion>1.3.2</javaxAnnotationApiVersion>
     <jlineVersion>3.30.6</jlineVersion>
@@ -598,12 +597,7 @@ under the License.
         <artifactId>stax2-api</artifactId>
         <version>${stax2ApiVersion}</version>
       </dependency>
-      <dependency>
-        <groupId>org.xmlunit</groupId>
-        <artifactId>xmlunit-assertj</artifactId>
-        <version>${xmlunitVersion}</version>
-        <scope>test</scope>
-      </dependency>
+
       <dependency>
         <groupId>org.xmlunit</groupId>
         <artifactId>xmlunit-core</artifactId>
@@ -622,17 +616,7 @@ under the License.
           </exclusion>
         </exclusions>
       </dependency>
-      <dependency>
-        <groupId>org.hamcrest</groupId>
-        <artifactId>hamcrest</artifactId>
-        <version>${hamcrestVersion}</version>
-        <scope>test</scope>
-      </dependency>
-      <dependency>
-        <groupId>org.assertj</groupId>
-        <artifactId>assertj-core</artifactId>
-        <version>${assertjVersion}</version>
-      </dependency>
+
       <dependency>
         <groupId>org.codehaus.plexus</groupId>
         <artifactId>plexus-testing</artifactId>