You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by sj...@apache.org on 2024/04/16 21:36:13 UTC

(maven-dependency-plugin) 01/01: [MDEP-917] dependency:analyze-exclusions - use Resolver API instead of ProjectBuilder

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

sjaranowski pushed a commit to branch MDEP-917
in repository https://gitbox.apache.org/repos/asf/maven-dependency-plugin.git

commit bc5cf73dc317b4025ee5a5a7255e28e9b791e8c5
Author: Slawomir Jaranowski <s....@gmail.com>
AuthorDate: Tue Apr 16 23:35:52 2024 +0200

    [MDEP-917] dependency:analyze-exclusions - use Resolver API instead of ProjectBuilder
---
 .../module2/pom.xml                                | 12 ++++
 .../pom.xml                                        | 11 ++++
 src/it/projects/analyze-invalid-exclude/pom.xml    |  9 +--
 .../exclusion/AnalyzeExclusionsMojo.java           | 69 ++++++++-------------
 .../plugins/dependency/utils/ResolverUtil.java     | 71 +++++++++++++++++++++
 .../exclusion/AnalyzeExclusionsMojoTest.java       | 72 ++++++++--------------
 .../fromConfiguration/TestUnpackMojo.java          | 17 ++---
 7 files changed, 159 insertions(+), 102 deletions(-)

diff --git a/src/it/projects/analyze-invalid-exclude-multumodule-project/module2/pom.xml b/src/it/projects/analyze-invalid-exclude-multumodule-project/module2/pom.xml
index 2f1c4bd5..17d63f14 100644
--- a/src/it/projects/analyze-invalid-exclude-multumodule-project/module2/pom.xml
+++ b/src/it/projects/analyze-invalid-exclude-multumodule-project/module2/pom.xml
@@ -32,5 +32,17 @@
   <artifactId>test-module2</artifactId>
 
   <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.its.dependency</groupId>
+      <artifactId>test-module1</artifactId>
+      <version>${project.version}</version>
+      <exclusions>
+        <exclusion>
+          <groupId>org.apache.maven</groupId>
+          <artifactId>maven-core</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
   </dependencies>
+
 </project>
diff --git a/src/it/projects/analyze-invalid-exclude-multumodule-project/pom.xml b/src/it/projects/analyze-invalid-exclude-multumodule-project/pom.xml
index 821d3ec3..56e37b4c 100644
--- a/src/it/projects/analyze-invalid-exclude-multumodule-project/pom.xml
+++ b/src/it/projects/analyze-invalid-exclude-multumodule-project/pom.xml
@@ -58,4 +58,15 @@
     </dependencies>
   </dependencyManagement>
 
+  <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <artifactId>maven-dependency-plugin</artifactId>
+          <version>@project.version@</version>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+  </build>
+
 </project>
diff --git a/src/it/projects/analyze-invalid-exclude/pom.xml b/src/it/projects/analyze-invalid-exclude/pom.xml
index 29f2165d..17587fea 100644
--- a/src/it/projects/analyze-invalid-exclude/pom.xml
+++ b/src/it/projects/analyze-invalid-exclude/pom.xml
@@ -40,7 +40,6 @@
     <dependency>
       <groupId>org.apache.maven</groupId>
       <artifactId>maven-core</artifactId>
-      <version>3.9.6</version>
     </dependency>
     <dependency>
       <groupId>org.apache.maven</groupId>
@@ -75,6 +74,10 @@
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
           </exclusion>
+          <exclusion>
+            <groupId>org.codehaus.plexus</groupId>
+            <artifactId>*</artifactId>
+          </exclusion>
         </exclusions>
       </dependency>
     </dependencies>
@@ -85,9 +88,7 @@
       <plugins>
         <plugin>
           <artifactId>maven-dependency-plugin</artifactId>
-          <configuration>
-           <failOnWarning>false</failOnWarning>
-          </configuration>
+          <version>@project.version@</version>
         </plugin>
       </plugins>
     </pluginManagement>
diff --git a/src/main/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojo.java b/src/main/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojo.java
index aed40c98..9f1e8072 100644
--- a/src/main/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojo.java
+++ b/src/main/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojo.java
@@ -20,31 +20,25 @@ package org.apache.maven.plugins.dependency.exclusion;
 
 import java.util.List;
 import java.util.Map;
-import java.util.Objects;
 import java.util.Set;
 import java.util.function.Consumer;
 
-import org.apache.maven.artifact.Artifact;
+import org.apache.maven.RepositoryUtils;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.model.Dependency;
 import org.apache.maven.plugin.AbstractMojo;
 import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugins.annotations.Component;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.apache.maven.project.DefaultProjectBuildingRequest;
+import org.apache.maven.plugins.dependency.utils.ResolverUtil;
 import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.ProjectBuilder;
-import org.apache.maven.project.ProjectBuildingException;
-import org.apache.maven.project.ProjectBuildingRequest;
-import org.apache.maven.project.ProjectBuildingResult;
+import org.eclipse.aether.artifact.ArtifactTypeRegistry;
+import org.eclipse.aether.collection.DependencyCollectionException;
 
-import static java.lang.String.format;
 import static java.util.stream.Collectors.toList;
 import static java.util.stream.Collectors.toSet;
-import static org.apache.commons.lang3.StringUtils.stripToEmpty;
 import static org.apache.maven.plugins.dependency.exclusion.Coordinates.coordinates;
 
 /**
@@ -56,14 +50,14 @@ import static org.apache.maven.plugins.dependency.exclusion.Coordinates.coordina
  *
  * @since 3.7.0
  */
-@Mojo(name = "analyze-exclusions", requiresDependencyResolution = ResolutionScope.TEST, threadSafe = true)
+@Mojo(name = "analyze-exclusions", requiresDependencyCollection = ResolutionScope.TEST, threadSafe = true)
 public class AnalyzeExclusionsMojo extends AbstractMojo {
 
     @Component
     private MavenProject project;
 
     @Component
-    private ProjectBuilder projectBuilder;
+    private ResolverUtil resolverUtil;
 
     @Component
     private MavenSession session;
@@ -85,7 +79,7 @@ public class AnalyzeExclusionsMojo extends AbstractMojo {
     private boolean skip;
 
     @Override
-    public void execute() throws MojoExecutionException, MojoFailureException {
+    public void execute() throws MojoExecutionException {
         if (skip) {
             getLog().debug("Skipping execution");
             return;
@@ -101,17 +95,23 @@ public class AnalyzeExclusionsMojo extends AbstractMojo {
 
         ExclusionChecker checker = new ExclusionChecker();
 
+        ArtifactTypeRegistry artifactTypeRegistry =
+                session.getRepositorySession().getArtifactTypeRegistry();
         for (final Dependency dependency : dependenciesWithExclusions) {
+
             Coordinates currentCoordinates = coordinates(dependency.getGroupId(), dependency.getArtifactId());
-            Artifact matchingArtifact = project.getArtifacts().stream()
-                    .filter(artifact -> matchesDependency(artifact, dependency))
-                    .findFirst()
-                    .orElseThrow(() -> new MojoExecutionException(
-                            format("Error finding Artifact for given Dependency [%s]", dependency)));
 
-            ProjectBuildingResult result = buildProject(matchingArtifact);
+            List<org.eclipse.aether.graph.Dependency> actualDependencies = null;
+            try {
+                actualDependencies =
+                        resolverUtil.collectDependencies(RepositoryUtils.toDependency(dependency, artifactTypeRegistry)
+                                .setExclusions(null));
+            } catch (DependencyCollectionException e) {
+                throw new MojoExecutionException(e.getMessage(), e);
+            }
 
-            Set<Coordinates> actualDependencies = result.getProject().getArtifacts().stream()
+            Set<Coordinates> actualCoordinates = actualDependencies.stream()
+                    .map(org.eclipse.aether.graph.Dependency::getArtifact)
                     .map(a -> coordinates(a.getGroupId(), a.getArtifactId()))
                     .collect(toSet());
 
@@ -119,45 +119,24 @@ public class AnalyzeExclusionsMojo extends AbstractMojo {
                     .map(e -> coordinates(e.getGroupId(), e.getArtifactId()))
                     .collect(toSet());
 
-            checker.check(currentCoordinates, exclusions, actualDependencies);
+            checker.check(currentCoordinates, exclusions, actualCoordinates);
         }
 
         if (!checker.getViolations().isEmpty()) {
             if (exclusionFail) {
-                logViolations(project.getName(), checker.getViolations(), (value) -> getLog().error(value));
+                logViolations(project.getName(), checker.getViolations(), value -> getLog().error(value));
                 throw new MojoExecutionException("Invalid exclusions found");
             } else {
-                logViolations(project.getName(), checker.getViolations(), (value) -> getLog().warn(value));
+                logViolations(project.getName(), checker.getViolations(), value -> getLog().warn(value));
             }
         }
     }
 
-    private boolean matchesDependency(Artifact artifact, Dependency dependency) {
-        return Objects.equals(artifact.getGroupId(), dependency.getGroupId())
-                && Objects.equals(artifact.getArtifactId(), dependency.getArtifactId())
-                && Objects.equals(artifact.getType(), dependency.getType())
-                && Objects.equals(stripToEmpty(artifact.getClassifier()), stripToEmpty(dependency.getClassifier()));
-    }
-
     private void logViolations(String name, Map<Coordinates, List<Coordinates>> violations, Consumer<String> logger) {
         logger.accept(name + " defines following unnecessary excludes");
         violations.forEach((dependency, invalidExclusions) -> {
             logger.accept("    " + dependency + ":");
-            invalidExclusions.forEach(invalidExclusion -> {
-                logger.accept("        - " + invalidExclusion);
-            });
+            invalidExclusions.forEach(invalidExclusion -> logger.accept("        - " + invalidExclusion));
         });
     }
-
-    private ProjectBuildingResult buildProject(Artifact artifact) throws MojoExecutionException {
-        try {
-            ProjectBuildingRequest projectBuildingRequest =
-                    new DefaultProjectBuildingRequest(session.getProjectBuildingRequest());
-            projectBuildingRequest.setResolveDependencies(true);
-            return projectBuilder.build(artifact, true, projectBuildingRequest);
-        } catch (ProjectBuildingException e) {
-            throw new MojoExecutionException(
-                    format("Failed to build project for %s:%s", artifact.getGroupId(), artifact.getArtifactId()), e);
-        }
-    }
 }
diff --git a/src/main/java/org/apache/maven/plugins/dependency/utils/ResolverUtil.java b/src/main/java/org/apache/maven/plugins/dependency/utils/ResolverUtil.java
new file mode 100644
index 00000000..6d204145
--- /dev/null
+++ b/src/main/java/org/apache/maven/plugins/dependency/utils/ResolverUtil.java
@@ -0,0 +1,71 @@
+/*
+ * 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.plugins.dependency.utils;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Provider;
+import javax.inject.Singleton;
+
+import java.util.List;
+
+import org.apache.maven.execution.MavenSession;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.collection.CollectRequest;
+import org.eclipse.aether.collection.CollectResult;
+import org.eclipse.aether.collection.DependencyCollectionException;
+import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.util.graph.visitor.PreorderNodeListGenerator;
+
+/**
+ * Helper class for using Resolver API.
+ */
+@Named
+@Singleton
+public class ResolverUtil {
+
+    private final RepositorySystem repositorySystem;
+
+    private final Provider<MavenSession> mavenSessionProvider;
+
+    @Inject
+    private ResolverUtil(RepositorySystem repositorySystem, Provider<MavenSession> mavenSessionProvider) {
+        this.repositorySystem = repositorySystem;
+        this.mavenSessionProvider = mavenSessionProvider;
+    }
+
+    /**
+     * Collects the transitive dependencies.
+     *
+     * @param root a root dependency for collections
+     * @return a resolved dependencies collections
+     */
+    public List<Dependency> collectDependencies(Dependency root) throws DependencyCollectionException {
+
+        MavenSession session = mavenSessionProvider.get();
+
+        CollectRequest request =
+                new CollectRequest(root, session.getCurrentProject().getRemoteProjectRepositories());
+        CollectResult result = repositorySystem.collectDependencies(session.getRepositorySession(), request);
+
+        PreorderNodeListGenerator nodeListGenerator = new PreorderNodeListGenerator();
+        result.getRoot().accept(nodeListGenerator);
+        return nodeListGenerator.getDependencies(true);
+    }
+}
diff --git a/src/test/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojoTest.java b/src/test/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojoTest.java
index 951cea0e..10ce1844 100644
--- a/src/test/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojoTest.java
+++ b/src/test/java/org/apache/maven/plugins/dependency/exclusion/AnalyzeExclusionsMojoTest.java
@@ -23,9 +23,11 @@ import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 
+import org.apache.maven.RepositoryUtils;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.execution.MavenSession;
 import org.apache.maven.model.Dependency;
@@ -35,24 +37,26 @@ import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.logging.Log;
 import org.apache.maven.plugins.dependency.AbstractDependencyMojoTestCase;
 import org.apache.maven.plugins.dependency.testUtils.stubs.DependencyProjectStub;
+import org.apache.maven.plugins.dependency.utils.ResolverUtil;
 import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.ProjectBuilder;
-import org.apache.maven.project.ProjectBuildingResult;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatCode;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anyBoolean;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 public class AnalyzeExclusionsMojoTest extends AbstractDependencyMojoTestCase {
 
-    AnalyzeExclusionsMojo mojo;
-    MavenProject project;
+    private AnalyzeExclusionsMojo mojo;
+
+    private MavenProject project;
+
     private TestLog testLog;
 
+    private ResolverUtil resolverUtil;
+
     @Override
     public void setUp() throws Exception {
         super.setUp("analyze-exclusions", true, false);
@@ -64,6 +68,9 @@ public class AnalyzeExclusionsMojoTest extends AbstractDependencyMojoTestCase {
         MavenSession session = newMavenSession(project);
         getContainer().addComponent(session, MavenSession.class.getName());
 
+        resolverUtil = mock(ResolverUtil.class);
+        getContainer().addComponent(resolverUtil, ResolverUtil.class.getName());
+
         File testPom = new File(getBasedir(), "target/test-classes/unit/analyze-exclusions/plugin-config.xml");
         mojo = (AnalyzeExclusionsMojo) lookupMojo("analyze-exclusions", testPom);
         assertNotNull(mojo);
@@ -77,35 +84,18 @@ public class AnalyzeExclusionsMojoTest extends AbstractDependencyMojoTestCase {
     }
 
     public void testShallThrowExceptionWhenFailOnWarning() throws Exception {
-        List<Dependency> projectDependencies = new ArrayList<>();
-        Dependency withInvalidExclusion = dependency("a", "b");
-        withInvalidExclusion.addExclusion(exclusion("invalid", "invalid"));
-        projectDependencies.add(withInvalidExclusion);
-        project.setDependencies(projectDependencies);
-        Artifact artifact = stubFactory.createArtifact("a", "b", "1.0");
-        project.setArtifacts(new HashSet<>(Arrays.asList(artifact)));
-        setVariableValueToObject(mojo, "exclusionFail", true);
-
-        assertThatThrownBy(() -> mojo.execute())
-                .isInstanceOf(MojoExecutionException.class)
-                .hasMessageContaining("Invalid exclusions found");
-    }
-
-    public void testShallLogErrorWhenFailOnWarningIsTrue() throws Exception {
         List<Dependency> dependencies = new ArrayList<>();
         Dependency withInvalidExclusion = dependency("a", "b");
         withInvalidExclusion.addExclusion(exclusion("invalid", "invalid"));
         dependencies.add(withInvalidExclusion);
         project.setDependencies(dependencies);
         Artifact artifact = stubFactory.createArtifact("a", "b", "1.0");
-        project.setArtifacts(new HashSet<>(Arrays.asList(artifact)));
+        project.setArtifacts(new HashSet<>(Collections.singletonList(artifact)));
         setVariableValueToObject(mojo, "exclusionFail", true);
 
-        try {
-            mojo.execute();
-        } catch (MojoExecutionException ignored) {
-            // ignored
-        }
+        assertThatThrownBy(() -> mojo.execute())
+                .isInstanceOf(MojoExecutionException.class)
+                .hasMessageContaining("Invalid exclusions found");
 
         assertThat(testLog.getContent()).startsWith("[error]");
     }
@@ -117,7 +107,7 @@ public class AnalyzeExclusionsMojoTest extends AbstractDependencyMojoTestCase {
         dependencies.add(withInvalidExclusion);
         project.setDependencies(dependencies);
         Artifact artifact = stubFactory.createArtifact("a", "b", "1.0");
-        project.setArtifacts(new HashSet<>(Arrays.asList(artifact)));
+        project.setArtifacts(new HashSet<>(Collections.singletonList(artifact)));
         setVariableValueToObject(mojo, "exclusionFail", false);
 
         mojo.execute();
@@ -140,14 +130,9 @@ public class AnalyzeExclusionsMojoTest extends AbstractDependencyMojoTestCase {
         Artifact artifact = stubFactory.createArtifact("a", "b", "1.0");
         project.setArtifacts(new HashSet<>(Arrays.asList(artifact)));
 
-        ProjectBuilder projectBuilder = mock(ProjectBuilder.class);
-        MavenProject mavenProject = new MavenProject();
-        mavenProject.setArtifacts(new HashSet<>(Arrays.asList(stubFactory.createArtifact("whatever", "ok", "1.0"))));
-
-        ProjectBuildingResult pbr = mock(ProjectBuildingResult.class);
-        when(pbr.getProject()).thenReturn(mavenProject);
-        when(projectBuilder.build(any(Artifact.class), anyBoolean(), any())).thenReturn(pbr);
-        setVariableValueToObject(mojo, "projectBuilder", projectBuilder);
+        when(resolverUtil.collectDependencies(any()))
+                .thenReturn(Collections.singletonList(new org.eclipse.aether.graph.Dependency(
+                        RepositoryUtils.toArtifact(stubFactory.createArtifact("whatever", "ok", "1.0")), "")));
 
         mojo.execute();
 
@@ -175,18 +160,13 @@ public class AnalyzeExclusionsMojoTest extends AbstractDependencyMojoTestCase {
         project.setDependencies(dependencies);
         Artifact artifact = stubFactory.createArtifact("a", "b", "1.0");
 
-        project.setArtifacts(new HashSet<>(Arrays.asList(artifact)));
+        project.setArtifacts(new HashSet<>(Collections.singletonList(artifact)));
         setVariableValueToObject(mojo, "exclusionFail", true);
 
-        ProjectBuilder projectBuilder = mock(ProjectBuilder.class);
-        MavenProject mavenProject = new MavenProject();
-        mavenProject.setArtifacts(new HashSet<>(Arrays.asList(stubFactory.createArtifact("ok", "ok", "1.0"))));
-
-        ProjectBuildingResult pbr = mock(ProjectBuildingResult.class);
-        when(pbr.getProject()).thenReturn(mavenProject);
-        when(projectBuilder.build(any(Artifact.class), anyBoolean(), any())).thenReturn(pbr);
+        when(resolverUtil.collectDependencies(any()))
+                .thenReturn(Collections.singletonList(new org.eclipse.aether.graph.Dependency(
+                        RepositoryUtils.toArtifact(stubFactory.createArtifact("ok", "ok", "1.0")), "")));
 
-        setVariableValueToObject(mojo, "projectBuilder", projectBuilder);
         assertThatCode(() -> mojo.execute()).doesNotThrowAnyException();
     }
 
@@ -197,7 +177,7 @@ public class AnalyzeExclusionsMojoTest extends AbstractDependencyMojoTestCase {
         dependencies.add(withInvalidExclusion);
         project.setDependencies(dependencies);
         Artifact artifact = stubFactory.createArtifact("a", "b", "1.0");
-        project.setArtifacts(new HashSet<>(Arrays.asList(artifact)));
+        project.setArtifacts(new HashSet<>(Collections.singletonList(artifact)));
 
         mojo.execute();
 
diff --git a/src/test/java/org/apache/maven/plugins/dependency/fromConfiguration/TestUnpackMojo.java b/src/test/java/org/apache/maven/plugins/dependency/fromConfiguration/TestUnpackMojo.java
index 6671c515..66614da7 100644
--- a/src/test/java/org/apache/maven/plugins/dependency/fromConfiguration/TestUnpackMojo.java
+++ b/src/test/java/org/apache/maven/plugins/dependency/fromConfiguration/TestUnpackMojo.java
@@ -39,6 +39,8 @@ import org.apache.maven.plugins.dependency.utils.markers.UnpackFileMarkerHandler
 import org.apache.maven.project.MavenProject;
 import org.codehaus.plexus.archiver.manager.ArchiverManager;
 
+import static org.junit.Assert.assertNotEquals;
+
 public class TestUnpackMojo extends AbstractDependencyMojoTestCase {
 
     UnpackMojo mojo;
@@ -491,13 +493,13 @@ public class TestUnpackMojo extends AbstractDependencyMojoTestCase {
         // round down to the last second
         long time = now;
         time = time - (time % 1000);
-        // go back 10 more seconds for linux
-        time -= 10000;
+        // go back 30 more seconds for linux
+        time -= 30000;
         // set to known value
         assertTrue(unpackedFile.setLastModified(time));
         // set source to be newer about some seconds,
-        // especially on macOS it shouldn't be smaller than 8s in order to mitigate flapping test
-        assertTrue(artifact.getFile().setLastModified(time + 8000));
+        // especially on macOS it shouldn't be smaller than 16s in order to mitigate flapping test
+        assertTrue(artifact.getFile().setLastModified(time + 16000));
 
         // manually set markerfile (must match getMarkerFile in DefaultMarkerFileHandler)
         File marker = new File(mojo.getMarkersDirectory(), artifact.getId().replace(':', '-') + ".marker");
@@ -510,10 +512,11 @@ public class TestUnpackMojo extends AbstractDependencyMojoTestCase {
         long unpackedFileLastModifiedMillis =
                 Files.getLastModifiedTime(unpackedFile.toPath()).toMillis();
 
-        assertTrue(
+        assertNotEquals(
                 "unpackedFile '" + unpackedFile + "' lastModified() == " + markerLastModifiedMillis
                         + ": should be different",
-                markerLastModifiedMillis != unpackedFileLastModifiedMillis);
+                markerLastModifiedMillis,
+                unpackedFileLastModifiedMillis);
     }
 
     public void assertUnpacked(ArtifactItem item, boolean overWrite) throws Exception {
@@ -530,7 +533,7 @@ public class TestUnpackMojo extends AbstractDependencyMojoTestCase {
         mojo.execute();
 
         if (overWrite) {
-            assertTrue(time != unpackedFile.lastModified());
+            assertNotEquals(time, unpackedFile.lastModified());
         } else {
             assertEquals(time, unpackedFile.lastModified());
         }