我相信同时使用--classpath
and--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 文件可以被视为自动模块或转换为显式模块。