Hi All,

I’ve found what I believe could (or should) be considered a bug with the way 
the ServiceLoader interacts with the classpath in JDK 9.  Consider the 
following code:

====================
package example;

import java.util.ServiceLoader;

public class Main {
    public static void main(String[] args) {
        ServiceLoader.load(MyService.class).forEach(s -> System.out.println(s + 
" : " + s.getClass().hashCode()));;
    }
}
====================

where MyService is an empty interface and MyServiceImpl is an associated empty 
implementation.  If we JAR the compiled results up with a suitable services 
declaration and then make two copies of the resultant jar the following 
behaviors are seen:

[cdennis@Chriss-MacBook-Pro services-test]$ /usr/libexec/java_home -v 1.8 -exec 
java -showversion -cp one.jar:one.jar example.Main
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)

example.MyServiceImpl@16b98e56 : 2129789493

[cdennis@Chriss-MacBook-Pro services-test]$ /usr/libexec/java_home -v 1.8 -exec 
java -showversion -cp one.jar:two.jar example.Main
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)

example.MyServiceImpl@16b98e56 : 2129789493

[cdennis@Chriss-MacBook-Pro services-test]$ /usr/libexec/java_home -v 9 -exec 
java -showversion -cp one.jar:one.jar example.Main
java version "9-ea"
Java(TM) SE Runtime Environment (build 9-ea+159)
Java HotSpot(TM) 64-Bit Server VM (build 9-ea+159, mixed mode)
example.MyServiceImpl@6108b2d7 : 1449621165

[cdennis@Chriss-MacBook-Pro services-test]$ /usr/libexec/java_home -v 9 -exec 
java -showversion -cp one.jar:two.jar example.Main
java version "9-ea"
Java(TM) SE Runtime Environment (build 9-ea+159)
Java HotSpot(TM) 64-Bit Server VM (build 9-ea+159, mixed mode)
example.MyServiceImpl@6bf256fa : 357863579
example.MyServiceImpl@1a407d53 : 357863579

Since I’m not using the module path here (and neither of my jars are modular) I 
would expect to see the same behavior from JDK 9 as I get in 8 (and as is 
specified in both Javadocs):

"If a particular concrete provider class is named in more than one 
configuration file, or is named in the same configuration file more than once, 
then the duplicates are ignored. The configuration file naming a particular 
provider need not be in the same JAR file or other distribution unit as the 
provider itself. The provider must be visible from the same class loader that 
was initially queried to locate the configuration file; note that this is not 
necessarily the class loader from which the file was actually loaded.”

This will obviously cause confusion for anyone using the ServiceLoader to load 
singleton services who is not currently in total control of their classpath.  
Dependencies that are both present and shaded would cause a problem for example.

Thanks,

Chris Dennis

Reply via email to