Hi Cyrille, Does the loadAllConfigClasses() method work properly if the the neo4j jar is not embedded but rather in a bundle by itself?
Best regards, David On Wed, 18 Sep 2019 at 12:59, Cyrille Duret <cdu...@gmail.com> wrote: > Hello, > I want to embedd neo4j in a bundle A, and create an graph database in a > bundle B. > > Neo4j kernel artifact relies heavily on SPI mechanism for exposing config > properties so I use SPI Fly to mediate the java ServiceLoader : > <dependency> > <groupId>org.apache.aries.spifly</groupId> > <artifactId>org.apache.aries.spifly.dynamic.bundle</artifactId> > <version>1.2.3</version> > </dependency> > > > My bundle A config : > > <Embedd-Dependency> > .. > *;groupId=org.neo4j;artifactId=neo4j-kernel;inline=META-INF/services/*, > .. > </Embedd-Dependency> > <SPI-Provider>*</SPI-Provider> > <Export-Package> > ..org.neo4j.configuration;version=${neo4j-version}, > ..</Export-Package> > > > My bundle B config : > > <Import-Package> > .. > org.neo4j.configuration;version=${neo4j-version}, > .. > </Import-Package> > <SPI-Consumer>*</SPI-Consumer> > > > In my B activator start method : > import org.neo4j.configuration.LoadableConfig; > .. > ServiceLoader<LoadableConfig> serviceLoader = > ServiceLoader.load(LoadableConfig.class); > Iterator<LoadableConfig> it = serviceLoader.iterator(); > // I can see all exposed config from bundle A > while( it.hasNext() ) { > final LoadableConfig config = it.next(); > System.out.println("-> "+config); > } > > // The call from this static method does not return any config > List<LoadableConfig> configs = LoadableConfig.allConfigClasses(); > System.out.println("configs from LoadableConfig => "+configs.size()); > > > the org.neo4j.configuration.LoadableConfig.allConfigClasses method which > is embedded in A has the following implementation : > static List<LoadableConfig> allConfigClasses() > { > return Iterators.stream( ServiceLoader.load( LoadableConfig.class > ).iterator() ).collect( Collectors.toList() ); > } > > I do not understand why the allConfigClasses() method does not see the > exposed SPI services and why my ServiceLoader.load snippet code does. > I have noticed that if I added <SPI-Consumer>*</SPI-Consumer> to A, the > LoadableConfig.allConfigClasses does indeed work. > > Anyone can explain me why the static method does not work in the first > place and why it does when adding <SPI-Consumer>*</SPI-Consumer> to A ?? > > thank you > Cyrille > >