我正试图在我的一个项目中使用带有intellij的Java 10并且遇到了警告。
这是说我没有导出类Server。如果你看到我的包结构,我在network
包里有服务器我的module-info文件看起来像这样
module core {
requires com.google.guice;
requires io.netty.all;
requires config;
requires org.apache.logging.log4j;
exports com.money.heist.server.core;
opens com.money.heist.server.core.network to com.google.guice;
}
我故意不导出包网络,因为我不想这样做,但我想在父包内的网络包内使用类。
他们在这里有什么好/坏的做法,或者只是看上去很疯狂?
如果要展开警告消息,您会发现其背后的原因
除此之外,在Java 9中,模块可能通过不导出其包来隐藏其某些类。
如果导出包中的类的公共API引用了非导出包中的类,则此类API在模块外部无用。
这种API无用的原因是没有其他模块可以实例化/访问Server
类。
值得注意的是,在您的模块描述符中,您已经包含了
opens com.money.heist.server.core.network to com.google.guice;
这将提供在运行时访问,但不是编译时间(可能是IntelliJ没有意识到它的原因),包中的public
和protected
类型,以及这些类型的public
和protected
成员到它们打开的模块至。
要与上述相关,如果将opens
指令更改为exports
,则不会进一步看到IntelliJ的警告。