ModuleDirectiveOrder
Since Checkstyle 14.1.0
Description
The default configuration enforces Google Java Style Guide, Section 3.5.1: all requires directives first, then exports, opens, uses and provides, each kind in a single block, with a single blank line between blocks. Blank lines are what delimit blocks, so blank lines between directives of the same kind are also violations.
All forms of requires (plain, transitive, static) belong to a single block, and the order of directives inside a block is not validated.
Directive kinds that are not listed in the order property are not validated.
Properties
| name | description | type | default value | since |
|---|---|---|---|---|
| order | Specify directive kinds in the order their blocks must appear inside the module declaration. | String[] | requires, exports, opens, uses, provides |
14.1.0 |
| validateBlockSeparation | Control whether blank line separation is validated: exactly one blank line between directive blocks and no blank lines inside a block. | boolean | true |
14.1.0 |
Examples
To configure the check:
<module name="Checker">
<module name="TreeWalker">
<module name="ModuleDirectiveOrder"/>
</module>
</module>
Example:
module com.example.app {
requires java.base;
requires transitive java.sql;
exports com.example.api;
opens com.example.model;
uses com.example.api.Service;
provides com.example.api.Service with com.example.impl.ServiceImpl;
}
To configure the check with a custom order of directive kinds:
<module name="Checker">
<module name="TreeWalker">
<module name="ModuleDirectiveOrder">
<property name="order" value="requires, uses, provides, exports, opens"/>
</module>
</module>
</module>
Example:
module com.example.app {
requires java.base;
exports com.example.api;
uses com.example.api.Service;
// violation above ''uses' directive should be before 'exports' directive.'
}
To configure the check to validate only the order of directive blocks, without any blank line validation:
<module name="Checker">
<module name="TreeWalker">
<module name="ModuleDirectiveOrder">
<property name="validateBlockSeparation" value="false"/>
</module>
</module>
</module>
Example:
module com.example.app {
requires java.base;
exports com.example.api;
uses com.example.api.Service;
}
Use Cases
To configure the check to report directive blocks that are out of order:
<module name="Checker">
<module name="TreeWalker">
<module name="ModuleDirectiveOrder"/>
</module>
</module>
Example:
module com.example.app {
exports com.example.api;
requires java.base;
// violation above ''requires' directive should be before 'exports' directive.'
}
To configure the check to report a missing blank line between directive blocks:
<module name="Checker">
<module name="TreeWalker">
<module name="ModuleDirectiveOrder"/>
</module>
</module>
Example:
module com.example.app {
requires java.base;
exports com.example.api;
// violation above 'separated from the previous block by exactly one empty line'
}
To configure the check to report multiple blank lines between directive blocks:
<module name="Checker">
<module name="TreeWalker">
<module name="ModuleDirectiveOrder"/>
</module>
</module>
Example:
module com.example.app {
requires java.base;
exports com.example.api;
// violation above 'separated from the previous block by exactly one empty line'
}
To configure the check to report directives of one kind split into several blocks:
<module name="Checker">
<module name="TreeWalker">
<module name="ModuleDirectiveOrder"/>
</module>
</module>
Example:
module com.example.app {
requires java.base;
exports com.example.api;
requires java.sql;
// violation above 'All 'requires' directives should be in a single block.'
}
To configure the check to report blank lines inside a directive block:
<module name="Checker">
<module name="TreeWalker">
<module name="ModuleDirectiveOrder"/>
</module>
</module>
Example:
module com.example.app {
requires java.base;
requires java.sql;
// violation above 'Empty line not allowed inside 'requires' directive block.'
exports com.example.api;
}
Example of Usage
Violation Messages
- module.directive.grouping
- module.directive.order
- module.directive.separated.internally
- module.directive.separation
All messages can be customized if the default message doesn't suit you. Please see the documentation to learn how to.
Fully Qualified Name
com.puppycrawl.tools.checkstyle.checks.modules.ModuleDirectiveOrderCheck
Use this fully qualified class name in configuration when an exact class reference is required.






