java - 什么被认为是 Java 核心模块?

标签 java module classloader java-9 java-platform-module-system

我正在通读 JDK9 release notes并发现信息不足。

其中一段,写着:

The classes in many non-core modules are now defined to the platform class loader rather than the boot class loader. This may impact code that creates class loaders with null as the parent class loader and assumes that all platform classes are visible to the parent class loader.

基于这一段,我试图找出 Java 中什么是核心模块和非核心模块,但找不到任何答案。

我还尝试运行一个简单的程序来检查来自不同模块的类的类加载器,但到目前为止有时它返回 null (这意味着 boot 类加载器)有时它返回 PlatformClassLoader

我不想手动检查所有模块。是否有一些被认为是核心和非核心的模块列表?

谢谢。

最佳答案

手动检查所有模块很容易,使用 ModuleLayer.boot().modules()
为了完整起见,您还应该在命令行上添加 --add-modules=ALL-MODULE-PATH VM 选项:

public class ModuleCL {
    public static void main(String[] args) {
        Map<ClassLoader, Set<Module>> moduleMap = new HashMap<>();
        for (var m : ModuleLayer.boot().modules()) {
            ClassLoader cl = m.getClassLoader();
            Set<Module> modules = moduleMap.computeIfAbsent(cl, __ -> new HashSet<>());
            modules.add(m);
        }
        for (var e : moduleMap.entrySet()) {
            System.out.println(e.getKey());
            for (var m : e.getValue()) {
                System.out.println("    " + m);
            }
        }
    }
}

使用 Java 18 在(我的机器)上输出:

null
    module java.rmi
    module java.xml
    module java.datatransfer
    module jdk.nio.mapmode
    module jdk.jfr
    module jdk.naming.rmi
    module java.naming
    module java.management.rmi
    module jdk.net
    module jdk.management.jfr
    module java.management
    module java.logging
    module jdk.sctp
    module java.security.sasl
    module jdk.management.agent
    module java.instrument
    module jdk.unsupported
    module java.base
    module java.desktop
    module java.prefs
    module jdk.management
jdk.internal.loader.ClassLoaders$PlatformClassLoader@2f2c9b19
    module java.net.http
    module java.transaction.xa
    module jdk.dynalink
    module java.scripting
    module jdk.crypto.mscapi
    module jdk.crypto.ec
    module jdk.localedata
    module jdk.security.jgss
    module jdk.jsobject
    module java.security.jgss
    module java.sql.rowset
    module jdk.accessibility
    module jdk.zipfs
    module java.xml.crypto
    module java.sql
    module jdk.naming.dns
    module jdk.charsets
    module java.smartcardio
    module java.compiler
    module jdk.security.auth
    module jdk.xml.dom
    module jdk.httpserver
    module jdk.crypto.cryptoki
jdk.internal.loader.ClassLoaders$AppClassLoader@1d44bcfa
    module jdk.attach
    module jdk.internal.le
    module jdk.jpackage
    module jdk.internal.opt
    module jdk.jdeps
    module jdk.compiler
    module jdk.jartool
    module jdk.javadoc
    module jdk.internal.ed
    module jdk.jlink
    module jdk.internal.jvmstat
    module jdk.editpad
    module jdk.random
    module jdk.jdwp.agent
    module jdk.jshell
    module jdk.unsupported.desktop
    module jdk.jconsole
    module jdk.jstatd
    module jdk.jdi

This file defines the mapping of the different modules to the different loaders

关于java - 什么被认为是 Java 核心模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72927583/

相关文章:

python - 类型错误 : Error when calling the metaclass bases module

python - 如何组织GAE Modules app结构和代码?

memory-leaks - 如何诊断 Java 8 元空间泄漏?

java - 动态包含 HTML 页面会出现页面未找到错误

android - 使用位图工厂选项支持多个屏幕?

java - 使用来自 Eclipse 的 JDBC 的 DB2 连接问题

tomcat - 为所有 webapps 定制 webapp 类加载器

java - 为什么 jrunscript 不支持我的类路径?

java - XPages 应用程序无法运行

java - Execute ApplciationRunner run only in dev profile