我相信使用--classpath
和--module-path
选择在同一时间并不违法。即使没有明确指定类路径默认值到当前目录,也可以同时使用两者。从javac -help
消息
细节和javac tools docs -
--module-path <path>, -p <path>
指定查找应用模块
--class-path <path>, -classpath <path>, -cp <path>
指定查找用户类文件和注释处理器
如果--class-path
,-classpath
或-cp
未指定,则用户 类路径为当前目录。
编辑:感谢@MouseEvent,我可能错过了部分问题
但是,如果不使它们自动模块仅仅指定 --class - path some.jar紧挨着--module-path,然后javac似乎忽略了claspath并抛出了“未找到包yyy” 和其他“未找到”错误。
如果你没有让他们自动的,它视为一个Module System's unnamed module和 -
命名模块不能,其实连申报于 无名模块依赖。这种限制是有意的,因为允许命名为 的模块依赖于类路径的任意内容,因此 不可能进行可靠的配置。
此外,无名模块导出所有包,因此在一个自动模块的代码将能够访问来自类路径加载的任何公开的类型。
但是,使用来自类路径的类型的自动模块不能将这些类型暴露给依赖它的显式模块,因为显式模块无法声明对未命名模块的依赖关系。
如果显式模块com.foo.app
代码是指一个公共型 在com.foo.bar
,例如,以及该类型的签名是指 类型的JAR文件仍然类路径上一个,然后com.foo.app
中的代码 将无法访问该类型,因为 com.foo.app
不能依赖未命名的模块。
这可以通过处理com.foo.app
作为自动模块暂时使得其代码可以从类路径访问的类型,直到这样的时间作为类路径上的相关的JAR文件来补救可以被视为一种自动模块或转换为显式模块。
有可能混合两者,你可以分享一个我们可以验证的最小例子吗? –
*我可以理解,在同一(编译)时间使用--class-path和--module-path是非法的,*为什么会这样呢? – nullpointer
混合是绝对合法的。但是,模块化jar无法在类路径中引用非模块化jar。自动模块(模块路径上的非模块化jar)充当桥接器:模块化jars_can_引用它们,自动模块可以读取类路径。 –