java模块:提供。。。使用don';在webapp中不起作用

java模块:提供。。。使用don';在webapp中不起作用,java,module,Java,Module,我正在做一个基于Java模块的项目。我有一个父项目(pom项目),它包含其他模块、war模块和一些jar模块。 我想知道一个模块是一个提供者,所以我在一个模块中定义了一个提供者类,它将在另一个模块中使用。 在webapplication的应用程序启动期间,定义如下: @WebListener 公共类ServletContext实现ServletContextListener。。 我想获取模块提供的所有服务的列表,因此我使用了以下命令: ServiceLoader服务=ServiceLoader

我正在做一个基于Java模块的项目。我有一个父项目(pom项目),它包含其他模块、war模块和一些jar模块。 我想知道一个模块是一个提供者,所以我在一个模块中定义了一个提供者类,它将在另一个模块中使用。 在webapplication的应用程序启动期间,定义如下:

@WebListener
公共类ServletContext实现ServletContextListener。。
我想获取模块提供的所有服务的列表,因此我使用了以下命令:

ServiceLoader服务=ServiceLoader.load(MyClass.class);
不幸的是,此指令无法检索任何服务

所以,我做了一个新项目,并试图了解我是否犯了一些错误。在新项目中,ServiceLoader.load工作正常。在本例中,我没有使用servlet来测试它,而是通过一个Main类来运行它。 我将这些类放入我的原始项目中,并尝试使用Main类运行它们,然后再次使用ServiceLoader.load正常工作

当我从web类
ServletContext
调用
ServiceLoader.load时,它似乎不起作用

我正在使用Java11,Tomcat9.0.40


是否有人已经面临过这个问题?

您可以在类路径中拥有一个文件,就像

src
|-- main
    |-- resources
        |-- META-INF
            |-- services
                |-- org.apache.logging.log4j.util.PropertySource       
org.apache.logging.log4j.util.EnvironmentPropertySource
org.apache.logging.log4j.util.PropertySource
替换为您自己的接口名称 文件的内容文本是实现接口的类名,就像

src
|-- main
    |-- resources
        |-- META-INF
            |-- services
                |-- org.apache.logging.log4j.util.PropertySource       
org.apache.logging.log4j.util.EnvironmentPropertySource

您必须确保jar位于
${java.ext.dirs}
的目录中,我也尝试过类似的方法。我会再试一次,我会告诉你我已经按照你的指示做了,但还是不行。我的项目是一个maven项目。当我从Eclipse运行它时,服务列表仍然是空的。