为了消除 IntelliJ 逻辑,我从我的模块(1、2 和 4)构建了 3 个 JAR,并开始在命令行中使用 java 来玩弄它们。
当我尝试仅使用 -cp 选项执行代码时,它具有与 module4 能够访问 pkg2 相同的行为 -> 这让我得出结论,如果 IntelliJ 模块中没有 module-info.java 文件,它使用类路径。
这是棘手的部分:我使用了 --list-modules 选项来确保 module4 的自动名称是 module4。然后我执行了类似的操作:
java -p "<module1 path>;<module4 path>" -m module4/<MainClass>
我在 pkg1 (导出的包)的一个类上有一个 ClassNotFoundException。
如果我执行:
java -p "<module1 path>;<module2 path>" -m module2/<MainClass>
然后一切正常。
所以看起来如果我们想使用模块路径,主类必须来自模块 JAR。
看起来,自动 JAR 是为了向后兼容,以便我们能够将它们用作新模块的依赖项。
但是,如果要使用模块路径执行模块,Java 假定我们正在执行的 JAR 是模块化 JAR,否则我们应该继续使用类路径。
换句话说,如果我们使用 -p (modulepath) 选项执行一个未模块化的 JAR,它将不需要路径中的其他模块。
所有这些结论都来自于玩 Java,有人能指出它背后的确切理论部分吗?