FYI, One thing few people realize is that Service Loader Mediator does allow your providers to be consumed via the service registry.
If you use the bnd SPI annotations I already mentioned this is a default behavior. - Ray On Thu, May 21, 2020 at 9:19 AM Raymond Auge <raymond.a...@liferay.com> wrote: > Another alternative designed specifically for this scenario is the OSGi > Service Loader Mediator Specification [1]. > > Java's default _service_ mechanism is Service Loader SPI. The Service > Loader Mediator Specification adds a veneer of pure metadata over this to > allow it to function in OSGi. > > There are even SPI annotations [2] in the Bnd project to help with this > (you should be able to use these with the maven-bundle-plugin if necessary). > > In this way the code is exactly 100% identical in OSGi and outside it. > > Sincerely, > - Ray > > [1] > https://docs.osgi.org/specification/osgi.cmpn/7.0.0/service.loader.html > [2] https://bnd.bndtools.org/chapters/240-spi-annotations.html > > On Thu, May 21, 2020 at 3:54 AM Neil Bartlett via osgi-dev < > osgi-dev@mail.osgi.org> wrote: > >> Along the lines of Bernd's answer, here is what I do: >> >> 1. Use declarative services. >> 2. For injection of service references, prefer constructor injection. >> 3. The component implementation should be in a private package. However, >> non-OSGi consumers don't know anything about exported versus private >> packages, so they just directly instantiate the DS component instance. >> Because we used constructor injection, it's clear what dependencies >> they need to provide to the component. >> 5. If there is a need to interact with OSGi's APIs (e.g. BundleContext), >> keep that code in a separate factory component. Put this code in a separate >> class from the "business logic". Don't necessarily worry about using a >> separate package for this... because Java ClassLoading is extremely lazy, >> non-OSGi consumers will only be exposed to the OSGi-specific code if they >> go out of their way to load it. >> >> On Thu, 21 May 2020 at 01:50, Bernd Eckenfels via osgi-dev < >> osgi-dev@mail.osgi.org> wrote: >> >>> Hello, >>> >>> We typically use declarative services (DS) with the Maven bundle plugin >>> and Annotations. This leaves no (optional) OSGi framework dependency and >>> still allows a compliant container to manage the lifecycle of the component. >>> >>> In some (rare) cases when you have to deal with service references or >>> OSGi context and you need the core API it does also not hurt to make it >>> optional, as long as the class which uses it (and would not resolve) is not >>> used by the stand alone code. This is typically the case for OSGi first >>> components which are made compatible with stand alone unit tests. >>> >>> You can even have the factory receive the service, and therefore be >>> useable inside the runtime. >>> >>> An alternative is, to just have the bundle headers and no service, this >>> is still useful to OSGi code in many instances where you don't have a >>> service lifecycle. >>> >>> Gruss >>> Bernd >>> -- >>> http://bernd.eckenfels.net >>> ------------------------------ >>> *Von:* osgi-dev-boun...@mail.osgi.org <osgi-dev-boun...@mail.osgi.org> >>> im Auftrag von David Leangen via osgi-dev <osgi-dev@mail.osgi.org> >>> *Gesendet:* Thursday, May 21, 2020 12:44:04 AM >>> *An:* osgi-dev@mail.osgi.org <osgi-dev@mail.osgi.org> >>> *Betreff:* [osgi-dev] Library development >>> >>> Hi! >>> >>> What is the best way to prepare a library to OSGi-compatible, but not >>> force the use of OSGi (including forcing transitive dependencies)? >>> >>> The library should be split into api / implementation and offered as a >>> service, but it should be possible for those who do not use OSGi to obtain >>> the implementation class from a factory. There should be no runtime >>> dependency on the OSGi framework. >>> >>> Are there any good examples out there that I could try to emulate? >>> >>> If not, can anybody provide me with some advice? >>> >>> My thought is to have: >>> >>> 1. A public api package (for all cases) >>> 2. A private “factory” package (which for OSGi users would just be >>> private and ignored, and for non-OSGi users would be the part of the >>> library they would use to obtain the service class), and >>> 3. An “internal” package that includes an Activator (in an OSGi >>> environment this would provide the service implementation, for non-OSGi >>> users it would be ignored). >>> >>> >>> Thanks so much!! >>> >>> Cheers, >>> =David >>> >>> >>> _______________________________________________ >>> OSGi Developer Mail List >>> osgi-dev@mail.osgi.org >>> https://mail.osgi.org/mailman/listinfo/osgi-dev >>> _______________________________________________ >>> OSGi Developer Mail List >>> osgi-dev@mail.osgi.org >>> https://mail.osgi.org/mailman/listinfo/osgi-dev >> >> _______________________________________________ >> OSGi Developer Mail List >> osgi-dev@mail.osgi.org >> https://mail.osgi.org/mailman/listinfo/osgi-dev > > > > -- > *Raymond Augé* <http://www.liferay.com/web/raymond.auge/profile> > (@rotty3000) > Senior Software Architect *Liferay, Inc.* <http://www.liferay.com> > (@Liferay) > -- *Raymond Augé* <http://www.liferay.com/web/raymond.auge/profile> (@rotty3000) Senior Software Architect *Liferay, Inc.* <http://www.liferay.com> (@Liferay)
_______________________________________________ OSGi Developer Mail List osgi-dev@mail.osgi.org https://mail.osgi.org/mailman/listinfo/osgi-dev