Introduction

JDK 6 introduced ServiceLoader. ServiceLoader loads things based on flat files in the directory META-INF/services from the Java classpath. The mechanism of using META-INF/services has been around since JDK 1.3, under the name of Java Extension Mechanism.

This library aims to provide a backport compatibility of Service Provider Interface APIs to Java5.

To use it, just add the following dependency to your pom.xml:

<dependencies>
  ...
  <dependency>
    <groupId>org.99soft.commons</groupId>
    <artifactId>backport-spi</artifactId>
    <version>XX.XX</version>
  </dependency>
  ...
</dependencies>

or, for systems that have to be compiled in both JDKs 5 and 6, add it in a JDK5 proper profile:

<profiles>
  <profile>
    <id>java-1.5-detected</id>
    <activation>
      <jdk>1.5</jdk>
    </activation>
    <dependencies>
      [...]
      <dependency>
        <groupId>org.99soft.commons</groupId>
        <artifactId>backport-spi</artifactId>
        <version>XX.XX</version>
      </dependency>
      [...]
    </dependencies>
    [...]
  </profile>
</profiles>

Now you can use the backported ServiceLoader:

import java.util.ServiceLoader;
...
ServiceLoader<HelloService> ldr = ServiceLoader.load( HelloService.class );
for ( HelloService provider : ldr )
{
    doSomething( provider );
}

where HelloService is the interface/abstract class of the service.

Discovering Services types only

Starting from 1.0.1 version, the Backport SPI introduces a new feature to allow users to iterate over Service Class iterator, to know only the types which implement the discovered Service:

import java.util.ServiceLoader;
...
ServiceLoader<HelloService> ldr = ServiceLoader.load( HelloService.class );
Iterator<Class<? extends HelloService>> serviceClassIterator = ldr.typesIterator();
while ( serviceClassIterator.hasNext() )
{
    // do something
}