From 07ab962c85950b034be3216996900920c0204c3a Mon Sep 17 00:00:00 2001 From: rfscholte Date: Sat, 19 Oct 2019 18:23:57 +0200 Subject: [PATCH] [MNG-6765] tycho pom-less builds fails with 3.6.2 --- .../model/building/DefaultModelProcessor.java | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProcessor.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProcessor.java index a275022f2e..76370ac4e4 100644 --- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProcessor.java +++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelProcessor.java @@ -35,9 +35,31 @@ import org.apache.maven.model.locator.ModelLocator; import org.eclipse.sisu.Typed; /** - * DefaultModelProcessor + * + * Note: uses @Typed to limit the types it is available for injection to just ModelProcessor. + * + * This is because the ModelProcessor interface extends ModelLocator and ModelReader. If we + * made this component available under all its interfaces then it could end up being injected + * into itself leading to a stack overflow. + * + * A side-effect of using @Typed is that it translates to explicit bindings in the container. + * So instead of binding the component under a 'wildcard' key it is now bound with an explicit + * key. Since this is a default component this will be a plain binding of ModelProcessor to + * this implementation type, ie. no hint/name. + * + * This leads to a second side-effect in that any @Inject request for just ModelProcessor in + * the same injector is immediately matched to this explicit binding, which means extensions + * cannot override this binding. This is because the lookup is always short-circuited in this + * specific situation (plain @Inject request, and plain explicit binding for the same type.) + * + * The simplest solution is to use a custom @Named here so it isn't bound under the plain key. + * This is only necessary for default components using @Typed that want to support overriding. + * + * As a non-default component this now gets a negative priority relative to other implementations + * of the same interface. Since we want to allow overriding this doesn't matter in this case. + * (if it did we could add @Priority of 0 to match the priority given to default components.) */ -@Named +@Named( "core-default" ) @Singleton @Typed( ModelProcessor.class ) public class DefaultModelProcessor