Guess that theorically there is room for a new generic plugin system but I would mention a few points:
1. log4j one is not yet a good *generic* one for multiple reasons but the biggest blocker for me is that it is slow (slower than a plain IoC as of today, even dropping some legacy parts) - there is a ticket about it but we are still slower than a plain CDI container even if it is way better than 2.x on 3.x branch 2. Most naturally you want your plugin system to integrate your IoC (spring, CDI, guice, ...) - to get injections, same bean pattern than your IoC/app, extensions, .... If we go with log4j system then we must do bridges which are quite useless in practise so it is an abstraction you will fight against instead of leveraging. 3. If there is a community around this project then it fits apache so it can go but I think it belongs better to incubator and not commons Hope it makes sense 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 ven. 8 avr. 2022 à 09:23, Peter Verhas <pe...@verhas.com> a écrit : > Thanks Ralph for the detailed explanation. I appreciate it and now I see > the points. > > I have never experienced an application where class loading time was an > issue, and I understand that it can really be. > I have never experienced a setup where there were a lot of "plugin" classes > on the classpath or on the modulepath that were never loaded by the > application. > > We still are not on the same page about module systems. I am happily using > it in all of my new projects and my experience is mixed. I accept the > struggle that it takes to make it properly, like opening the packaged via > command line options for testing purposes. On the other hand the structure > and the encapsulation is one step better than without JPMS. > > >But since you don’t want to look at he Log4j plugin system > > I did have a look at it to some level, as I also mentioned it in my > previous mail. I am not an expert in that field as you are and I never > will, and that is what I do not want to be. > > I accept that there is room for a commons-plugin project. The project has > to address these questions to be on the right track (not to me, to the > project itself): > > - How will it be a "plugin" project and not another dependency injection > framework? > - What will distinguish it from module systems, like OSGi and what will > stop it from becoming another OSGi by the years as new features get added > to the library. > - What applications using plugins are the examples for different solutions? > (Log4j is a good example to show that there is a need, you also explained > patiently why it is not a simple ServiceLoader, but it is only one way to > solve it. Other applications may approach the issue differently. Maven, > Attlassian products, other build tools, JUnit 5 and so on.) > - Based on the gathered knowledge on the previous point, what is the high > level architecture of a plugin system the library will support and what > services will it provide? > > > > > > On Thu, Apr 7, 2022 at 7:57 PM Ralph Goers <ralph.go...@dslextreme.com> > wrote: > > > > > > > > On Apr 7, 2022, at 2:52 AM, Peter Verhas <pe...@verhas.com> wrote: > > > > > > > > >> I would suggest that before responding to this email that > > >> you go look at how log4j-plugins is implemented in the master branch. > > >> > > > > > > Sure, if you propose to create a commons-plugin library that is an > > extract > > > of the plugin handling of log4j so that log4j next releases do not need > > to > > > keep the functionality inside log4j but rather as a dependency on this > > new > > > library. On the other hand, if the goal is to create something that is > > > useful generally then we should look at other solutions as well. > > > > It remains to be seen whether Log4j would replace log4j-plugins with > > Commons-plugins. The point of looking at Log4j was to understand the > > problem it is solving and how it solves it. > > > > > > > > > > > > >> From this it is clear that you completely misunderstand what the > plugin > > >> system is doing. > > >> > > > > > > That may really be very much true. > > > > > > > > >> First, the plugin system DOES use ServiceLoader. In fact, Log4j uses > > >> ServiceLoader > > >> in at least 7 different places. For one, it uses ServiceLoader to > locate > > >> the Log4j > > >> implementation similar to how SLF4J does (although Log4j implemented > it > > >> prior to SLF4J). > > >> > > >> Consider that you have 150 or so plugins, of which maybe only 10 will > > get > > >> used. But > > >> you don’t know beforehand which 10. ServiceLoader would have to load > all > > >> 150 classes. > > > > > > > > > Not. It does not need to create instances of all of them. This is > what I > > > explained, and this is the reason why I explained it. JPMS or not, the > > new > > > ServiceLoader used by Java 9 and later will call the static factory > > method > > > of the class if that exists. Then the plugin can decide if it wants > > itself > > > to be instantiated or not. Somewhere there should be some logic that > > > filters 10 from the 150. If that is in a central place implementing > some > > > industry-best-practice configuration based algorithm, or outsources the > > > decision to the plugins themselves should not make a big difference in > > > performance. > > > > > > On the second though, instantiating 150 lightweight classes must not > be > > a > > > big burden. The ServiceProvider JavaDoc documentation suggest that > > services > > > should be implemented as proxies or factories instantiating their real > > > working class lazily in case the instantiation is costly. > > > > Class loading in general is slow. Perhaps not to you but we have > customers > > who > > complain about all the things we do during startup and locating and > > instantiating > > plugins is one of them. When we first switched to use the ServiceLoader > we > > attempted to load the plugin classes simply by having the plugin > > definition include > > the Class.Performance was very bad. We now only include the class name > and > > only access the Class when absolutely necessary. > > > > Again, if you think about what the Plugin Manager is doing, it is using > > ServiceLoader > > to find all Plugin Service instances. Each of these contains the > > definitions of all the > > plugins. The Plugin Manager then uses these to create the actual plugins. > > So in > > essence, the services are used as part of the factory. Note that > decisions > > about > > whether to load a plugin or not do not have to be made when the plugin > > service > > s accessed. That is deferred until the Plugin actually needs to be wired. > > > > > > > > > > >> This is indeed very slow. Yes we have benchmarked it. But the Plugin > > >> system IS a > > >> Java Service. So instead, you need to only load 1 class for every jar > > that > > >> contains plugins. > > >> The result is that you only need to load 4 or 5 classes. This is > > >> considerably faster. > > >> > > > > > > Yes, this is the approach where you insert another layer above the > > service > > > loader that does part of the job that the service loader can also do > in a > > > different way. Essentially you let the plugin libraries, each > containing > > > several plugin classes to implement their own service loaders. > > > > Sort of. With Log4j’s plugin system Plugins are not aware of > ServiceLoader > > at all. Other than that, it behaves the way you are describing. > > > > > > > > > > >> In addition, services loaded by ServiceLoader are singletons. > > > > > > > > > No, they are not. Every ServiceLoader instance will create new > instances, > > > and even a single ServiceLoader can be asked calling the `reload()` > > method > > > to evict the instances from its cache and create new instances. > > > > Umm. Even calling reload() doesn’t change it from being a singleton. You > > can > > only have a single instance at a time. > > > > Yes, I suppose if you use multiple ServiceLoader instances then you can I > > nstantiate multiple instances of the service. However, as you noted that > > wouldn’t > > be the best practice since the ServiceLoader really should be > > instantiating a > > factory that create as many instances as you want. > > > > > > > > Perhaps developing a commons-plugin system is a good point to require > > > application developers and plugin developers to use the module system. > > > > Please no. I would never encourage anyone to use it. It has caused > nothing > > but pain. Yes, that is opinion, but opinion based on experience. > > > > > > > > > > >> Again, I would suggest you look at the log4j-plugins implementation > > before > > >> making sweeping statements such as this. > > >> > > > > > > I am not an expert about log4j and the plugin system of it,which you > are. > > > From this distance it seems that log4j uses factories for the plugins > as > > > services or builders in case there is a need for some configuration. In > > > case of the builders the configuration parameters are injected that way > > > this plugin system implements a simple DI framework like Plexus, Pico, > > > Guava, Spring instead of using one. With the factory approach it does > the > > > same as the JDK ServiceLoader calling the `provider()` method. > > > > > > Again, if you find that answering the questions is difficult there may > be > > > several reasons. One thing is for sure: I am not trolling you. I am > > asking > > > these questions because I honestly believe that any new library should > > > address the things that are not addressed by other systems and > libraries, > > > and should provide a better way to do things, otherwise they will not > be > > > widely used. > > > > > > Frankly, I don’t think there is more to discuss. You asked why not just > > use > > ServiceLoader. But you have pretty much conceded that vanilla > > ServiceLoader > > by itself is not a good plugin system. You have agreed that using > > ServiceLoader > > to load factories is pretty much necessary. But since you don’t want to > > look at > > he Log4j plugin system to see how it makes creating plugins easy it is > > hard to > > discuss how it achieves the goals beyond just using ServiceLoader to load > > factories. > > > > Ralph > > > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org > > For additional commands, e-mail: dev-h...@commons.apache.org > > > > > > -- > Peter Verhas > pe...@verhas.com > t: +41791542095 > skype: verhas >