Java 1.8 161+版本jjs工具在Windows下类路径含盘符报错问题
关于JDK 1.8.0_171中jjs工具处理带盘符类路径失败的问题解析
问题重现
你在Windows上用JDK 1.8.0_171运行jjs工具时,碰到了一个奇怪的问题:当-cp参数里的类路径带盘符(比如d:),命令直接报错;但把盘符去掉后就能正常运行,而且用JDK 1.8.0_91的时候完全没问题,团队里还有人没遇到这个情况。
出错的命令示例
D:\Java\64\jre1.8.0_171\bin\jjs.exe -cp "d:\dev\gitrepos\lconfig\target\classes;d:\dev\m2repo\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.4\jackson-module-parameter-names-2.9.4.jar;d:\dev\m2repo\com\fasterxml\jackson\core\jackson-core\2.9.4\jackson-core-2.9.4.jar;d:\dev\m2repo\com\fasterxml\jackson\core\jackson-databind\2.9.4\jackson-databind-2.9.4.jar;d:\dev\m2repo\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;d:\dev\m2repo\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.4\jackson-datatype-jdk8-2.9.4.jar;d:\dev\m2repo\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.4\jackson-datatype-jsr310-2.9.4.jar;d:\dev\m2repo\com\fasterxml\jackson\module\jackson-module-afterburner\2.9.4\jackson-module-afterburner-2.9.4.jar" -scripting \dev\gitrepos\lconfig/src/test/js/react-renderer/test.js
收到的错误提示
jjs [
] [-- ] "Illegal char <:> at index 40: d:\dev\gitrepos\lconfig\target\classes;d:\dev\m2repo\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.4\jackson-module-parameter-names-2.9.4.jar; ;;d:\dev\m2repo\com\fasterxml\jackson\module\jackson-module-afterburner\2.9.4\jackson-module-afterburner-2.9.4.jar" is not a recognized option. Use "-h" or "-help" to see a list of all supported options.
问题根源
这其实是JDK版本升级带来的参数解析逻辑变更:
- 在JDK 1.8.0_91及更早版本,
jjs(基于Nashorn引擎)的参数解析器能正确识别Windows路径里的冒号(:),知道这是盘符的一部分,不会当成命令选项的分隔符。 - 从JDK 1.8.0_101开始,Oracle调整了Nashorn的命令行参数校验规则,变得更严格——它会把类路径里的冒号误判成Unix风格的选项分隔符(比如
-Dproperty=value里的特殊符号逻辑),所以就抛出了"Illegal char <:>"的错误。 - 团队里有人没碰到这个问题,要么是他们用的JDK版本低于1.8.0_101,要么是他们的类路径配置里没显式带盘符(比如用相对路径,或者环境变量里的路径已经包含盘符,不需要额外指定)。
可行的临时解决方案
- 调整类路径格式:把带盘符的路径改成相对路径,或者用
/替换\(Windows系统是支持斜杠作为路径分隔符的),同时确保整个-cp参数用双引号包裹好。 - 预处理Maven的classpath:在Maven执行
jjs命令时,对%classpath做一下处理,去掉盘符部分,或者把盘符后的路径转成相对路径。 - 临时回退JDK版本:如果短期内找不到更好的办法,可以先回退到JDK 1.8.0_91,保证业务能正常运行。
内容的提问来源于stack exchange,提问作者Gary McWilliams
相关产品推荐
相关产品推荐

