Java SE 11 Platform Module System
The exam checks that you can write and reason about module-info.java, and that you know how the module path differs from the class path.
Declaring a module
A module is described by module-info.java at the root of its source tree, one per module. requires names a dependency; exports makes a package's public types accessible to other modules; opens permits deep reflection at runtime. Every module implicitly requires java.base, so it is never declared.
Qualified and optional directives
requires transitive re-exports a dependency to any module requiring you, which matters when a dependency type appears in your public API. requires static is compile-time only. exports com.acme.api to com.acme.client; restricts readability to named friends. uses com.acme.spi.Service; declares a ServiceLoader consumer, and provides com.acme.spi.Service with com.acme.impl.ServiceImpl; registers an implementation whose provider class needs a public no-arg constructor or a public static provider() method.
Module path vs class path
Code on the module path is resolved as modules; code on the class path lands in the unnamed module, which reads every module but exports nothing. A plain JAR placed on the module path becomes an automatic module named after the file, exporting all its packages. Cyclic requires and split packages across modules do not compile.
Tooling
jar --describe-module, jdeps, java --list-modules, java --show-module-resolution, jlink for custom runtimes, and --add-modules, --add-exports, --add-opens for migration.
Worked example
An app module declares uses com.acme.spi.Pricing; and the impl module declares provides com.acme.spi.Pricing with com.acme.impl.DefaultPricing;. At runtime ServiceLoader.load(Pricing.class) finds the provider only if the impl module is resolved on the module path - the same JAR on the class path provides nothing.
Traps
Believing exports grants reflection access (it does not; you need opens); expecting the unnamed module to export packages; forgetting requires transitive when a public API exposes a dependency type.