What is a good project structure for an Across module?

A module should never conflict with another module. As such, there are some best practices for creating a module:

  • Put every module in its own discrete package; avoid package overlap with other modules.
  • Define @AcrossDepends dependencies to other modules you require.
  • Avoid cyclic dependencies on other modules.
  • Avoid cyclic package dependencies with other modules (this is where putting them in separate JARs can help, as boundaries become explicit).
  • Avoid relying on the ordering of modules you do not have a required dependency on.
  • Always rely on ordering of modules you have required dependencies on: these will be started before your own module.
  • Define a unique module name and a unique resources key; avoid resource overlap with other modules.
  • Put all your module resources in a location mapped with the resources key.

An example

  • MyModule module descriptor would be in package com.foo.modules.my.
  • All components would be in either com.foo.modules.my or a child package.
  • The basic configuration classes would be in com.foo.modules.my.config.
  • If the resources key of the module would be my, then all embedded resources would be in a location containing that key, for example:
    • /messages/my/default.properties (message code)
    • /installers/my (installer files)
    • /views
      • /static/my (static resources)
        • /css
        • /js
      • /th/my (Thymeleaf templates)