Maven POM file best practices
Author: Vina Martin (Deactivated)
Plugins:
- Eliminate phase overrides OR be sure to provide proper documentation to explain why this override is necessary
- Jacoco overrides cause Maven warnings in most/all poms because the version is missing, evaluate a solution for this to clean up Maven warnings
- Consider moving plugins that may be used across downstream projects to ddf-parent's pluginManagement definition
Dependencies:
- Eliminate unused, redundant dependencies
- IntelliJ can help find duplicated dependencies in poms
- Evaluate dependencies that may have been copy-pasted and are not used
- Double check embed dependencies and import package
- Tighten dependency scopes when possible (6 scopes are available: compile, provided, runtime, test, system, import)
- Try to eliminate hardcoded version numbers when possible
- Try to eliminate overwritten version numbers OR be sure to provide proper documentation to explain version overrides
- Evaluate version inconsistencies and eliminate them using properties in the root pom OR dependency management when possible
- Remove usages of <dependencyManagement> at modules that do not have any sub modules (there is nothing to inherit these dependencies)
- Instead refactor these sections to simply be <dependencies> for any dependencies in <dependencyManagement> that this module needs
- Eliminate the anti-pattern of having submodules listed in <dependencyManagement>
- Refactor poms to explicitly use project.version for submodule dependencies and scope them properly
- Consider refactoring global dependencies into <dependencyManagement> (This can be difficult with the test dependencies)
- Consider eliminating dependencies in <dependencyManagement> that have a version property
- Since these dependencies already have a version property, simply refactor poms that inherit this dependency to explicitly use the version property instead of getting it from dependency management
- Refactor version properties that are duplicated in multiple submodules to live in the most appropriate parent pom
- Some submodules redefine the same version properties for their submodules; however, these properties should live in the appropriate parent pom so the versions do not diverge
- Remove dependency conflicts with dependency management
Style:
- Consistency in the layout of poms makes poms easy to read at a glance
- Consider refactoring poms where the dependencies stanza is at the end to have this stanza toward the top (under <packaging>) as it is in most poms in the code base
- Enforce consistent <name> styling throughout the code base
- Enforce documenting low/non-existent Jacoco coverage numbers
- (Going forward) Consider grouping dependencies and use comments to explain how/why they are used (especially for new dependencies and overrides)
- Always document confusing, weird, or hardcoded versions/dependencies/plugins to make it easier for other developers (ideally, we would not have any of these, though!)