Skip to content

module‑info.java

module-info.java is the module descriptor file placed in the root of a module’s source directory. It defines the module’s name, dependencies, and exported packages.

Basic structure:

module module.name {
// directives
}

Common directives:

DirectiveDescriptionExample
requiresDeclares a dependency on another modulerequires java.base; (java.base is implicit)
requires transitiveDependency that is also readable by modules that require this onerequires transitive java.sql;
exportsMakes a package available to all other modulesexports com.example.api;
exports ... toExports package to specific modules onlyexports com.example.internal to com.example.test;
opensAllows deep reflection on a package (used by frameworks like Spring)opens com.example.entities;
usesDeclares a service that this module consumesuses com.example.spi.Service;
provides ... withRegisters a service implementationprovides com.example.spi.Service with com.example.impl.ServiceImpl;

Example:

module com.example.myapp {
requires java.sql;
requires transitive java.logging;
exports com.example.myapp.api;
exports com.example.myapp.model;
opens com.example.myapp.internal to com.example.test;
uses com.example.spi.Plugin;
provides com.example.spi.Plugin with com.example.plugins.MyPlugin;
}

java.base is implicitly required – no need to declare it.

File location:

Terminal window
src/
└── com.example.myapp/
├── module-info.java
└── com/
└── example/
└── myapp/
├── api/
└── internal/

Compilation:

Terminal window
javac -d mods/com.example.myapp src/com.example.myapp/module-info.java src/com.example.myapp/...