You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:20:31