无法导入问题

  • 问题介绍
  • 解决方案
  • idea
  • 其他


问题介绍

今天在学习粘贴板的时候,查看实现的时候发现了Toolkit这个工具类,里面有着很多的工具。但是由于是个抽象类不能直接创建对象,得使用Toolkit.getDefaultToolkit()。

然后我发现有2个实现类

cdh 引用不到正确javahome java sun包无法引用_ide


然后就查看了源码,来自sun.awt.windows包下的,发现没有注释。

cdh 引用不到正确javahome java sun包无法引用_java_02


在调用的时候没有这个类

cdh 引用不到正确javahome java sun包无法引用_java_03


导入这个包,无法解析

cdh 引用不到正确javahome java sun包无法引用_开发语言_04

解决方案

idea

1.降低jdk的版本,换成jdk8.
因为好像是:在jdk9以后java ee相关模块就不在java包里面了,增加额外依赖或者替换成其他的类

2.手动将路径添加到编辑器。
打开设置->构建、执行、部署->编译器->java编辑器
最下面有一个按模块重写编辑器参数:
–add-exports java.desktop/sun.awt.windows=ALL-UNNAMED
然后编辑器就不会报错了

--add-exports选项:模块声明中的exports语句将模块中的包导出到所有或其他模块,因此这些模块可以使用该包中的公共API。
 如果程序包未由模块导出,则可以使用-add-exports的命令行选项导出程序包
--add-opens选项: 模块声明中的opens语句使模块里面的包对其他模块开放,因此这些模块可以在运行期使用深层反射访问该程序包中的所有成员类型。 
如果一个模块的包未打开,可以使用--add-opens命令行选项打开它。 

后面=
ALL-UNNAMED,那么所有Classpath下的module,都可以访问source-module中的pakage包下的所有成员类型

cdh 引用不到正确javahome java sun包无法引用_intellij-idea_05

3.idea在导入这个后,会自动提示,不过这个提示比较慢,可以不用你手动去添加,按照他的提示一键添加了。不过就是有时候会像上面一样出现无法解析,而不是下面这样。

cdh 引用不到正确javahome java sun包无法引用_开发语言_06

其他

由于我是用的idea,其他编辑器是不知道的。不过有一个通用的方法。
对于编译阶段,也就是javac命令,我们只需要添加–add-exports,对于上面的例子,就是:

javac --add-exports java.desktop/sun.awt.windows=ALL-UNNAMED

对于运行阶段,也就是java命令,我们最好把–add-exports和–add-open都加上,对于上面的例子,就是:

java --add-exports java.desktop/sun.awt.windows=ALL-UNNAMED --add-open java.desktop/sun.awt.windows=ALL-UNNAMED