Repository: maven Updated Branches: refs/heads/MNG-5971+MNG-6079 [created] b88ce7115
[MNG-5971] Imported dependencies should be available to inheritance processing o Updated to add support for an include scope in dependency management processed before inheritance and interpolation. o Updated to stop ignoring import/include conflicts silently. Project: http://git-wip-us.apache.org/repos/asf/maven/repo Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/b88ce711 Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/b88ce711 Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/b88ce711 Branch: refs/heads/MNG-5971+MNG-6079 Commit: b88ce71150656b5df4d39f778001041336b15cbe Parents: d413296 Author: Christian Schulte <schu...@apache.org> Authored: Thu Feb 18 14:07:02 2016 +0100 Committer: Christian Schulte <schu...@apache.org> Committed: Sun Jan 22 00:24:14 2017 +0100 ---------------------------------------------------------------------- .../model/building/DefaultModelBuilder.java | 407 ++++++++++++++----- .../building/DefaultModelBuilderFactory.java | 7 +- .../building/DefaultModelBuildingResult.java | 26 +- .../building/DefaultModelProblemCollector.java | 8 +- .../model/building/ModelBuildingRequest.java | 5 +- .../model/building/ModelBuildingResult.java | 12 + .../maven/model/building/ModelCacheTag.java | 2 + .../maven/model/building/ModelProblem.java | 2 + .../DefaultDependencyManagementImporter.java | 213 +++++++++- maven-model-builder/src/site/apt/index.apt | 12 +- 10 files changed, 555 insertions(+), 139 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/maven/blob/b88ce711/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java ---------------------------------------------------------------------- diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java index a6a8725..e6304c1 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java @@ -19,7 +19,6 @@ package org.apache.maven.model.building; * under the License. */ - import org.apache.commons.lang3.Validate; import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; @@ -68,6 +67,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; @@ -84,6 +84,7 @@ import static org.apache.maven.model.building.Result.newResult; public class DefaultModelBuilder implements ModelBuilder { + @Requirement private ModelProcessor modelProcessor; @@ -250,8 +251,8 @@ public class DefaultModelBuilder DefaultProfileActivationContext profileActivationContext = getProfileActivationContext( request ); problems.setSource( "(external profiles)" ); - List<Profile> activeExternalProfiles = profileSelector.getActiveProfiles( request.getProfiles(), - profileActivationContext, problems ); + List<Profile> activeExternalProfiles = + profileSelector.getActiveProfiles( request.getProfiles(), profileActivationContext, problems ); result.setActiveExternalProfiles( activeExternalProfiles ); @@ -298,8 +299,9 @@ public class DefaultModelBuilder profileActivationContext.setProjectProperties( tmpModel.getProperties() ); - List<Profile> activePomProfiles = profileSelector.getActiveProfiles( rawModel.getProfiles(), - profileActivationContext, problems ); + List<Profile> activePomProfiles = + profileSelector.getActiveProfiles( rawModel.getProfiles(), profileActivationContext, problems ); + currentData.setActiveProfiles( activePomProfiles ); Map<String, Activation> interpolatedActivations = getProfileActivations( rawModel, false ); @@ -333,14 +335,14 @@ public class DefaultModelBuilder currentData = superData; } else if ( currentData == resultData ) - { // First iteration - add initial parent id after version resolution. - currentData.setGroupId( currentData.getRawModel().getGroupId() == null ? parentData.getGroupId() - : currentData.getRawModel() - .getGroupId() ); + { // First iteration - add initial id after version resolution. + currentData.setGroupId( currentData.getRawModel().getGroupId() == null + ? parentData.getGroupId() + : currentData.getRawModel().getGroupId() ); - currentData.setVersion( currentData.getRawModel().getVersion() == null ? parentData.getVersion() - : currentData.getRawModel() - .getVersion() ); + currentData.setVersion( currentData.getRawModel().getVersion() == null + ? parentData.getVersion() + : currentData.getRawModel().getVersion() ); currentData.setArtifactId( currentData.getRawModel().getArtifactId() ); parentIds.add( currentData.getId() ); @@ -359,8 +361,9 @@ public class DefaultModelBuilder } message += parentData.getId(); - problems.add( new ModelProblemCollectorRequest( ModelProblem.Severity.FATAL, ModelProblem.Version.BASE ) - .setMessage( message ) ); + problems.add( new ModelProblemCollectorRequest( ModelProblem.Severity.FATAL, + ModelProblem.Version.BASE ). + setMessage( message ) ); throw problems.newModelBuildingException(); } @@ -373,24 +376,31 @@ public class DefaultModelBuilder problems.setSource( inputModel ); checkPluginVersions( lineage, request, problems ); - // inheritance assembly - assembleInheritance( lineage, request, problems ); + // This first phase of model building is used for building models holding just enough information to map + // groupId:artifactId:version to pom files and to provide modules to build. For this, inheritance and + // interpolation needs to be performed. A temporary model is built in phase 1 applying inheritance and + // interpolation to fill in those values but is not returned. The rest of the model building takes place in + // phase 2 (MNG-4052, MNG-5971). + final DefaultModelProblemCollector intermediateProblems = new DefaultModelProblemCollector( result ); + final List<Model> intermediateLineage = new ArrayList<>( lineage.size() ); + for ( final ModelData modelData : lineage ) + { + intermediateLineage.add( modelData.getModel().clone() ); + } + assembleInheritance( intermediateLineage, request, intermediateProblems ); + + Model intermediateModel = intermediateLineage.get( 0 ); + intermediateModel = interpolateModel( intermediateModel, request, intermediateProblems ); Model resultModel = resultData.getModel(); + resultModel.setGroupId( intermediateModel.getGroupId() ); + resultModel.setArtifactId( intermediateModel.getArtifactId() ); + resultModel.setVersion( intermediateModel.getVersion() ); + problems.setSource( resultModel ); problems.setRootModel( resultModel ); - // model interpolation - resultModel = interpolateModel( resultModel, request, problems ); - resultData.setModel( resultModel ); - - // url normalization - modelUrlNormalizer.normalize( resultModel, request ); - - // Now the fully interpolated model is available: reconfigure the resolver - configureResolver( request.getModelResolver(), resultModel, problems, true ); - resultData.setGroupId( resultModel.getGroupId() ); resultData.setArtifactId( resultModel.getArtifactId() ); resultData.setVersion( resultModel.getVersion() ); @@ -404,6 +414,7 @@ public class DefaultModelBuilder result.addModelId( modelId ); result.setActivePomProfiles( modelId, currentData.getActiveProfiles() ); result.setRawModel( modelId, currentData.getRawModel() ); + result.setEffectiveModel( modelId, currentData.getModel() ); } if ( !request.isTwoPhaseBuilding() ) @@ -418,20 +429,41 @@ public class DefaultModelBuilder public ModelBuildingResult build( ModelBuildingRequest request, ModelBuildingResult result ) throws ModelBuildingException { - return build( request, result, new LinkedHashSet<String>() ); - } - - private ModelBuildingResult build( ModelBuildingRequest request, ModelBuildingResult result, - Collection<String> imports ) - throws ModelBuildingException - { // phase 2 Model resultModel = result.getEffectiveModel(); + // Reset to on-disk values to not suppress any warnings from phase 1. + resultModel.setGroupId( result.getRawModel().getGroupId() ); + resultModel.setArtifactId( result.getRawModel().getArtifactId() ); + resultModel.setVersion( result.getRawModel().getVersion() ); + DefaultModelProblemCollector problems = new DefaultModelProblemCollector( result ); problems.setSource( resultModel ); problems.setRootModel( resultModel ); + final List<Model> lineage = new ArrayList<>( result.getModelIds().size() ); + + for ( final String modelId : result.getModelIds() ) + { + lineage.add( result.getEffectiveModel( modelId ) ); + } + + // Include scope processing. + processImports( lineage, "include", "pom", request, problems ); + + problems.setSource( resultModel ); + + // inheritance assembly + assembleInheritance( lineage, request, problems ); + + resultModel = interpolateModel( resultModel, request, problems ); + + // url normalization + modelUrlNormalizer.normalize( resultModel, request ); + + // Now the fully interpolated model is available: reconfigure the resolver + configureResolver( request.getModelResolver(), resultModel, problems, true ); + // model path translation modelPathTranslator.alignToBaseDirectory( resultModel, resultModel.getProjectDirectory(), request ); @@ -451,8 +483,8 @@ public class DefaultModelBuilder lifecycleBindingsInjector.injectLifecycleBindings( resultModel, request, problems ); } - // dependency management import - importDependencyManagement( resultModel, request, problems, imports ); + // Import scope processing. + importDependencyManagement( resultModel, "import", request, problems, new HashSet<String>() ); // dependency management injection dependencyManagementInjector.injectManagement( resultModel, request, problems ); @@ -485,10 +517,13 @@ public class DefaultModelBuilder @Override public Result<? extends Model> buildRawModel( File pomFile, int validationLevel, boolean locationTracking ) { - final ModelBuildingRequest request = new DefaultModelBuildingRequest().setValidationLevel( validationLevel ) - .setLocationTracking( locationTracking ); + final ModelBuildingRequest request = new DefaultModelBuildingRequest(). + setValidationLevel( validationLevel ). + setLocationTracking( locationTracking ); + final DefaultModelProblemCollector collector = new DefaultModelProblemCollector( new DefaultModelBuildingResult() ); + try { return newResult( readModel( null, pomFile, request, collector ), collector.getProblems() ); @@ -553,15 +588,17 @@ public class DefaultModelBuilder if ( pomFile != null ) { - problems.add( new ModelProblemCollectorRequest( Severity.ERROR, Version.V20 ) - .setMessage( "Malformed POM " + modelSource.getLocation() + ": " + e.getMessage() ) - .setException( e ) ); + problems.add( new ModelProblemCollectorRequest( Severity.ERROR, Version.V20 ). + setMessage( "Malformed POM " + modelSource.getLocation() + ": " + e.getMessage() ). + setException( e ) ); + } else { - problems.add( new ModelProblemCollectorRequest( Severity.WARNING, Version.V20 ) - .setMessage( "Malformed POM " + modelSource.getLocation() + ": " + e.getMessage() ) - .setException( e ) ); + problems.add( new ModelProblemCollectorRequest( Severity.WARNING, Version.V20 ). + setMessage( "Malformed POM " + modelSource.getLocation() + ": " + e.getMessage() ). + setException( e ) ); + } } @@ -573,14 +610,16 @@ public class DefaultModelBuilder } catch ( ModelParseException e ) { - problems.add( new ModelProblemCollectorRequest( Severity.FATAL, Version.BASE ) - .setMessage( "Non-parseable POM " + modelSource.getLocation() + ": " + e.getMessage() ) - .setException( e ) ); + problems.add( new ModelProblemCollectorRequest( Severity.FATAL, Version.BASE ). + setMessage( "Non-parseable POM " + modelSource.getLocation() + ": " + e.getMessage() ). + setException( e ) ); + throw problems.newModelBuildingException(); } catch ( IOException e ) { String msg = e.getMessage(); + if ( msg == null || msg.length() <= 0 ) { // NOTE: There's java.nio.charset.MalformedInputException and sun.io.MalformedInputException @@ -593,14 +632,18 @@ public class DefaultModelBuilder msg = e.getClass().getSimpleName(); } } - problems.add( new ModelProblemCollectorRequest( Severity.FATAL, Version.BASE ) - .setMessage( "Non-readable POM " + modelSource.getLocation() + ": " + msg ).setException( e ) ); + + problems.add( new ModelProblemCollectorRequest( Severity.FATAL, Version.BASE ). + setMessage( "Non-readable POM " + modelSource.getLocation() + ": " + msg ). + setException( e ) ); + throw problems.newModelBuildingException(); } model.setPomFile( pomFile ); problems.setSource( model ); + modelValidator.validateRawModel( model, request, problems ); if ( hasFatalErrors( problems ) ) @@ -649,9 +692,11 @@ public class DefaultModelBuilder } catch ( InvalidRepositoryException e ) { - problems.add( new ModelProblemCollectorRequest( Severity.ERROR, Version.BASE ) - .setMessage( "Invalid repository " + repository.getId() + ": " + e.getMessage() ) - .setLocation( repository.getLocation( "" ) ).setException( e ) ); + problems.add( new ModelProblemCollectorRequest( Severity.ERROR, Version.BASE ). + setMessage( "Invalid repository " + repository.getId() + ": " + e.getMessage() ). + setLocation( repository.getLocation( "" ) ). + setException( e ) ); + } } } @@ -703,21 +748,21 @@ public class DefaultModelBuilder if ( versions.get( key ) == null && managedVersions.get( key ) == null ) { InputLocation location = plugins.get( key ).getLocation( "" ); - problems - .add( new ModelProblemCollectorRequest( Severity.WARNING, Version.V20 ) - .setMessage( "'build.plugins.plugin.version' for " + key + " is missing." ) - .setLocation( location ) ); + problems.add( new ModelProblemCollectorRequest( Severity.WARNING, Version.V20 ). + setMessage( "'build.plugins.plugin.version' for " + key + " is missing." ). + setLocation( location ) ); + } } } - private void assembleInheritance( List<ModelData> lineage, ModelBuildingRequest request, + private void assembleInheritance( List<Model> lineage, ModelBuildingRequest request, ModelProblemCollector problems ) { for ( int i = lineage.size() - 2; i >= 0; i-- ) { - Model parent = lineage.get( i + 1 ).getModel(); - Model child = lineage.get( i ).getModel(); + Model parent = lineage.get( i + 1 ); + Model child = lineage.get( i ); inheritanceAssembler.assembleModelInheritance( child, parent, request, problems ); } } @@ -817,7 +862,7 @@ public class DefaultModelBuilder ModelSource expectedParentSource = getParentPomFile( childModel, childSource ); if ( expectedParentSource instanceof ModelSource2 - && !pomFile.toURI().equals( ( (ModelSource2) expectedParentSource ).getLocationURI() ) ) + && !pomFile.toURI().equals( ( (ModelSource2) expectedParentSource ).getLocationURI() ) ) { parentData = readParentExternally( childModel, request, problems ); } @@ -828,10 +873,11 @@ public class DefaultModelBuilder if ( !"pom".equals( parentModel.getPackaging() ) ) { - problems.add( new ModelProblemCollectorRequest( Severity.ERROR, Version.BASE ) - .setMessage( "Invalid packaging for parent POM " + ModelProblemUtils.toSourceHint( parentModel ) - + ", must be \"pom\" but is \"" + parentModel.getPackaging() + "\"" ) - .setLocation( parentModel.getLocation( "packaging" ) ) ); + problems.add( new ModelProblemCollectorRequest( Severity.ERROR, Version.BASE ). + setMessage( "Invalid packaging for parent POM " + ModelProblemUtils.toSourceHint( parentModel ) + + ", must be \"pom\" but is \"" + parentModel.getPackaging() + "\"" ). + setLocation( parentModel.getLocation( "packaging" ) ) ); + } } else @@ -873,11 +919,15 @@ public class DefaultModelBuilder { candidateModel = resolver.resolveRawModel( parent.getGroupId(), parent.getArtifactId(), parent.getVersion() ); + } catch ( UnresolvableModelException e ) { - problems.add( new ModelProblemCollectorRequest( Severity.FATAL, Version.BASE ) // - .setMessage( e.getMessage().toString() ).setLocation( parent.getLocation( "" ) ).setException( e ) ); + problems.add( new ModelProblemCollectorRequest( Severity.FATAL, Version.BASE ). + setMessage( e.getMessage().toString() ). + setLocation( parent.getLocation( "" ) ). + setException( e ) ); + throw problems.newModelBuildingException(); } if ( candidateModel == null ) @@ -892,7 +942,6 @@ public class DefaultModelBuilder // have a model that is suitable, yet more checks are done here and the one for the version is problematic // before because with parents as ranges it will never work in this scenario. // - String groupId = candidateModel.getGroupId(); if ( groupId == null && candidateModel.getParent() != null ) { @@ -906,7 +955,7 @@ public class DefaultModelBuilder } if ( groupId == null || !groupId.equals( parent.getGroupId() ) || artifactId == null - || !artifactId.equals( parent.getArtifactId() ) ) + || !artifactId.equals( parent.getArtifactId() ) ) { StringBuilder buffer = new StringBuilder( 256 ); buffer.append( "'parent.relativePath'" ); @@ -919,8 +968,10 @@ public class DefaultModelBuilder buffer.append( parent.getArtifactId() ).append( ", please verify your project structure" ); problems.setSource( childModel ); - problems.add( new ModelProblemCollectorRequest( Severity.WARNING, Version.BASE ) - .setMessage( buffer.toString() ).setLocation( parent.getLocation( "" ) ) ); + problems.add( new ModelProblemCollectorRequest( Severity.WARNING, Version.BASE ). + setMessage( buffer.toString() ). + setLocation( parent.getLocation( "" ) ) ); + return null; } if ( version != null && parent.getVersion() != null && !version.equals( parent.getVersion() ) ) @@ -954,7 +1005,6 @@ public class DefaultModelBuilder /* * if ( version == null || !version.equals( parent.getVersion() ) ) { return null; } */ - ModelData parentData = new ModelData( candidateSource, candidateModel, groupId, artifactId, version ); return parentData; @@ -992,7 +1042,8 @@ public class DefaultModelBuilder ModelResolver modelResolver = request.getModelResolver(); Validate.notNull( modelResolver, "request.modelResolver cannot be null (parent POM %s and POM %s)", - ModelProblemUtils.toId( groupId, artifactId, version ), ModelProblemUtils.toSourceHint( childModel ) ); + ModelProblemUtils.toId( groupId, artifactId, version ), + ModelProblemUtils.toSourceHint( childModel ) ); ModelSource modelSource; try @@ -1024,8 +1075,11 @@ public class DefaultModelBuilder } } - problems.add( new ModelProblemCollectorRequest( Severity.FATAL, Version.BASE ) - .setMessage( buffer.toString() ).setLocation( parent.getLocation( "" ) ).setException( e ) ); + problems.add( new ModelProblemCollectorRequest( Severity.FATAL, Version.BASE ). + setMessage( buffer.toString() ). + setLocation( parent.getLocation( "" ) ). + setException( e ) ); + throw problems.newModelBuildingException(); } @@ -1034,11 +1088,13 @@ public class DefaultModelBuilder { lenientRequest = new FilterModelBuildingRequest( request ) { + @Override public int getValidationLevel() { return ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_2_0; } + }; } @@ -1048,8 +1104,9 @@ public class DefaultModelBuilder { if ( childModel.getVersion() == null ) { - problems.add( new ModelProblemCollectorRequest( Severity.FATAL, Version.V31 ) - .setMessage( "Version must be a constant" ).setLocation( childModel.getLocation( "" ) ) ); + problems.add( new ModelProblemCollectorRequest( Severity.FATAL, Version.V31 ). + setMessage( "Version must be a constant" ). + setLocation( childModel.getLocation( "" ) ) ); } else @@ -1057,9 +1114,9 @@ public class DefaultModelBuilder if ( childModel.getVersion() .contains( "${" ) ) { - problems.add( new ModelProblemCollectorRequest( Severity.FATAL, Version.V31 ) - .setMessage( "Version must be a constant" ) - .setLocation( childModel.getLocation( "version" ) ) ); + problems.add( new ModelProblemCollectorRequest( Severity.FATAL, Version.V31 ). + setMessage( "Version must be a constant" ). + setLocation( childModel.getLocation( "version" ) ) ); } } @@ -1078,7 +1135,7 @@ public class DefaultModelBuilder return superPomProvider.getSuperModel( "4.0.0" ).clone(); } - private void importDependencyManagement( Model model, ModelBuildingRequest request, + private void importDependencyManagement( Model model, String scope, ModelBuildingRequest request, DefaultModelProblemCollector problems, Collection<String> importIds ) { DependencyManagement depMngt = model.getDependencyManagement(); @@ -1088,6 +1145,8 @@ public class DefaultModelBuilder return; } + problems.setSource( model ); + String importing = model.getGroupId() + ':' + model.getArtifactId() + ':' + model.getVersion(); importIds.add( importing ); @@ -1103,7 +1162,7 @@ public class DefaultModelBuilder { Dependency dependency = it.next(); - if ( !"pom".equals( dependency.getType() ) || !"import".equals( dependency.getScope() ) ) + if ( !"pom".equals( dependency.getType() ) || !scope.equals( dependency.getScope() ) ) { continue; } @@ -1116,26 +1175,29 @@ public class DefaultModelBuilder if ( groupId == null || groupId.length() <= 0 ) { - problems.add( new ModelProblemCollectorRequest( Severity.ERROR, Version.BASE ) - .setMessage( "'dependencyManagement.dependencies.dependency.groupId' for " - + dependency.getManagementKey() + " is missing." ) - .setLocation( dependency.getLocation( "" ) ) ); + problems.add( new ModelProblemCollectorRequest( Severity.ERROR, Version.BASE ). + setMessage( "'dependencyManagement.dependencies.dependency.groupId' for " + + dependency.getManagementKey() + " is missing." ). + setLocation( dependency.getLocation( "" ) ) ); + continue; } if ( artifactId == null || artifactId.length() <= 0 ) { - problems.add( new ModelProblemCollectorRequest( Severity.ERROR, Version.BASE ) - .setMessage( "'dependencyManagement.dependencies.dependency.artifactId' for " - + dependency.getManagementKey() + " is missing." ) - .setLocation( dependency.getLocation( "" ) ) ); + problems.add( new ModelProblemCollectorRequest( Severity.ERROR, Version.BASE ). + setMessage( "'dependencyManagement.dependencies.dependency.artifactId' for " + + dependency.getManagementKey() + " is missing." ). + setLocation( dependency.getLocation( "" ) ) ); + continue; } if ( version == null || version.length() <= 0 ) { - problems.add( new ModelProblemCollectorRequest( Severity.ERROR, Version.BASE ) - .setMessage( "'dependencyManagement.dependencies.dependency.version' for " - + dependency.getManagementKey() + " is missing." ) - .setLocation( dependency.getLocation( "" ) ) ); + problems.add( new ModelProblemCollectorRequest( Severity.ERROR, Version.BASE ). + setMessage( "'dependencyManagement.dependencies.dependency.version' for " + + dependency.getManagementKey() + " is missing." ). + setLocation( dependency.getLocation( "" ) ) ); + continue; } @@ -1143,13 +1205,14 @@ public class DefaultModelBuilder if ( importIds.contains( imported ) ) { - String message = "The dependencies of type=pom and with scope=import form a cycle: "; + String message = "The dependencies of type=pom and scope=" + scope + " form a cycle: "; for ( String modelId : importIds ) { message += modelId + " -> "; } message += imported; - problems.add( new ModelProblemCollectorRequest( Severity.ERROR, Version.BASE ).setMessage( message ) ); + problems.add( new ModelProblemCollectorRequest( Severity.ERROR, Version.BASE ). + setMessage( message ) ); continue; } @@ -1163,9 +1226,10 @@ public class DefaultModelBuilder { throw new NullPointerException( String.format( "request.workspaceModelResolver and request.modelResolver cannot be null" - + " (parent POM %s and POM %s)", + + " (parent POM %s and POM %s)", ModelProblemUtils.toId( groupId, artifactId, version ), ModelProblemUtils.toSourceHint( model ) ) ); + } Model importModel = null; @@ -1177,8 +1241,10 @@ public class DefaultModelBuilder } catch ( UnresolvableModelException e ) { - problems.add( new ModelProblemCollectorRequest( Severity.FATAL, Version.BASE ) - .setMessage( e.getMessage().toString() ).setException( e ) ); + problems.add( new ModelProblemCollectorRequest( Severity.FATAL, Version.BASE ). + setMessage( e.getMessage() ). + setException( e ) ); + continue; } } @@ -1194,16 +1260,18 @@ public class DefaultModelBuilder catch ( UnresolvableModelException e ) { StringBuilder buffer = new StringBuilder( 256 ); - buffer.append( "Non-resolvable import POM" ); + buffer.append( "Non-resolvable " + scope + " POM" ); if ( !containsCoordinates( e.getMessage(), groupId, artifactId, version ) ) { buffer.append( " " ).append( ModelProblemUtils.toId( groupId, artifactId, version ) ); } buffer.append( ": " ).append( e.getMessage() ); - problems.add( new ModelProblemCollectorRequest( Severity.ERROR, Version.BASE ) - .setMessage( buffer.toString() ).setLocation( dependency.getLocation( "" ) ) - .setException( e ) ); + problems.add( new ModelProblemCollectorRequest( Severity.ERROR, Version.BASE ). + setMessage( buffer.toString() ). + setLocation( dependency.getLocation( "" ) ). + setException( e ) ); + continue; } @@ -1259,6 +1327,135 @@ public class DefaultModelBuilder dependencyManagementImporter.importManagement( model, importMngts, request, problems ); } + private void processImports( final List<Model> lineage, final String scope, final String packaging, + final ModelBuildingRequest request, final DefaultModelProblemCollector problems ) + { + // [MNG-5971] Imported dependencies should be available to inheritance processing + // It's not possible to support all ${project.xyz} properties in dependency management include declarations + // because include processing is performed before the final inheritance processing is performed. So the set of + // ${project.xyz} properties supported in dependency management include declarations is limited. + + final List<Model> intermediateLineage = new ArrayList<>( lineage.size() ); + + for ( int i = 0, s0 = lineage.size(); i < s0; i++ ) + { + intermediateLineage.add( lineage.get( i ).clone() ); + } + + for ( int i = intermediateLineage.size() - 2; i >= 0; i-- ) + { + final Model parent = intermediateLineage.get( i + 1 ); + final Model child = intermediateLineage.get( i ); + + if ( child.getGroupId() == null ) + { + // Support ${project.groupId} in dependency management include declarations. + child.setGroupId( parent.getGroupId() ); + } + if ( child.getVersion() == null ) + { + // Support ${project.version} in dependency management include declarations. + child.setVersion( parent.getVersion() ); + } + + final Properties properties = new Properties(); + properties.putAll( parent.getProperties() ); + properties.putAll( child.getProperties() ); + child.setProperties( properties ); + + final List<Repository> repositories = new ArrayList<>(); + repositories.addAll( child.getRepositories() ); + + for ( final Repository parentRepository : parent.getRepositories() ) + { + if ( !repositories.contains( parentRepository ) ) + { + repositories.add( parentRepository ); + } + } + + child.setRepositories( repositories ); + } + + final Properties effectiveProperties = intermediateLineage.get( 0 ).getProperties(); + + final DefaultModelProblemCollector intermediateProblems = + new DefaultModelProblemCollector( new DefaultModelBuildingResult() ); + + // Interpolates the intermediate model. + // MNG-6079: Uses the effective properties of the result model to support property overriding. + for ( int i = 0, s0 = intermediateLineage.size(); i < s0; i++ ) + { + final Model model = intermediateLineage.get( i ); + model.setProperties( effectiveProperties ); + intermediateProblems.setSource( model ); + this.interpolateModel( model, request, intermediateProblems ); + } + + // Exchanges 'include' scope dependencies in the original lineage with possibly interpolated values. + for ( int i = 0, s0 = lineage.size(); i < s0; i++ ) + { + final Model model = lineage.get( i ); + + if ( model.getDependencyManagement() != null ) + { + for ( int j = 0, s1 = model.getDependencyManagement().getDependencies().size(); j < s1; j++ ) + { + final Dependency dependency = model.getDependencyManagement().getDependencies().get( j ); + + if ( scope.equals( dependency.getScope() ) && packaging.equals( dependency.getType() ) ) + { + final Dependency interpolated = + intermediateLineage.get( i ).getDependencyManagement().getDependencies().get( j ); + + model.getDependencyManagement().getDependencies().set( j, interpolated ); + } + } + } + } + + // [MNG-4488] [regression] Parent POMs resolved from repository are validated in strict mode + ModelBuildingRequest lenientRequest = request; + if ( request.getValidationLevel() > ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_2_0 ) + { + lenientRequest = new FilterModelBuildingRequest( request ) + { + + @Override + public int getValidationLevel() + { + return ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_2_0; + } + + }; + } + + // Sets up the resolver to use the effective repositories to support repository overriding. + if ( lenientRequest.getModelResolver() != null ) + { + for ( Repository repository : intermediateLineage.get( 0 ).getRepositories() ) + { + try + { + lenientRequest.getModelResolver().addRepository( repository, true ); + } + catch ( InvalidRepositoryException e ) + { + problems.add( new ModelProblemCollectorRequest( Severity.ERROR, Version.BASE ) + .setMessage( "Invalid repository " + repository.getId() + ": " + e.getMessage() ) + .setLocation( repository.getLocation( "" ) ).setException( e ) ); + + } + } + } + + // Imports dependencies into the original model using the effective repositories. + for ( int i = 0, s0 = lineage.size(); i < s0; i++ ) + { + this.importDependencyManagement( lineage.get( i ), scope, lenientRequest, problems, new HashSet<String>() ); + } + } + private <T> void putCache( ModelCache modelCache, String groupId, String artifactId, String version, ModelCacheTag<T> tag, T data ) { @@ -1298,9 +1495,11 @@ public class DefaultModelBuilder private boolean containsCoordinates( String message, String groupId, String artifactId, String version ) { - return message != null && ( groupId == null || message.contains( groupId ) ) - && ( artifactId == null || message.contains( artifactId ) ) - && ( version == null || message.contains( version ) ); + return message != null + && ( groupId == null || message.contains( groupId ) ) + && ( artifactId == null || message.contains( artifactId ) ) + && ( version == null || message.contains( version ) ); + } protected boolean hasModelErrors( ModelProblemCollectorExt problems ) http://git-wip-us.apache.org/repos/asf/maven/blob/b88ce711/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilderFactory.java ---------------------------------------------------------------------- diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilderFactory.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilderFactory.java index 36a0f46..313d307 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilderFactory.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilderFactory.java @@ -108,8 +108,11 @@ public class DefaultModelBuilderFactory protected ProfileActivator[] newProfileActivators() { - return new ProfileActivator[] { new JdkVersionProfileActivator(), new OperatingSystemProfileActivator(), - new PropertyProfileActivator(), new FileProfileActivator().setPathTranslator( newPathTranslator() ) }; + return new ProfileActivator[] + { + new JdkVersionProfileActivator(), new OperatingSystemProfileActivator(), + new PropertyProfileActivator(), new FileProfileActivator().setPathTranslator( newPathTranslator() ) + }; } protected UrlNormalizer newUrlNormalizer() http://git-wip-us.apache.org/repos/asf/maven/blob/b88ce711/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingResult.java ---------------------------------------------------------------------- diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingResult.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingResult.java index 7bf45b5..fe1c7ae 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingResult.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuildingResult.java @@ -39,11 +39,13 @@ class DefaultModelBuildingResult private Model effectiveModel; - private List<String> modelIds; + private final List<String> modelIds; - private Map<String, Model> rawModels; + private final Map<String, Model> rawModels; - private Map<String, List<Profile>> activePomProfiles; + private final Map<String, Model> effectiveModels; + + private final Map<String, List<Profile>> activePomProfiles; private List<Profile> activeExternalProfiles; @@ -56,6 +58,7 @@ class DefaultModelBuildingResult activePomProfiles = new HashMap<>(); activeExternalProfiles = new ArrayList<>(); problems = new ArrayList<>(); + effectiveModels = new HashMap<>(); } @Override @@ -110,6 +113,23 @@ class DefaultModelBuildingResult } @Override + public Model getEffectiveModel( final String modelId ) + { + return this.effectiveModels.get( modelId ); + } + + public DefaultModelBuildingResult setEffectiveModel( final String modelId, final Model model ) + { + // Intentionally notNull because Super POM may not contain a modelId + Validate.notNull( modelId, "modelId must not be null" ); + Validate.notNull( model, "model must not be null" ); + + this.effectiveModels.put( modelId, model ); + + return this; + } + + @Override public List<Profile> getActivePomProfiles( String modelId ) { return activePomProfiles.get( modelId ); http://git-wip-us.apache.org/repos/asf/maven/blob/b88ce711/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblemCollector.java ---------------------------------------------------------------------- diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblemCollector.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblemCollector.java index 89d5cb2..e46cc98 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblemCollector.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProblemCollector.java @@ -146,7 +146,7 @@ class DefaultModelProblemCollector { int line = -1; int column = -1; - String source = null; + String src = null; String modelId = null; if ( req.getLocation() != null ) @@ -156,14 +156,14 @@ class DefaultModelProblemCollector if ( req.getLocation().getSource() != null ) { modelId = req.getLocation().getSource().getModelId(); - source = req.getLocation().getSource().getLocation(); + src = req.getLocation().getSource().getLocation(); } } if ( modelId == null ) { modelId = getModelId(); - source = getSource(); + src = getSource(); } if ( line <= 0 && column <= 0 && req.getException() instanceof ModelParseException ) @@ -174,7 +174,7 @@ class DefaultModelProblemCollector } ModelProblem problem = - new DefaultModelProblem( req.getMessage(), req.getSeverity(), req.getVersion(), source, line, column, + new DefaultModelProblem( req.getMessage(), req.getSeverity(), req.getVersion(), src, line, column, modelId, req.getException() ); add( problem ); http://git-wip-us.apache.org/repos/asf/maven/blob/b88ce711/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingRequest.java ---------------------------------------------------------------------- diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingRequest.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingRequest.java index c10274d..ed883ed 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingRequest.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingRequest.java @@ -23,7 +23,6 @@ import java.io.File; import java.util.Date; import java.util.List; import java.util.Properties; - import org.apache.maven.model.Model; import org.apache.maven.model.Profile; import org.apache.maven.model.resolution.ModelResolver; @@ -66,7 +65,7 @@ public interface ModelBuildingRequest /** * Gets the raw model to build. If not set, model source will be used to load raw model. - * + * * @return The raw model to build or {@code null} if not set. */ Model getRawModel(); @@ -335,4 +334,4 @@ public interface ModelBuildingRequest ModelBuildingRequest setWorkspaceModelResolver( WorkspaceModelResolver workspaceResolver ); -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/maven/blob/b88ce711/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingResult.java ---------------------------------------------------------------------- diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingResult.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingResult.java index 44b1295..469bcbd 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingResult.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelBuildingResult.java @@ -69,6 +69,18 @@ public interface ModelBuildingResult Model getRawModel( String modelId ); /** + * Gets the effective model for a given identifier. The model identifier should be from the collection obtained by + * {@link #getModelIds()}. As a special case, an empty string can be used as the identifier for the super POM. + * + * @param modelId The identifier of the desired effective model, must not be {@code null}. + * + * @return The effective model or {@code null} if the specified model id does not refer to a known model. + * + * @since 3.5 + */ + Model getEffectiveModel( String modelId ); + + /** * Gets the profiles from the specified model that were active during model building. The model identifier should be * from the collection obtained by {@link #getModelIds()}. As a special case, an empty string can be used as the * identifier for the super POM. http://git-wip-us.apache.org/repos/asf/maven/blob/b88ce711/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelCacheTag.java ---------------------------------------------------------------------- diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelCacheTag.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelCacheTag.java index 8452f96..e57db8e 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelCacheTag.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelCacheTag.java @@ -51,6 +51,7 @@ interface ModelCacheTag<T> * cache is populated but the state of the cache must not change so we need to make a copy. * * @param data The data to store in the cache, must not be {@code null}. + * * @return The data being stored in the cache, never {@code null}. */ T intoCache( T data ); @@ -60,6 +61,7 @@ interface ModelCacheTag<T> * cache is queried but the state of the cache must not change so we need to make a copy. * * @param data The data to retrieve from the cache, must not be {@code null}. + * * @return The data being retrieved from the cache, never {@code null}. */ T fromCache( T data ); http://git-wip-us.apache.org/repos/asf/maven/blob/b88ce711/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblem.java ---------------------------------------------------------------------- diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblem.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblem.java index 43272ba..02acf44 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblem.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/ModelProblem.java @@ -43,11 +43,13 @@ public interface ModelProblem enum Version { + //based on ModeBuildingResult.validationLevel BASE, V20, V30, V31 + } /** http://git-wip-us.apache.org/repos/asf/maven/blob/b88ce711/maven-model-builder/src/main/java/org/apache/maven/model/composition/DefaultDependencyManagementImporter.java ---------------------------------------------------------------------- diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/composition/DefaultDependencyManagementImporter.java b/maven-model-builder/src/main/java/org/apache/maven/model/composition/DefaultDependencyManagementImporter.java index d895913..928118a 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/composition/DefaultDependencyManagementImporter.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/composition/DefaultDependencyManagementImporter.java @@ -20,15 +20,20 @@ package org.apache.maven.model.composition; */ import java.util.ArrayList; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; - import org.apache.maven.model.Dependency; import org.apache.maven.model.DependencyManagement; +import org.apache.maven.model.Exclusion; +import org.apache.maven.model.InputLocation; +import org.apache.maven.model.InputSource; import org.apache.maven.model.Model; import org.apache.maven.model.building.ModelBuildingRequest; +import org.apache.maven.model.building.ModelProblem; import org.apache.maven.model.building.ModelProblemCollector; +import org.apache.maven.model.building.ModelProblemCollectorRequest; import org.codehaus.plexus.component.annotations.Component; /** @@ -42,41 +47,215 @@ public class DefaultDependencyManagementImporter { @Override - public void importManagement( Model target, List<? extends DependencyManagement> sources, - ModelBuildingRequest request, ModelProblemCollector problems ) + public void importManagement( final Model target, final List<? extends DependencyManagement> sources, + final ModelBuildingRequest request, final ModelProblemCollector problems ) { if ( sources != null && !sources.isEmpty() ) { - Map<String, Dependency> dependencies = new LinkedHashMap<>(); + final Map<String, Dependency> targetDependencies = new LinkedHashMap<>(); + final DependencyManagement targetDependencyManagement = target.getDependencyManagement() != null + ? target.getDependencyManagement() + : new DependencyManagement(); + + target.setDependencyManagement( targetDependencyManagement ); + + for ( final Dependency targetDependency : targetDependencyManagement.getDependencies() ) + { + targetDependencies.put( targetDependency.getManagementKey(), targetDependency ); + } - DependencyManagement depMngt = target.getDependencyManagement(); + final Map<String, List<Dependency>> sourceDependencies = new LinkedHashMap<>(); - if ( depMngt != null ) + for ( final DependencyManagement source : sources ) { - for ( Dependency dependency : depMngt.getDependencies() ) + for ( final Dependency sourceDependency : source.getDependencies() ) { - dependencies.put( dependency.getManagementKey(), dependency ); + if ( !targetDependencies.containsKey( sourceDependency.getManagementKey() ) ) + { + List<Dependency> conflictCanditates = + sourceDependencies.get( sourceDependency.getManagementKey() ); + + if ( conflictCanditates == null ) + { + conflictCanditates = new ArrayList<>( source.getDependencies().size() ); + sourceDependencies.put( sourceDependency.getManagementKey(), conflictCanditates ); + } + + conflictCanditates.add( sourceDependency ); + } } } - else + + for ( final List<Dependency> conflictCanditates : sourceDependencies.values() ) { - depMngt = new DependencyManagement(); - target.setDependencyManagement( depMngt ); + final List<Dependency> conflictingDependencies = removeRedundantDependencies( conflictCanditates ); + + // First declaration wins. This makes the conflict resolution indeterministic because this + // solely relies on the order of declaration. There is no such thing as the "first" declaration. + targetDependencyManagement.getDependencies().add( conflictingDependencies.get( 0 ) ); + + // As of Maven 3.5, we print a warning about such conflicting imports. + if ( conflictingDependencies.size() > 1 ) + { + final StringBuilder conflictsBuilder = new StringBuilder( conflictingDependencies.size() * 128 ); + + for ( final Dependency dependency : conflictingDependencies ) + { + final InputLocation location = dependency.getLocation( "" ); + + if ( location != null ) + { + final InputSource inputSource = location.getSource(); + + if ( inputSource != null ) + { + conflictsBuilder.append( ", '" ).append( inputSource.getModelId() ).append( '\'' ); + } + } + } + + problems.add( new ModelProblemCollectorRequest( + effectiveSeverity( request.getValidationLevel(), + ModelBuildingRequest.VALIDATION_LEVEL_MAVEN_3_1 ), + ModelProblem.Version.V20 ). + setMessage( String.format( + "Dependency '%1$s' has conflicting dependency management in model '%2$s'%3$s%4$s. " + + "To resolve the conflicts, declare the dependency management for dependency '%1$s' " + + "directly in the dependency management of model '%2$s' to override what gets " + + "imported. If the Maven version in use supports it, add exclusions for the " + + "conflicting dependencies or use the include scope feature to rearrange the " + + "causing dependencies in the inheritance hierarchy applying standard override logic " + + "based on artifact coordinates. Without resolving the conflicts, your build relies " + + "on indeterministic behaviour.", + conflictingDependencies.get( 0 ).getManagementKey(), target.getId(), + target.getPomFile() != null + ? " @ '" + target.getPomFile().getAbsolutePath() + "' " + : " ", conflictsBuilder.length() > 0 + ? "(" + conflictsBuilder.substring( 2 ) + ")" + : "" ) ) ); + + } } + } + } + + private static List<Dependency> removeRedundantDependencies( final List<Dependency> candidateDependencies ) + { + final List<Dependency> resultDependencies = new ArrayList<>( candidateDependencies.size() ); - for ( DependencyManagement source : sources ) + while ( !candidateDependencies.isEmpty() ) + { + final Dependency resultDependency = candidateDependencies.remove( 0 ); + resultDependencies.add( resultDependency ); + + // Removes redundant dependencies. + for ( final Iterator<Dependency> it = candidateDependencies.iterator(); it.hasNext(); ) { - for ( Dependency dependency : source.getDependencies() ) + final Dependency candidateDependency = it.next(); + boolean redundant = true; + + redundancy_check: { - String key = dependency.getManagementKey(); - if ( !dependencies.containsKey( key ) ) + if ( !( resultDependency.getOptional() != null + ? resultDependency.getOptional().equals( candidateDependency.getOptional() ) + : candidateDependency.getOptional() == null ) ) + { + redundant = false; + break redundancy_check; + } + + if ( !( effectiveScope( resultDependency ).equals( effectiveScope( candidateDependency ) ) ) ) + { + redundant = false; + break redundancy_check; + } + + if ( !( resultDependency.getSystemPath() != null + ? resultDependency.getSystemPath().equals( candidateDependency.getSystemPath() ) + : candidateDependency.getSystemPath() == null ) ) { - dependencies.put( key, dependency ); + redundant = false; + break redundancy_check; } + + if ( !( resultDependency.getVersion() != null + ? resultDependency.getVersion().equals( candidateDependency.getVersion() ) + : candidateDependency.getVersion() == null ) ) + { + redundant = false; + break redundancy_check; + } + + for ( int i = 0, s0 = resultDependency.getExclusions().size(); i < s0; i++ ) + { + final Exclusion resultExclusion = resultDependency.getExclusions().get( i ); + + if ( !containsExclusion( candidateDependency.getExclusions(), resultExclusion ) ) + { + redundant = false; + break redundancy_check; + } + } + + for ( int i = 0, s0 = candidateDependency.getExclusions().size(); i < s0; i++ ) + { + final Exclusion candidateExclusion = candidateDependency.getExclusions().get( i ); + + if ( !containsExclusion( resultDependency.getExclusions(), candidateExclusion ) ) + { + redundant = false; + break redundancy_check; + } + } + } + + if ( redundant ) + { + it.remove(); } } + } + + return resultDependencies; + } + + private static boolean containsExclusion( final List<Exclusion> exclusions, final Exclusion exclusion ) + { + for ( int i = 0, s0 = exclusions.size(); i < s0; i++ ) + { + final Exclusion current = exclusions.get( i ); + + if ( ( exclusion.getArtifactId() != null + ? exclusion.getArtifactId().equals( current.getArtifactId() ) + : current.getArtifactId() == null ) + && ( exclusion.getGroupId() != null + ? exclusion.getGroupId().equals( current.getGroupId() ) + : current.getGroupId() == null ) ) + { + return true; + } + } + + return false; + } - depMngt.setDependencies( new ArrayList<>( dependencies.values() ) ); + private static String effectiveScope( final Dependency dependency ) + { + return dependency.getScope() == null + ? "compile" + : dependency.getScope(); + + } + + private static ModelProblem.Severity effectiveSeverity( final int validationLevel, final int errorThreshold ) + { + if ( validationLevel < errorThreshold ) + { + return ModelProblem.Severity.WARNING; + } + else + { + return ModelProblem.Severity.ERROR; } } http://git-wip-us.apache.org/repos/asf/maven/blob/b88ce711/maven-model-builder/src/site/apt/index.apt ---------------------------------------------------------------------- diff --git a/maven-model-builder/src/site/apt/index.apt b/maven-model-builder/src/site/apt/index.apt index 9a645f4..73690d5 100644 --- a/maven-model-builder/src/site/apt/index.apt +++ b/maven-model-builder/src/site/apt/index.apt @@ -57,6 +57,12 @@ Maven Model Builder ** parent resolution until {{{./super-pom.html}super-pom}} + [] + + * phase 2, with optional plugin processing + + ** dependency management import (for dependencies of type <<<pom>>> in the <<<\<dependencyManagement\>>>> section) + ** inheritance assembly: <<<InheritanceAssembler>>> ({{{./apidocs/org/apache/maven/model/inheritance/InheritanceAssembler.html}javadoc}}), with its <<<DefaultInheritanceAssembler>>> implementation ({{{./xref/org/apache/maven/model/inheritance/DefaultInheritanceAssembler.html}source}}). Notice that @@ -70,10 +76,6 @@ Maven Model Builder with its <<<DefaultUrlNormalizer>>> implementation ({{{./xref/org/apache/maven/model/path/DefaultUrlNormalizer.html}source}}) - [] - - * phase 2, with optional plugin processing - ** model path translation: <<<ModelPathTranslator>>> ({{{./apidocs/org/apache/maven/model/path/ModelPathTranslator.html}javadoc}}), with its <<<DefaultModelPathTranslator>>> implementation ({{{./xref/org/apache/maven/model/path/DefaultModelPathTranslator.html}source}}) @@ -86,8 +88,6 @@ Maven Model Builder with its <<<DefaultLifecycleBindingsInjector>>> implementation ({{{./xref/org/apache/maven/model/plugin/DefaultLifecycleBindingsInjector.html}source}}) - ** dependency management import (for dependencies of type <<<pom>>> in the <<<\<dependencyManagement\>>>> section) - ** dependency management injection: <<<DependencyManagementInjector>>> ({{{./apidocs/org/apache/maven/model/management/DependencyManagementInjector.html}javadoc}}), with its <<<DefaultDependencyManagementInjector>>> implementation ({{{./xref/org/apache/maven/model/management/DefaultDependencyManagementInjector.html}source}})