diff --git a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseDepVersionMojo.java b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseDepVersionMojo.java index 95f5bcf31..6a8e35f4f 100644 --- a/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseDepVersionMojo.java +++ b/versions-maven-plugin/src/main/java/org/codehaus/mojo/versions/UseDepVersionMojo.java @@ -355,38 +355,44 @@ private void useDepVersion( Artifact artifact = toArtifact(dep); if (isIncluded(artifact)) { - if (!forceVersion) { - if (!getHelper().lookupArtifactVersions(artifact, false).containsVersion(depVersion)) { - throw new MojoExecutionException(String.format( - "Version %s is not available for artifact %s:%s", - depVersion, artifact.getGroupId(), artifact.getArtifactId())); - } - } - if (!propertyName.isPresent()) { - updateDependencyVersion(node.getModifiedPomXMLEventReader(), dep, depVersion, changeKind); + if (dep.getVersion() == null) { + getLog().warn(String.format( + "Not updating %s:%s in dependencies: version defined " + "in dependencyManagement", + dep.getGroupId(), dep.getArtifactId())); } else { - // propertyName is present - ofNullable(propertyConflicts.get(propertyName.get())) - .map(conflict -> { - getLog().warn("Cannot update property ${" + propertyName.get() + "}: " - + "controls more than one dependency: " - + conflict.stream() - .map(Dependency::getArtifactId) - .collect(Collectors.joining(", "))); - return false; - }) - .orElseGet(() -> { - if (!updatePropertyValue(node, propertyName.get())) { - propertyBacklog.add(propertyName.get()); - } else { - if (getLog().isDebugEnabled()) { - getLog().debug(String.format( - "Updated the %s property value to %s.", - propertyName.get(), depVersion)); + if (!forceVersion) { + if (!getHelper().lookupArtifactVersions(artifact, false).containsVersion(depVersion)) { + throw new MojoExecutionException(String.format( + "Version %s is not available for artifact %s:%s", + depVersion, artifact.getGroupId(), artifact.getArtifactId())); + } + } + if (!propertyName.isPresent()) { + updateDependencyVersion(node.getModifiedPomXMLEventReader(), dep, depVersion, changeKind); + } else { + // propertyName is present + ofNullable(propertyConflicts.get(propertyName.get())) + .map(conflict -> { + getLog().warn("Cannot update property ${" + propertyName.get() + "}: " + + "controls more than one dependency: " + + conflict.stream() + .map(Dependency::getArtifactId) + .collect(Collectors.joining(", "))); + return false; + }) + .orElseGet(() -> { + if (!updatePropertyValue(node, propertyName.get())) { + propertyBacklog.add(propertyName.get()); + } else { + if (getLog().isDebugEnabled()) { + getLog().debug(String.format( + "Updated the %s property value to %s.", + propertyName.get(), depVersion)); + } } - } - return true; - }); + return true; + }); + } } } } diff --git a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseDepVersionMojoTest.java b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseDepVersionMojoTest.java index a440b6351..c48923feb 100644 --- a/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseDepVersionMojoTest.java +++ b/versions-maven-plugin/src/test/java/org/codehaus/mojo/versions/UseDepVersionMojoTest.java @@ -24,6 +24,7 @@ import org.apache.maven.plugin.logging.SystemStreamLog; import org.apache.maven.plugin.testing.AbstractMojoTestCase; import org.apache.maven.plugin.testing.MojoRule; +import org.codehaus.mojo.versions.change.DefaultDependencyVersionChange; import org.codehaus.mojo.versions.change.DefaultPropertyVersionChange; import org.codehaus.mojo.versions.utils.TestChangeRecorder; import org.codehaus.mojo.versions.utils.TestUtils; @@ -348,4 +349,85 @@ public void testPropertyFromParent() throws Exception { assertThat(changeRecorder.getChanges(), empty()); assertThat(log.toString(), containsString("[WARN] Not updating property ${revision}: defined in parent")); } + + @Test + public void testVersionlessDependency() throws Exception { + Log logger = mock(Log.class); + StringBuilder log = new StringBuilder(); + doAnswer(i -> log.append("[WARN] ").append(i.getArgument(0).toString())) + .when(logger) + .warn(anyString()); + TestUtils.copyDir(Paths.get("src/test/resources/org/codehaus/mojo/use-dep-version/issue-925"), tempDir); + UseDepVersionMojo mojo = (UseDepVersionMojo) mojoRule.lookupConfiguredMojo(tempDir.toFile(), "use-dep-version"); + setVariableValueToObject(mojo, "reactorProjects", Collections.singletonList(mojo.getProject())); + setVariableValueToObject(mojo, "repositorySystem", mockRepositorySystem()); + setVariableValueToObject(mojo, "aetherRepositorySystem", mockAetherRepositorySystem()); + setVariableValueToObject(mojo, "changeRecorders", changeRecorder.asTestMap()); + setVariableValueToObject(mojo, "log", logger); + mojo.depVersion = "2.0.0"; + mojo.forceVersion = true; + setVariableValueToObject(mojo, "processDependencies", true); + setVariableValueToObject(mojo, "processDependencyManagement", false); + setVariableValueToObject(mojo, "includes", new String[] {"default-group:artifactA"}); + + mojo.execute(); + + assertThat(changeRecorder.getChanges(), empty()); + assertThat( + log.toString(), + containsString( + "[WARN] Not updating default-group:artifactA in dependencies: version defined in dependencyManagement")); + } + + @Test + public void testDependencyManagemenent() throws Exception { + TestUtils.copyDir(Paths.get("src/test/resources/org/codehaus/mojo/use-dep-version/issue-925"), tempDir); + UseDepVersionMojo mojo = (UseDepVersionMojo) mojoRule.lookupConfiguredMojo(tempDir.toFile(), "use-dep-version"); + setVariableValueToObject(mojo, "reactorProjects", Collections.singletonList(mojo.getProject())); + setVariableValueToObject(mojo, "repositorySystem", mockRepositorySystem()); + setVariableValueToObject(mojo, "aetherRepositorySystem", mockAetherRepositorySystem()); + setVariableValueToObject(mojo, "changeRecorders", changeRecorder.asTestMap()); + mojo.depVersion = "2.0.0"; + mojo.forceVersion = true; + setVariableValueToObject(mojo, "processDependencies", false); + setVariableValueToObject(mojo, "processDependencyManagement", true); + setVariableValueToObject(mojo, "includes", new String[] {"default-group:artifactA"}); + + mojo.execute(); + + assertThat( + changeRecorder.getChanges(), + hasItem(new DefaultDependencyVersionChange("default-group", "artifactA", "1.0.0", "2.0.0"))); + } + + @Test + public void testVersionDefinedInDependencyManagemenent() throws Exception { + Log logger = mock(Log.class); + StringBuilder log = new StringBuilder(); + doAnswer(i -> log.append("[WARN] ").append(i.getArgument(0).toString())) + .when(logger) + .warn(anyString()); + TestUtils.copyDir(Paths.get("src/test/resources/org/codehaus/mojo/use-dep-version/issue-925"), tempDir); + UseDepVersionMojo mojo = (UseDepVersionMojo) mojoRule.lookupConfiguredMojo(tempDir.toFile(), "use-dep-version"); + setVariableValueToObject(mojo, "reactorProjects", Collections.singletonList(mojo.getProject())); + setVariableValueToObject(mojo, "repositorySystem", mockRepositorySystem()); + setVariableValueToObject(mojo, "aetherRepositorySystem", mockAetherRepositorySystem()); + setVariableValueToObject(mojo, "changeRecorders", changeRecorder.asTestMap()); + setVariableValueToObject(mojo, "log", logger); + mojo.depVersion = "2.0.0"; + mojo.forceVersion = true; + setVariableValueToObject(mojo, "processDependencies", true); + setVariableValueToObject(mojo, "processDependencyManagement", true); + setVariableValueToObject(mojo, "includes", new String[] {"default-group:artifactA"}); + + mojo.execute(); + + assertThat( + log.toString(), + containsString( + "[WARN] Not updating default-group:artifactA in dependencies: version defined in dependencyManagement")); + assertThat( + changeRecorder.getChanges(), + hasItem(new DefaultDependencyVersionChange("default-group", "artifactA", "1.0.0", "2.0.0"))); + } } diff --git a/versions-maven-plugin/src/test/resources/org/codehaus/mojo/use-dep-version/issue-925/pom.xml b/versions-maven-plugin/src/test/resources/org/codehaus/mojo/use-dep-version/issue-925/pom.xml new file mode 100644 index 000000000..ba6767c9f --- /dev/null +++ b/versions-maven-plugin/src/test/resources/org/codehaus/mojo/use-dep-version/issue-925/pom.xml @@ -0,0 +1,43 @@ + + + 4.0.0 + + test-group + test-artifact + DEVELOP-SNAPSHOT + + + + default-group + artifactA + + + default-group + artifactB + + + default-group + artifactC + + + + + + + default-group + artifactA + 1.0.0 + + + default-group + artifactB + 1.0.0 + + + default-group + artifactC + 1.0.0 + + + +