Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javac(JDK 9)中是否可以混合使用--class path和--module path?_Java_Classpath_Java 9_Java Platform Module System_Module Path - Fatal编程技术网

在javac(JDK 9)中是否可以混合使用--class path和--module path?

在javac(JDK 9)中是否可以混合使用--class path和--module path?,java,classpath,java-9,java-platform-module-system,module-path,Java,Classpath,Java 9,Java Platform Module System,Module Path,当我编译一个依赖于我以前编译过的其他模块的模块时,我必须指定--module path选项。这使得我所依赖的模块可见 但同时我还想让一些非模块化的Jar文件可见。但是,如果不使它们成为自动模块,只在--模块路径旁边指定--类路径some.jar,那么javac似乎忽略了CLAPATH并抛出“package yyy not found”和其他“not found”错误 我可以理解同时(编译)使用--class path和--module path是非法的,但是javac没有以任何方式警告我。我相信

当我编译一个依赖于我以前编译过的其他模块的模块时,我必须指定
--module path
选项。这使得我所依赖的模块可见

但同时我还想让一些非模块化的Jar文件可见。但是,如果不使它们成为自动模块,只在
--模块路径
旁边指定
--类路径some.jar
,那么javac似乎忽略了CLAPATH并抛出“package yyy not found”和其他“not found”错误


我可以理解同时(编译)使用
--class path
--module path
是非法的,但是javac没有以任何方式警告我。我相信同时使用
--class path
--module path
选项是不非法的。可以同时使用这两个类,即使您没有显式指定类路径,它默认为当前目录

来自
javac-help
消息和-

--模块路径,-p
指定查找应用程序模块的位置

--class-path <path>, -classpath <path>, -cp <path>
--类路径,-classpath,-cp
指定查找用户类文件和注释处理器的位置

如果未指定
--类路径
-类路径
-cp
,则用户 类路径是当前目录


编辑:多亏了@MouseEvent,我可能错过了问题中的部分

但是,如果不让它们成为自动模块,只需指定 --类路径some.jar紧挨着--module path,然后javac似乎忽略了CLAPSATH并抛出“package yyy not found” 以及其他“未找到”错误

如果你不让它们自动,它会被视为一个和-

事实上,命名模块甚至不能声明对 未命名模块。此限制是故意的,因为允许命名 依赖于类路径的任意内容的模块 使可靠的配置成为不可能

此外,未命名模块会导出其所有包,因此自动模块中的代码将能够访问从类路径加载的任何公共类型

但是使用类路径中的类型的自动模块不能将这些类型公开给依赖它的显式模块,因为显式模块不能声明对未命名模块的依赖关系

如果显式模块
com.foo.app
中的代码引用公共类型 例如,在
com.foo.bar
中,该类型的签名指 输入一个仍然在类路径上的JAR文件,然后输入代码 在
com.foo.app中
将无法访问该类型,因为
com.foo.app
不能依赖于未命名的模块


这可以通过将
com.foo.app
临时视为自动模块来解决,以便其代码可以从类路径访问类型,直到类路径上的相关JAR文件可以被视为自动模块或转换为显式模块。

您可以并行使用类路径和模块路径,但是有一些细节需要考虑。< /P> 依赖模块路径~>类路径 显式模块(模块路径上带有模块描述符的JAR)无法读取未命名模块(类路径上的JAR)——这是为了防止模块JAR依赖于“类路径的混乱”

由于模块必须要求其所有依赖项,并且这些依赖项只能由其他命名模块(即不是类路径上的JAR)实现,因此模块JAR的所有依赖项必须放在模块路径上。是的,即使是非模块化的罐子,它们也会被转换成

有趣的是,自动模块可以读取未命名的模块,因此它们的依赖关系可以在类路径上

依赖类路径~>模块路径 如果编译非模块化代码或从非模块化JAR启动应用程序,模块系统仍在运行中,并且由于非模块化代码不表示任何依赖项,因此它不会从模块路径解析模块


因此,如果非模块化代码依赖于模块路径上的工件,则需要使用手动添加它们。不一定是所有的,只是那些您直接依赖的(模块系统将引入传递依赖项)-或者您可以使用
all-module-PATH
(查看链接帖子,它会更详细地解释这一点)。

可以将两者混合使用,你能分享一个我们可以验证的最小的例子吗?我能理解在同一(编译)时间使用--class path和--module path是非法的,为什么会这样?混合是绝对合法的。但是,模块化JAR不能引用类路径上的非模块化JAR。自动模块(modulepath上的非模块化JAR)起到了桥梁的作用:模块化JAR可以引用它们,而自动模块可以读取类路径。@MouseEvent确实如此。我相信我之前错过了问题的这一部分,只是回答了标题。编辑后也包括了这一点。谢谢:)Nicolai-您的回答是正确的,但我认为可以进一步指出,可能需要使用
--addmodules
选项来确保类路径代码所需的模块得到解决。最初的问题问为什么javac失败,我认为这是因为他/她在类路径上编译代码,引用模块路径上模块中的类,只需要
--添加模块
,以确保模块得到解决。我认为OP正在尝试编译具有非模块依赖性的模块代码-无论是哪种方式,我还添加了另一个方向,只是为了确保在编译过程中我尝试混合使用-classpath和-module path,但失败了
--class-path <path>, -classpath <path>, -cp <path>