Java中的modulepath环境变量与CLASSPATH类似。

3
在以前的Java版本中,如果你有一个自定义包org.mypackage,并且在Windows上使用目录结构,例如:
D:\myprogram\
      |
      ---> org\  
            |
            ---> mypackage\
                     |
                     ---> HelloWorld.class       
                     ---> SupportClass.class   
                     ---> UtilClass.class     

你可以使用CLASSPATH环境变量让JVM意识到该包存在。
例如:
set CLASSPATH=D:\myprogram

在最新版本的Java中,set MODULEPATH 命令是否使JVM能够识别用户定义模块的位置?

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

1个回答

1

不,jdk不会读取任何MODULEPATH环境变量或类似的变量。

MODULEPATH只存在于命令行参数--module-path中,但不存在于环境变量中。

请参见http://mail.openjdk.java.net/pipermail/jigsaw-dev/2016-September/009345.html

与CLASSPATH不同的是,没有相应的MODULEPATH来从命令行获取选项。

还可以查看链接问题Is it possible to mix --class-path and --module-path in javac (JDK 9)?以获取有关这两个路径之间差异的更多详细信息。

如果将普通jar放在模块路径上,则它会成为自动模块,导出其包(并将这些包保留给自身)。

虽然您可以将任何普通的jar文件放入MODULEPATH中,但有一个限制:如果2个jar文件包含相同的包,则Java将不允许将它们都放在modulepath中。 这就是为什么Java仍然具有classpath,因为一些现有的jar文件仍具有重叠的包,并且不可能将它们全部放在MODULEPATH中。必须先清理它们。

在遥远的未来,当所有库都已迁移到模块(或进行了清理)时,也许可以删除classpath。


使用MODULEPATH环境变量是否真的只能与显式模块一起使用?我期望非模块化的JAR文件能自动成为模块。 - Slaw
我认为你是正确的,谢谢。 - tkruse
1
“在遥远的未来,当所有库都已迁移到模块时”是什么意思? - Mahamed Ducale
这意味着未来Java可能只会使用MODULEPATH,而不是两者都用。但目前尚不清楚哪个Java版本将采用这种方式。 - tkruse
1
似乎只有在设置为命令行选项时才能正常工作(例如,java -p)。使用set module-path/modulepath/module_path无法正常工作。也就是说,在通过set进行设置后,我运行了java -m <module-name>/<class-name>,但它显示“启动层初始化期间发生错误。java.lang.module.FindException ...” - Dheeru Mundluru
同@DheeruMundluru的评论,我也找不到任何关于MODULEPATH变量的参考资料:https://docs.oracle.com/javase/9/tools/java.htm#JSWOR624 - pinkston00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接