java - ServiceLoader.load 如何与 JPMS 中的类加载器一起工作?

标签 java classloader java-9 java-module

我有两个 JPMS 层:

  • 带有 module A 的引导层由 ClassLoaders$AppClassLoader@4fca772d 加载
  • 带有 module B 的子层提供 cervices 并由 Loader@6b58b9e9 加载
  • Loader@6b58b9e9 的父类加载器是 ClassLoaders$AppClassLoader@4fca772d .

    module A我有以下代码:
    ServiceLoader<ModuleAInterface> sl = ServiceLoader.load(ModuleAInterface.class);
    

    但是,Module B 的服务仅当上下文类加载器为 Loader@6b58b9e9 时才被发现当上下文类加载器为 ClassLoaders$AppClassLoader@4fca772d 时未找到.

    问题 - 是否可以获得 module B 的服务?在 module A不知道 module B 的类加载器在这样的配置中。

    最佳答案

    查看 java.util.ServiceLoader 的代码在 jdk 14(见截图)中,当有多个 ModuleLayer 时,它看起来遵循与类加载相同的逻辑,如 this stackoverflow answer 中所述
    enter image description here
    这意味着 ServiceLoader将首先查看自己的服务ModuleLayer然后在其父 ModuleLayer并以递归方式从 child 继续到 parent

    is it possible to get services of module B in module A without knowing class loader of module B in such configuration.



    但是模块 B 可以看到模块 A 中的服务

    关于java - ServiceLoader.load 如何与 JPMS 中的类加载器一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61139200/

    相关文章:

    java - 在运行时动态添加 jar 文件时出现 NoClassDefFoundError

    java - 在非默认类加载器下运行本地集群

    java - JDK9 : An illegal reflective access operation has occurred. org.python.core.PySystemState

    Java9 导致打包库中的类出现 ClassNotFoundException

    java - jlink --module-path 是有序路径吗?

    java - 使用 spring-data-jpa 中的 PagingAndSortingRepository 获取所有记录

    java - 无法使用 @XmlElementWrapper 解码与父元素具有相同名称的 XML 相同元素列表

    java - 为什么需要更多的类加载器?

    java - Intent Bundle 每次都返回 Null?

    java - JodaTime LocalDate/LocalTime 不使用自定义 JSON 序列化程序类进行解析