Java命令行如何指定多JAR到modulepath?模块路径支持通配符吗?
我来帮你理清这两个关于Java模块路径的常见疑惑点:
一、如何在modulepath中指定多个JAR文件?
有两种实用方式,你可以根据场景选择:
逐个指定JAR文件:用系统对应的路径分隔符(Windows用
;,Unix/Linux/macOS用:)把每个模块JAR的路径分隔开即可。比如在Linux环境下:java --module-path module-a.jar:./libs/module-b.jar:../modules/module-c.jar -m com.your.module/com.your.module.Main另外
--module-path可以缩写成-p,所以上面的命令也能简化成:java -p module-a.jar:./libs/module-b.jar:../modules/module-c.jar -m com.your.module/com.your.module.Main指定包含模块JAR的目录:如果多个模块JAR都存在同一个目录下,直接指定这个目录路径就行——Java模块系统会自动扫描该目录下所有符合模块规范的JAR(也就是包含
module-info.class的JAR)。比如:java --module-path ./all-modules-dir -m com.your.module/com.your.module.Main这种方式比逐个写JAR路径简洁太多,适合模块数量较多的场景。
二、模块路径是否支持通配符?
答案是不支持类路径那种*通配符,这是模块系统的设计逻辑决定的:
类路径的*通配符是为了方便批量加载非模块化JAR,但模块系统强调依赖的显式性和确定性,避免出现依赖冲突或歧义。如果你在模块路径里写了*,Java会把它当作路径的一部分,而非通配符展开,最终会报错找不到对应模块。
那如果目录下有一堆模块JAR不想逐个指定怎么办?其实前面提到的「指定目录」的方式就能解决——直接把目录路径给到--module-path,Java会自动加载目录里所有合法的模块JAR。
另外,如果目录里混有非模块化JAR(没有module-info.class),这些JAR会被当作自动模块处理,Java会自动为它们生成模块名(通常是JAR文件名去掉后缀),同样可以通过指定目录的方式加载到模块路径中。比如:
java --module-path ./mixed-jars-dir -m com.your.module/com.your.module.Main
如果这些非模块化JAR你只想放到类路径,也可以同时搭配--class-path(或-cp)选项:
java --module-path ./modules-dir -cp ./non-modules/* -m com.your.module/com.your.module.Main
内容的提问来源于stack exchange,提问作者Wim Deblauwe

