一份老Maven项目在Linux能构建,放到Windows却提示找不到 java.lang,问题可能不是源码缺了什么包,而是自定义引导类路径被错误解析。
删除配置,错误却换了一个
2019年的记录中,日志出现JDK 1.8.0_181路径,编译失败:
致命错误:在类路径或引导类路径中找不到程序包 java.lang
POM里有这样的旧式配置:
<bootclasspath>${java.home}/lib/rt.jar:${java.home}/lib/jce.jar</bootclasspath>
尝试去掉它后,错误变成:
程序包 com.sun.image.codec.jpeg 不存在
搜索第二个错误,又看到“加回bootclasspath”的建议,于是在两个错误之间反复打转。
Windows不能照搬冒号分隔的类路径
关键线索是 rt.jar 和 jce.jar 之间的冒号。路径列表在Unix类系统通常用 : 分隔,在Windows用 ;;Windows盘符里的冒号不能替代路径列表分隔符。可参考Java的File.pathSeparator说明。
当年记录把这里改成分号后构建通过:
<bootclasspath>${java.home}/lib/rt.jar;${java.home}/lib/jce.jar</bootclasspath>
这是针对当时JDK 8布局的局部修复,不是跨平台POM的最终形式。共享配置可按插件支持使用系统路径分隔属性或平台配置,仍要检查最终传给编译器的参数和实际文件位置。
不要把引导路径配置迁到现代JDK
-bootclasspath 是旧平台交叉编译相关选项,不应作为“缺什么包就加什么”的万能修复。Java 8 javac说明
模块化后的JDK已改变运行时布局,不再按旧JRE的 rt.jar 方式组织。迁移时应核对JDK和编译插件支持的目标版本策略,而不是复制旧JAR。Oracle JDK迁移:运行时结构变化
com.sun.image.codec.jpeg 也不是稳定的Java SE公开API。对普通JPEG读写需求,应评估 javax.imageio.ImageIO 等公开接口;编码参数、色彩与元数据要求仍要单独核对,不能把替换import当作完成迁移。
排查同类问题时,同时记录 mvn -v、实际JDK位置、编译插件配置和最终参数,区分“平台分隔符修正”与“内部API依赖迁移”。