14.9 通过一个更复杂的例子了解更多
通过下面这个例子,你可以感受一下生产环境中的模块系统是怎样的,该例子摘自Oracle公司提供的Java文档。这个例子使用了本章中介绍的模块声明的大多数特性。采用这个例子并不是要吓唬你(其中大多数模块声明还是简单的exports和requires),只是让你了解一下模块丰富的特性。
module com.example.foo {requires com.example.foo.http;requires java.logging;requires transitive com.example.foo.network;exports com.example.foo.bar;exports com.example.foo.internal to com.example.foo.probe;opens com.example.foo.quux;opens com.example.foo.internal to com.example.foo.network,com.example.foo.probe;uses com.example.foo.spi.Intf;provides com.example.foo.spi.Intf with com.example.foo.Impl;}
本章讨论了新的Java模块系统诞生的原因并概要地介绍了它的主要特性。我们并没有介绍很多的特性,像服务装载器、附加模块描述符子句、辅助模块工作的工具,如jdeps和jlink都没有涉及。如果你是Java企业版的开发者,请注意将你的应用迁移到Java 9时,好几个与Java企业版相关的包默认都无法由模块化的Java 9虚拟机加载。譬如JAXP API类就属于Java EE API,它在Java SE 9默认的类路径中不存在。你需要显式地通过命令行开关--add-modules添加需要的模块,才能保证前后向的兼容性。譬如,要添加java.xml.bind,你就需要指定--add-modules java.xml.bind。
正如前文多次提到的那样,完整地介绍Java模块系统需要一本书,而不仅仅是这短短的一章。如果你希望更深入地理解模块系统的细节,建议你阅读由Nicolai Parlog编写的The Java Module System。
