包不可见错误

Sir*_*lar 8 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)
Run Code Online (Sandbox Code Playgroud)

任何想法我应该怎么做呢?

Nam*_*man 7

好吧,该消息清楚地显示(实际上注意到JDK开发人员的" 内部 "意味着他们不想公开它们的漂亮命名约定)您尝试访问的API是在不导出到任何其他的包中模块除了这些 -

exports jdk.internal.joptsimple to jdk.jlink, jdk.jshell
Run Code Online (Sandbox Code Playgroud)

即使你requires jdk.internal.opt在声明中添加模块.


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

此外,即使Open JDK本身也集成了JOpt Simple,供JDK工具内部使用. 我建议您使用库jopt-simple来获得长期解决方案,方法是使用以下方法添加对模块路径(java9)或类路径(java8)的依赖关系.

Maven -

<dependency>
    <groupId>net.sf.jopt-simple</groupId>
    <artifactId>jopt-simple</artifactId>
    <version>6.0-alpha-2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

摇篮: -

compile 'net.sf.jopt-simple:jopt-simple:6.0-alpha-2'
Run Code Online (Sandbox Code Playgroud)

在包含之后,您的类中使用的包名称应该只是joptsimple.*代替jdk.internal.joptsimple.*.


Nic*_*lai 5

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

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

--add-exports jdk.internal.opt/jdk.internal.joptsimple=ALL-UNNAMED
Run Code Online (Sandbox Code Playgroud)

如果您正在创建一个模块,您必须用ALL-UNNAMED您的模块名称替换。