14.9 通过一个更复杂的例子了解更多

通过下面这个例子,你可以感受一下生产环境中的模块系统是怎样的,该例子摘自Oracle公司提供的Java文档。这个例子使用了本章中介绍的模块声明的大多数特性。采用这个例子并不是要吓唬你(其中大多数模块声明还是简单的exportsrequires),只是让你了解一下模块丰富的特性。

  1. module com.example.foo {
  2. requires com.example.foo.http;
  3. requires java.logging;
  4. requires transitive com.example.foo.network;
  5. exports com.example.foo.bar;
  6. exports com.example.foo.internal to com.example.foo.probe;
  7. opens com.example.foo.quux;
  8. opens com.example.foo.internal to com.example.foo.network,
  9. com.example.foo.probe;
  10. uses com.example.foo.spi.Intf;
  11. provides com.example.foo.spi.Intf with com.example.foo.Impl;
  12. }

本章讨论了新的Java模块系统诞生的原因并概要地介绍了它的主要特性。我们并没有介绍很多的特性,像服务装载器、附加模块描述符子句、辅助模块工作的工具,如jdepsjlink都没有涉及。如果你是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