Here's a quick patch that does the split: https://gist.github.com/mcculls/d22f01b0e380fdd9f9e2ac1e1bba7dd0
With these changes I get the following output: mvn validate [INFO] extension generated information: Build started at 1612479700634 [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building maven demo 0 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-demo-mojo:0:info (demo) @ maven-demo --- [INFO] Information: Build started at 1612479700634 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.108 s [INFO] Finished at: 2021-02-04T23:01:40Z [INFO] Final Memory: 9M/309M [INFO] ------------------------------------------------------------------------ On Thu, 4 Feb 2021 at 22:46, Stuart McCulloch <mccu...@gmail.com> wrote: > Yes it's down to classloading - the extension and plugin have different > classloaders and the InfoHolder class loaded by the extension is different > to the one loaded by the plugin. They may share the same name and have the > same original bytecode, but they were defined by different classloaders. > You can see this by adding a constructor to InfoHolder and printing out its > classloader (you can also print the class' hashcode to show it really is a > different class, just with the same name.) > > To share the extension class with the plugin you'll need to add an > extension descriptor to the jar: > > https://maven.apache.org/ref/3.6.0/maven-core/extension.html > > But you'll also need to solve a second issue which comes down to the fact > you're using the same jar as an extension and a plugin - the component > metadata is going to be registered in both places, which will still lead to > two separate copies (each component will be a singleton in its own 'realm' > governed by the component metadata.) > > I would recommend using two separate projects - one for the extension and > one for the plugin. The extension project will have the component and > the extension descriptor, while the plugin project will just have the mojo > and depend on the extension project. > > > On Thu, 4 Feb 2021 at 20:40, Matthieu Brouillard <matth...@brouillard.fr> > wrote: > >> Hum some words have disappeared from my previous mail. >> The project URL is https://github.com/McFoggy/maven-jsr330-demo >> <https://github.com/McFoggy/maven-jsr330-demoYou>. >> And the corrected sentence is: You will see that the project is simple... >> Sorry for the double post. >> >> >> On Thu, Feb 4, 2021 at 9:27 PM Matthieu Brouillard < >> matth...@brouillard.fr> >> wrote: >> >> > Hi all, >> > >> > As I was trying to cleanup & simplify my plugins by moving to JSR330, I >> > came across a weird use case in which a `@Singleton` object exists >> multiple >> > times (several instances) during the build: >> > - it is first used by an extension, to store some value >> > - then used in a mojo to retrieve and print the value >> > >> > Before opening an issue, I wanted to be sure that I did not make some >> > errors in the simplified project and that my expectations of how it >> should >> > work are OK. >> > >> > I pushed a simplified project with README here: >> > https://github.com/McFoggy/maven-jsr330-demoYou will that the project >> is >> > simple: >> > - the @Singleton information store >> > - the extension filling the store >> > - the mojo >> > >> > Thanks for any enlightenment. >> > >> > PS: can the issue come from different classloaders being probably used? >> > >> > Matthieu >> > >> >