diff --git a/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesReportMojo.java b/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesReportMojo.java index c83101300..f7c1a30c9 100644 --- a/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesReportMojo.java +++ b/src/main/java/org/codehaus/mojo/versions/DependencyUpdatesReportMojo.java @@ -174,8 +174,10 @@ && getProject().getOriginalModel().getDependencyManagement().getDependencies() ! // TODO: I'm not 100% sure if this will work correctly in all cases. for ( Dependency dep : getProject().getOriginalModel().getDependencyManagement().getDependencies() ) { + dep = getHelper().interpolateVersion( dep, getProject() ); + getLog().debug( "Original Dpmg: " + dep.getGroupId() + ":" + dep.getArtifactId() + ":" - + dep.getVersion() + ":" + dep.getType() + ":" + dep.getScope() ); + + dep.getVersion() + ":" + dep.getType() + ":" + dep.getScope() ); } dependencyManagement.addAll( getProject().getOriginalModel().getDependencyManagement().getDependencies() ); diff --git a/src/main/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojo.java b/src/main/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojo.java index fa246271b..da5b9a0b8 100644 --- a/src/main/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojo.java +++ b/src/main/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojo.java @@ -535,6 +535,7 @@ public void execute() } else { + dependency = getHelper().interpolateVersion( dependency, getProject() ); dependencyManagement.add( dependency ); } } diff --git a/src/main/java/org/codehaus/mojo/versions/api/DefaultVersionsHelper.java b/src/main/java/org/codehaus/mojo/versions/api/DefaultVersionsHelper.java index ce0f210c9..a4d6d3f7f 100644 --- a/src/main/java/org/codehaus/mojo/versions/api/DefaultVersionsHelper.java +++ b/src/main/java/org/codehaus/mojo/versions/api/DefaultVersionsHelper.java @@ -895,6 +895,24 @@ else if ( !excludePropertiesList.isEmpty() && excludePropertiesList.contains( pr return propertyVersions; } + @Override + public Dependency interpolateVersion( final Dependency dependency, final MavenProject project ) + { + + // resolve version from model properties if necessary (e.g. "${mycomponent.myversion}" + if ( dependency.getVersion().startsWith( "${" ) ) + { + final String resolvedVersion = project.getOriginalModel() + .getProperties().getProperty( + dependency.getVersion().substring( 2, dependency.getVersion().length() - 1 ) ); + if ( resolvedVersion != null && !resolvedVersion.isEmpty() ) + { + dependency.setVersion( resolvedVersion ); + } + } + return dependency; + } + /** * Builder class for {@linkplain DefaultVersionsHelper} */ diff --git a/src/main/java/org/codehaus/mojo/versions/api/VersionsHelper.java b/src/main/java/org/codehaus/mojo/versions/api/VersionsHelper.java index 57f03e453..beabeabd5 100644 --- a/src/main/java/org/codehaus/mojo/versions/api/VersionsHelper.java +++ b/src/main/java/org/codehaus/mojo/versions/api/VersionsHelper.java @@ -419,4 +419,14 @@ public VersionPropertiesMapRequest build() */ void resolveArtifact( Artifact artifact, boolean usePluginRepositories ) throws ArtifactResolutionException, ArtifactNotFoundException; + + /** + * Attempts to interpolate the version from model properties. + * + * @param dependency the dependency + * @param project the maven project + * @return the dependency with interpolated property (as far as possible) + * @since 2.14.0 + */ + Dependency interpolateVersion( Dependency dependency, MavenProject project ); } diff --git a/src/test/java/org/codehaus/mojo/versions/DependencyUpdatesReportMojoTest.java b/src/test/java/org/codehaus/mojo/versions/DependencyUpdatesReportMojoTest.java index 37850e7dc..b7e853e78 100644 --- a/src/test/java/org/codehaus/mojo/versions/DependencyUpdatesReportMojoTest.java +++ b/src/test/java/org/codehaus/mojo/versions/DependencyUpdatesReportMojoTest.java @@ -155,6 +155,12 @@ public TestDependencyUpdatesReportMojo withAllowSnapshots( boolean allowSnapshot return this; } + public TestDependencyUpdatesReportMojo withOriginalProperty( String name, String value ) + { + project.getOriginalModel().getProperties().put( name, value ); + return this; + } + private static RepositorySystem mockRepositorySystem() { RepositorySystem repositorySystem = mock( RepositorySystem.class ); @@ -367,4 +373,27 @@ public void testIt001Overview() throws IOException, MavenReportException assertThat( "Did not generate summary correctly", output, containsString( "groupA test-artifact 1.1 compile pom default 1.1.0-2 1.1.3 1.3 3.0" ) ); } + + @Test + public void testResolvedVersionsWithoutTransitiveDependencyManagement() throws IOException, MavenReportException + { + OutputStream os = new ByteArrayOutputStream(); + SinkFactory sinkFactory = new Xhtml5SinkFactory(); + new TestDependencyUpdatesReportMojo() + .withOriginalDependencyManagement( + dependencyOf( "artifactA", "1.0.0" ), + dependencyOf( "artifactB", "${mycomponent.version}" ) ) + .withDependencyManagement( + dependencyOf( "artifactA", "1.0.0" ), + dependencyOf( "artifactB", "${mycomponent.version}" ) ) + .withProcessDependencyManagement( true ) + .withProcessDependencyManagementTransitive( false ) + .withOnlyUpgradable( false ) + .withOriginalProperty( "mycomponent.version", "1.2.3" ) + .generate( sinkFactory.createSink( os ), sinkFactory, Locale.getDefault() ); + + String output = os.toString(); + assertThat( output, Matchers + .stringContainsInOrder( "artifactA", "1.0.0", "artifactB", "1.2.3" ) ); + } } diff --git a/src/test/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojoTest.java b/src/test/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojoTest.java index 905f12e62..25250b203 100644 --- a/src/test/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojoTest.java +++ b/src/test/java/org/codehaus/mojo/versions/DisplayDependencyUpdatesMojoTest.java @@ -399,4 +399,34 @@ public void testDetermineUpdatedSegment() throws Exception assert outputFile == null || !outputFile.exists() || outputFile.delete(); } } + + @Test + public void testVersionInterpolation() throws Exception + { + File outputFile = null; + try + { + outputFile = File.createTempFile( "display-dependency-updates", "" ); + assert outputFile.exists(); + + DisplayDependencyUpdatesMojo mojo = (DisplayDependencyUpdatesMojo) mojoRule.lookupConfiguredMojo( + new File( "target/test-classes/org/codehaus/mojo/display-dependency-updates/version-interpolation" ), + "display-dependency-updates" ); + + // This is just an example of how to create it-style tests as unit tests; the advantage is easier debugging + mojo.outputFile = outputFile; + mojo.artifactMetadataSource = mockArtifactMetadataSource( new HashMap() + {{ + put( "dummy-api", new String[] { "2.0.1" } ); + }} ); + setVariableValueToObject( mojo, "processDependencyManagementTransitive", false ); + mojo.execute(); + List output = Files.readAllLines( outputFile.toPath(), UTF_8 ); + assertThat( output, not( hasItem( containsString( "mycomponent.version" ) ) ) ); + } + finally + { + assert outputFile == null || !outputFile.exists() || outputFile.delete(); + } + } } diff --git a/src/test/resources/org/codehaus/mojo/display-dependency-updates/version-interpolation/pom.xml b/src/test/resources/org/codehaus/mojo/display-dependency-updates/version-interpolation/pom.xml new file mode 100644 index 000000000..19213f0c0 --- /dev/null +++ b/src/test/resources/org/codehaus/mojo/display-dependency-updates/version-interpolation/pom.xml @@ -0,0 +1,46 @@ + + 4.0.0 + default-group + default-artifact + 1.0 + pom + + + 1.2.3 + + + + + + localhost + dummy-api + ${mycomponent.version} + + + + + + + localhost + dummy-api + + + + + + + org.codehaus.mojo + versions-maven-plugin + ${project.version} + + display-dependency-updates + + + + + + + + +