What is the purpose of META-INF/services in Java ?
-
Related question: https://stackoverflow.com/q/70216/2987755 – dkb Jan 23 '23 at 11:38
3 Answers
It's intended to store service provider configuration files.
A Service provider is an implementation of a Service Provider Interface packaged as JAR.
A Service loader discover and load all implementations declared in the service provider configuration file.
A configuration file is a file named as the fully qualified name of the interface and its content is a list of fully qualified names of implementations.
Following is an example of provider configuration file for javax.servlet.ServletContainerInitializer that is used by Servlet 3.0 at webapp startup.
org.apache.jasper.servlet.JasperInitializer
org.springframework.web.SpringServletContainerInitializer
In this example
- Tomcat is the Service Loader;
- javax.servlet.ServletContainerInitializer is the Service Provider Interface
- file named javax.servlet.ServletContainerInitializer is the Service Provider configuration file;
- org.apache.jasper.servlet.JasperInitializer and org.springframework.web.SpringServletContainerInitializer are Service providers
When tomcat startup webapp call both
onStartup(java.util.Set<java.lang.Class<?>> types, ServletContext context)
methods on JasperInitializer and SpringServletContainerInitializer classes

- 6,988
- 2
- 25
- 41

- 401
- 4
- 4
Take a look at the ServiceLoader
docs.

- 5,626
- 23
- 31
-
13Whilst this may theoretically answer the question, [it would be preferable](//meta.stackexchange.com/q/8259) to include the essential parts of the answer here, and provide the link for reference. – dan1st Dec 23 '19 at 13:51
Before Java 9, ServiceLoader find the implementations for a Service from the file in META-INF/services which has fully qualified name same as the Service interface. It contain list of fully qualified names of the implementations.
From Java 9 It have modules and modules have module descriptors. Those 'module' can define the services and their implementation that a ServiceLoader could load.

- 519
- 1
- 4
- 10
-
I think this is wrong. META-INF does not contain modules? Can you point to an example where they do? – vab2048 May 02 '22 at 22:04