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());
}