当我编译依赖于之前编译过的其他模块的模块时,我必须指定--module-path <directory>选项。这使得我所依赖的模块可见。
但同时,我也想让一些非模块的Jar文件可见。但是,如果不使它们成为自动模块,只需在--module-path <directory>旁边指定--module-path <directory>,那么javac似乎忽略了类路径,并抛出"package“和其他"not”错误。
我可以理解,在同一时间(编译)使用--class-path和--module-path是非法的,但是javac并不以任何方式警告我。
发布于 2017-09-18 22:52:42
您可以并行使用类路径和模块路径,但是有一些细节需要考虑。
依赖模块路径~>类路径
显式模块(模块路径上带有模块描述符的JAR)无法读取未命名的模块(类路径上的JAR)--这是为了防止模块JAR依赖于“类路径的混乱”而进行的。
由于一个模块必须需要它的所有依赖项,而且这些依赖只能由其他命名模块(即类路径上的JAR )实现,所以模块JAR的所有依赖项都必须放在模块路径上。是的,即使是非模块化的罐子,也会被转化为自动模块。
有趣的是,自动模块可以读取未命名的模块,因此它们的依赖项可以在类路径上进行。
依赖类路径~>模块路径
如果您编译非模块代码或从非模块JAR启动应用程序,则模块系统仍在运行,而且由于非模块代码不表示任何依赖项,因此它不会从模块路径解析模块。
因此,如果非模块化代码依赖于模块路径上的工件,则需要使用选项手动添加它们。不一定所有这些,只是那些直接依赖的(模块系统将拉出传递依赖)-或者您可以使用ALL-MODULE-PATH (检查链接的帖子,它将更详细地解释这一点)。
发布于 2017-09-18 21:35:36
我认为同时使用--classpath和--module-path选项是,而不是非法的。即使没有显式指定类路径,也可以同时使用这两种路径,默认为当前目录。
javac -help消息和javac工具文档的详细信息-
--module-path <path>, -p <path>指定在何处查找应用程序模块
--class-path <path>, -classpath <path>, -cp <path>指定查找用户类文件和注释处理器的位置。
如果没有指定
--class-path__、-classpath__或-cp,则用户类路径是当前目录__。
编辑:多亏了@MouseEvent,我可能错过了问题中的部分
但是,如果不让它们成为自动模块,只需在模块路径旁边指定-class-path some.jar,那么javac似乎会忽略类路径,抛出“包yyy”和其他"not“错误。
如果你不让它们自动的话,它就会被视为一个模块系统的未命名模块并且-
事实上,命名模块甚至不能声明对未命名模块的依赖。这种限制是有意的,因为允许命名模块依赖类路径的任意内容将使可靠的配置变得不可能。
此外,未命名的模块导出其所有包,因此自动模块中的代码将能够访问从类路径加载的任何公共类型。
但是,使用类路径中的类型的自动模块不能将这些类型公开给依赖它的显式模块,因为显式模块不能声明对未命名模块的依赖。
如果显式模块
com.foo.app中的代码引用了com.foo.bar中的公共类型,而该类型的签名是指仍在类路径上的JAR文件中的一个类型,那么com.foo.app中的代码将无法访问该类型,因为com.foo.app不能依赖未命名的模块。
这可以通过将com.foo.app临时视为一个自动模块来补救,这样它的代码就可以从类路径访问类型,直到类路径上的相关JAR文件可以被视为一个自动模块或转换为一个显式模块。
https://stackoverflow.com/questions/46288170
复制相似问题