slachiewicz opened a new issue, #13326:
URL: https://github.com/apache/maven/issues/13326

   ### Affected version
   
   4.0.0-rc-7; unchanged on `master`.
   
   ### Bug description
   
   A mojo written against the Maven 4 API cannot inject a JSR-330/Sisu 
component from its own plugin realm, although Maven core bridges the two 
injectors everywhere else.
   
   
[`DefaultMavenPluginManager.loadV4Mojo`](https://github.com/apache/maven/blob/master/impl/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java#L566-L567)
 builds the mojo with a fresh `Injector.create()` and 
`injector.discover(pluginRealm)`. `discover` reads only 
`META-INF/maven/org.apache.maven.api.di.Inject`, and the plain `InjectorImpl` 
never consults Sisu, so a component listed in the realm's 
`META-INF/sisu/javax.inject.Named` cannot be injected into the mojo.
   
   The rest of core does not have this gap. 
[`SisuDiBridgeModule.BridgeInjectorImpl`](https://github.com/apache/maven/blob/master/impl/maven-core/src/main/java/org/apache/maven/internal/impl/SisuDiBridgeModule.java)
 falls back to Sisu's `BeanLocator` for single beans, `List` and `Map`, and 
`discoverPluginComponents` already installs `SisuDiBridgeModule` when it scans 
the plugin realm, so the container does see the component. Only the injector 
that builds the v4 mojo skips it; the `// TODO: get those from the existing 
plexus scopes ?` next to it points at the same spot.
   
   This blocks every Maven 4 API port that uses a library still shipping Sisu 
components. The ports of maven-scm-publish-plugin, maven-changelog-plugin and 
maven-release could not inject `ScmManager` and ended up parsing 
`META-INF/sisu/javax.inject.Named` by hand; #13302 lists the same gap for 
`ArchiverManager`, `VelocityComponent` and `LocationManager`. 
apache/maven-scm#1418 works around it for maven-scm only.
   
   ### Reproducer
   
   A maven-core test puts a `@javax.inject.Named("sisu") @Singleton` component 
and a Maven 4 API mojo that injects it into one plugin realm, checks that the 
container finds the component, and asks `MavenPluginManager.getConfiguredMojo` 
for the mojo. On `master` it fails with:
   
   ```
   org.apache.maven.plugin.PluginContainerException: Unable to lookup Mojo
        at 
org.apache.maven.plugin.internal.DefaultMavenPluginManager.loadV4Mojo(DefaultMavenPluginManager.java:582)
   Caused by: org.apache.maven.di.impl.DIException: No binding to construct an 
instance for key @Named("sisu") SisuComponent.  Existing bindings:
    - @Named("org.apache.maven.its:v4-sisu-plugin:1.0:inject") InjectingMojo
    - @Named("org.apache.maven.its:v4-sisu-plugin:1.0:inject") Mojo
    - ArtifactCoordinatesFactory
    - ...
   ```
   
   ### Proposed fix
   
   Build the mojo injector as a `BridgeInjectorImpl` that consults Sisu only 
for keys it has no binding for. A plain merge, as core's bridge does, is not 
enough: Sisu beans always rank above the injector's own bindings, so the 
`Project`, `MojoExecution` and `Log` that `MojoExecutionScopeModule` binds in 
every plugin realm would replace the instances `loadV4Mojo` binds, and fail 
with `Cannot access Project outside of a scoping block` outside a mojo 
execution scope. A PR with the test follows. #12576 changes the same lines of 
`loadV4Mojo`.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to