【问题标题】:modulepath environment variable in Java similar to CLASSPATH [duplicate]Java中的modulepath环境变量类似于CLASSPATH [重复]
【发布时间】:2019-10-14 15:36:15
【问题描述】:

在以前的 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 命令仍然存在?它现在有什么用途?

【问题讨论】:

    标签: java java-9 java-platform-module-system module-path


    【解决方案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仍然有类路径,因为几个现有的jar文件仍然有重叠的包,不可能把它们都放在MODULEPATH上。他们必须先清理干净。

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

    【讨论】:

    • 使用MODULEPATH 环境变量真的只适用于显式模块吗?我希望非模块化 jar 成为自动模块。
    • 我认为你是对的,谢谢。
    • “在遥远的未来,当所有库都迁移到模块时”是什么意思?
    • 这意味着有一天java可能只使用MODULEPATH,而不是两者。但尚不清楚哪个 Java 版本会这样做。
    • 它似乎只有在设置为命令行选项(例如 java -p)时才有效。它不适用于 set module-path/modulepath/module_path。那是在通过 set 设置之后,我运行 java -m / 并显示“启动层初始化期间发生错误。java.lang.module.FindException ...”
    猜你喜欢
    • 2015-11-02
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 2011-02-05
    相关资源
    最近更新 更多