使用Java 11构建Maven项目时sun.awt.windows包不存在问题求助
解决OpenJDK 11下"package sun.awt.windows does not exist"报错问题
核心原因
sun.awt.windows是Oracle JDK专属的私有内部API,并非标准Java API。从Java 9开始,OpenJDK(包括Oracle JDK 9+)通过模块化系统严格限制了对这类内部包的访问,直接引用会导致编译错误。JDK 8时期这类API还未被完全隔离,所以能正常使用。
可行解决方案
方案1:替换私有API为标准Java API(优先推荐)
避免依赖非标准API带来的兼容性问题:
- 若做Windows平台相关UI/系统交互,改用
java.awt下的标准类,比如java.awt.Window、java.awt.Toolkit等,这些是跨平台的标准API,在所有JDK版本中都能稳定运行。 - 若涉及Windows特有功能,可考虑用JNI/JNA调用Windows原生API,或者使用成熟的跨平台库替代。
方案2:强制允许访问内部API(仅临时应急,不推荐长期使用)
如果暂时无法替换代码,可通过Maven编译参数强制OpenJDK 11允许访问这些内部包:
在项目根pom.xml的maven-compiler-plugin中添加参数,多模块项目需确保所有引用该包的模块都生效(或在父pom.xml统一配置):
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>11</source> <target>11</target> <compilerArgs> <arg>--add-exports</arg> <arg>java.desktop/sun.awt.windows=ALL-UNNAMED</arg> </compilerArgs> </configuration> </plugin> </plugins> </build>
方案3:检查IntelliJ的JDK配置
确认以下几点:
- 项目结构中,所有模块的SDK都设置为OpenJDK 11。
- 模块依赖中没有混入JDK 8的相关库。
- 清理项目缓存:执行
File -> Invalidate Caches...,重启IntelliJ后重新编译。
注意事项
- 依赖私有API会导致项目无法兼容未来JDK版本,也无法在非Oracle JDK环境下正常运行,方案1是长期维护的最优解。
- 多模块项目需确保所有模块的编译配置统一,避免部分模块使用不同JDK版本或编译参数。
内容的提问来源于stack exchange,提问作者Azmat Hayat
相关产品推荐
相关产品推荐

