我认为同时使用 --classpath
和 --module-path
选项是不违规的。即使在没有明确指定类路径的情况下,也可以同时使用两者,因为它会默认为当前目录。
来自 javac -help
消息和 javac 工具文档的详细信息 -
--module-path <path>, -p <path>
指定应用程序模块所在的位置
--class-path <path>, -classpath <path>, -cp <path>
指定用户类文件和注解处理器的位置。
如果未指定--class-path
、-classpath
或-cp
,则用户类路径为当前目录。
编辑:感谢@MouseEvent指出问题中可能遗漏的部分
但是如果不将它们设置为自动模块,只需在--module-path旁边指定--class-path some.jar,则javac似乎会忽略claspath并引发“找不到包yyy”和其他“找不到”错误。
如果不将它们设置为自动模块,则会被视为模块系统的未命名模块,并且 -
实际上,具有名称的模块甚至不能声明对未命名模块的依赖关系。这个限制是有意的,因为允许具有名称的模块依赖于类路径的任意内容会使可靠的配置变得不可能。
此外,未命名模块导出其所有包,因此自动模块中的代码将能够访问从类路径加载的任何公共类型。
但是,自动模块使用类路径中的类型不能将这些类型公开给依赖于它的显式模块,因为显式模块无法声明对未命名模块的依赖关系。
如果显式模块com.foo.app
中的代码引用com.foo.bar
中的公共类型的签名引用仍然在类路径上的一个JAR文件中的类型,则com.foo.app
中的代码将无法访问该类型,因为com.foo.app
不能依赖于未命名模块。
可以通过暂时将com.foo.app
视为自动模块来解决此问题,以便其代码可以访问来自类路径的类型,直到将类路径上的相关JAR文件视为自动模块或转换为显式模块的时间到来。