ModuleDirectiveOrder

Since Checkstyle 14.1.0

Description

Checks the ordering, grouping and separation of directives in a module declaration. Directives of each kind must form a single block, the blocks must appear in a configurable order, and each block must be separated from the previous one by exactly one blank line.

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

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.

Parent Module

TreeWalker