Java中类似于CLASSPATH的modulepath环境变量

Java中类似于CLASSPATH的modulepath环境变量,java,java-9,java-platform-module-system,module-path,Java,Java 9,Java Platform Module System,Module Path,在Java的早期版本中,如果您在windows中有一个具有目录结构的用户定义包org.mypackage D:\myprogram\ | ---> org\ | ---> mypackage\ | ---> HelloWorld.class ---> Supp

在Java的早期版本中,如果您在windows中有一个具有目录结构的用户定义包org.mypackage

D:\myprogram\
      |
      ---> org\  
            |
            ---> mypackage\
                     |
                     ---> HelloWorld.class       
                     ---> SupportClass.class   
                     ---> UtilClass.class     
通过使用CLASSPATH环境变量,可以让JVM知道该包

例如:

set CLASSPATH=D:\myprogram
set MODULEPATH
命令是否会让JVM知道用户定义模块在最新版本Java中的位置


如果是这样的话,为什么classpath命令仍然存在?它现在的用途是什么?

否,jdk不读取任何MODULEPATH环境变量或类似变量

MODULEPATH仅作为命令行参数--module path存在,而不是作为环境变量存在

与类路径不同,没有等效的MODULEPATH来从命令行中获取选项

有关两条路径之间差异的更多详细信息,请参见链接问题

如果在modulepath上放置一个普通jar,它将成为一个自动模块,导出其包(并为自己保留这些包)

虽然可以将任何普通jar文件放入MODULEPATH,但有一个限制:如果两个jar文件包含相同的包,那么java将不允许在MODULEPATH中同时使用这两个文件这就是为什么Java仍然有类路径的原因,因为一些现有的jar文件仍然有重叠的包,并且不可能将它们全部放在MODULEPATH上。必须先把它们清理干净


在遥远的将来,当所有库都迁移到模块(或清理)后,可能可以删除类路径。

使用
MODULEPATH
环境变量真的只适用于显式模块吗?我希望非模块化JAR会成为自动模块。我想你是对的,谢谢。所谓“在遥远的将来,当所有库都迁移到模块中”是什么意思?这意味着有一天java可能只使用MODULEPATH,而不是两者都使用。但目前还不清楚哪个Java版本会这样做,它似乎只有在设置为命令行选项(例如Java-p)时才起作用。它不适用于设置模块路径/modulepath/module_路径。也就是说,在通过set进行设置之后,我运行了java-m/并且它说“在启动层.java.lang.module.FindException的初始化过程中发生了错误…”