包不可见错误

时间:2018-01-05 19:56:43

标签: java java-9

我试图在我的项目中使用joptsimple包但是我得到以下错误:

Error:(4, 20) java: package jdk.internal.joptsimple is not visible
  (package jdk.internal.joptsimple is declared in module jdk.internal.opt, which does not export it to the unnamed module)

任何想法我该怎么办?

2 个答案:

答案 0 :(得分:6)

嗯,该消息清楚地显示(实际上注意到JDK开发人员的美丽命名惯例&#34; 内部&#34;意味着他们不想暴露他们)您尝试访问的API位于未导出到除< - p>之外的任何其他模块的程序包中

exports jdk.internal.joptsimple to jdk.jlink, jdk.jshell

即使您在声明中添加了requires jdk.internal.opt模块。

应避免使用这些包中的类。

即使是Open JDK itself integrates JOpt Simple for internal usage by JDK tools. ,我建议您通过添加依赖项来使用库 jopt-simple 作为长期解决方案使用 -

在您的modulepath(java9)或classpath(java8)上

Maven -

<dependency>
    <groupId>net.sf.jopt-simple</groupId>
    <artifactId>jopt-simple</artifactId>
    <version>6.0-alpha-2</version>
</dependency>

摇篮: -

compile 'net.sf.jopt-simple:jopt-simple:6.0-alpha-2'

包含在您的课程中使用的包名称后,只需 joptsimple.* 而不是 jdk.internal.joptsimple.*

答案 1 :(得分:2)

您显然使用的是内部API,您不应该这样做。此类API不是标准化的 - 它们可能因JVM而异,并且可能随时更改,恕不另行通知。

也就是说,如果您仍想使用它,可以在编译和运行时添加以下命令行标志(即javacjava):

--add-exports jdk.internal.opt/jdk.internal.joptsimple=ALL-UNNAMED

如果您要创建模块,可以用模块名称替换ALL-UNNAMED