So clearly -1 for @inject then.

Le mar. 17 mai 2022 à 22:49, Slawomir Jaranowski <[email protected]> a
écrit :

> pon., 16 maj 2022 o 20:44 Romain Manni-Bucau <[email protected]>
> napisał(a):
>
> > Le lun. 16 mai 2022 à 19:14, Slawomir Jaranowski <[email protected]
> >
> > a
> > écrit :
> >
> > > But from other side we can use JSR-330 in Mojo [1]
> > >
> > > so we will:
> > >
> > >    @Parameter( defaultValue = "${project}", readonly = true, required =
> > > true )
> > >     private MavenProject project;
> > >
> > >     @Inject
> > >     public SuperMojo( Jsr330Component component )
> > >     {
> > >     }
> > >
> > > From code perspective will be clear
> > >
> > >     @Inject
> > >     public SuperMojo( MavenProject project, Jsr330Component component )
> > >     {
> > >     }
> > >
> >
> > We can but we just leaked an internal so guess it is not what we must
> > encourage and if we speak about mojo validation layer it should fail with
> > an error IMHO.
> >
> >
> I don't ask about the validation layer.
>
> I want to find the "best practices" for plugin development.
>
> Our site documentation about it [1]  should be refreshed, so I try to
> collect info.
>
> [1] https://maven.apache.org/plugin-developers/index.html
>
>
> >
> > >
> > >
> > > [1] https://maven.apache.org/maven-jsr330.html
> > >
> > > pon., 16 maj 2022 o 18:42 Romain Manni-Bucau <[email protected]>
> > > napisał(a):
> > >
> > > > Hi Sławomir,
> > > >
> > > > This is a complex topic, basically there is a will to get a real IoC
> > for
> > > > maven-core and keep a maven specific API for plugin writers so I'm
> > > tempted
> > > > to say option 1 for mojo.
> > > >
> > > > As a reminder the issues exposing @Inject are:
> > > >
> > > > 1. We can conflict with plugins (it is the case already and a lot of
> > > > servers have to workaround that with custom classloaders)
> > > > 2. We have no guarantee next version of @Inject will be compatible -
> > > there
> > > > is a trend to break at jakarta EE
> > > > 3. When we'll want to migrate to jakarta.inject (or another API)
> we'll
> > > > break all consumers if it is used outside maven project itself
> > > >
> > > > Where this policy has its limitations is that extensions are now kind
> > of
> > > > "plugins" in the sense it should only use a public API but currently
> it
> > > has
> > > > to use internal one (@Inject).
> > > > So while I think option 1 is really the way to go, we probably have
> > some
> > > > work to extend it to extension mid-term and clean the API for maven
> 4.
> > > >
> > > > Hope it helps.
> > > >
> > > > Romain Manni-Bucau
> > > > @rmannibucau <https://twitter.com/rmannibucau> |  Blog
> > > > <https://rmannibucau.metawerx.net/> | Old Blog
> > > > <http://rmannibucau.wordpress.com> | Github <
> > > > https://github.com/rmannibucau> |
> > > > LinkedIn <https://www.linkedin.com/in/rmannibucau> | Book
> > > > <
> > > >
> > >
> >
> https://www.packtpub.com/application-development/java-ee-8-high-performance
> > > > >
> > > >
> > > >
> > > > Le lun. 16 mai 2022 à 18:13, Slawomir Jaranowski <
> > [email protected]
> > > >
> > > > a
> > > > écrit :
> > > >
> > > > > Hi,
> > > > >
> > > > > We can inject Maven components into plugins in many ways ...
> > > > >
> > > > > We can use @Parameter, like:
> > > > >
> > > > >     @Parameter( defaultValue = "${project}", readonly = true,
> > required
> > > =
> > > > > true )
> > > > >     private MavenProject project;
> > > > >
> > > > >     @Parameter( defaultValue = "${session}", readonly = true,
> > required
> > > =
> > > > > true )
> > > > >     private MavenSession session;
> > > > >
> > > > >     @Parameter( defaultValue = "${mojoExecution}", readonly = true,
> > > > > required = true )
> > > > >     private MojoExecution mojoExecution;
> > > > >
> > > > > We can use DI with @org.apache.maven.plugins.annotations.Component
> > > > >
> > > > >     @Component
> > > > >     private MavenProject project;
> > > > >
> > > > >     @Component
> > > > >     private MavenSession session;
> > > > >
> > > > >     @Component
> > > > >     private MojoExecution mojoExecution;
> > > > >
> > > > >
> > > > > We can use DI with @javax.inject.Inject on fields ...
> > > > >
> > > > >     @Inject
> > > > >     private MavenProject project;
> > > > >
> > > > >     @Inject
> > > > >     private MavenSession session;
> > > > >
> > > > >     @Inject
> > > > >     private MojoExecution mojoExecution;
> > > > >
> > > > > And DI with constructor:
> > > > >
> > > > >     @Inject
> > > > >     public SuperMojo( MavenProject project, MavenSession session,
> > > > > MojoExecution execution )
> > > > >     {
> > > > >     }
> > > > >
> > > > > Which way should be preferred, which one to avoid? And why?
> > > > > Can we use DI for all Maven components?
> > > > >
> > > > > --
> > > > > Sławomir Jaranowski
> > > > >
> > > >
> > >
> > >
> > > --
> > > Sławomir Jaranowski
> > >
> >
>
>
> --
> Sławomir Jaranowski
>

Reply via email to