Class FlattenMojo
- All Implemented Interfaces:
org.apache.maven.plugin.ContextEnabled
,org.apache.maven.plugin.Mojo
flatten
that generates the flattened POM and potentially updates the POM file
so that the current MavenProject
's file
points to the flattened POM instead of the original pom.xml
file. The flattened POM is a reduced version
of the original POM with the focus to contain only the important information for consuming it. Therefore information
that is only required for maintenance by developers and to build the project artifact(s) are stripped. Starting from
here we specify how the flattened POM is created from the original POM and its project:Element | Transformation | Note |
---|---|---|
modelVersion |
Fixed to "4.0.0" | New maven versions will once be able to evolve the model version without incompatibility to older versions if flattened POMs get deployed. |
groupId artifactId version packaging |
resolved | copied to the flattened POM but with inheritance from parent as well as with all
variables and defaults resolved. These elements are technically required for consumption. |
licenses |
resolved | copied to the flattened POM but with inheritance from parent as well as with all
variables and defaults resolved. The licenses would not be required in flattened POM. However, they make sense for
publication and deployment and are important for consumers of your artifact. |
dependencies |
resolved specially | flattened POM contains the actual dependencies of the project. Test dependencies are removed. Variables and
dependencyManagement is resolved to get fixed dependency attributes
(especially version ). If embedBuildProfileDependencies is set to true , then also build-time driven Profile s will be
evaluated and may add dependencies . For further details see Profile s below. |
profiles |
resolved specially | only the Activation and the dependencies of a Profile are copied to the
flattened POM. If you set the parameter embedBuildProfileDependencies to
true then only profiles activated by JDK or
OS will be added to the flattened POM while the other profiles are triggered by the
current build setup and if activated their impact on dependencies is embedded into the resulting flattened POM. |
name description url inceptionYear organization scm developers contributors mailingLists pluginRepositories issueManagement ciManagement distributionManagement |
configurable | Will be stripped from the flattened POM by default. You can configure all of the listed elements inside
pomElements that should be kept in the flattened POM (e.g.
<pomElements><name/><description/><developers/><contributors/></pomElements>). For common use-cases there are
predefined modes available via the parameter flattenMode that should be used in preference. |
prerequisites |
configurable | Like above but by default NOT removed if packaging is "maven-plugin". |
repositories |
configurable | Like two above but by default NOT removed. If you want have it removed, you need to use the parameter
pomElements and configure the child element repositories with value flatten .
|
parent build dependencyManagement properties modules reporting |
configurable | These elements should typically be completely stripped from the flattened POM. However for ultimate flexibility
(e.g. if you only want to resolve variables in a POM with packaging pom) you can also configure to keep these
elements. We strictly recommend to use this feature with extreme care and only if packaging is pom (for "Bill of
Materials"). In the latter case you configure the parameter flattenMode to the value
bom .If the build element contains plugins in the build/plugins section which are configured to
load extensions, a reduced build element
containing these plugins will be kept in the flattened pom. |
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprivate class
This class is a simple SAX handler that extracts the first comment located before the root tag in an XML document. -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate org.apache.maven.artifact.handler.manager.ArtifactHandlerManager
private ElementHandling
The default operation to use when no element handling is given.private Boolean
Profiles activated by OS or JDK are valid ways to have different dependencies per environment.private FlattenDependencyMode
The different possible values for flattenDependencyMode: Mode Description direct Flatten only the direct dependency versions.private FlattenMode
The different possible values for flattenMode: Mode Description oss For Open-Source-Software projects that want to keep alloptional POM elements
except forrepositories
andpluginRepositories
. ossrh Keeps alloptional POM elements
that are required for OSS Repository-Hosting. bom Likeossrh
but additionally keepsdependencyManagement
andproperties
.private static final int
private boolean
The core maven model readers/writers are discarding the comments of the pom.xml.private CiInterpolator
TheModelInterpolator
used to resolve variables.private org.apache.maven.model.interpolation.ModelInterpolator
TheModelInterpolator
used to resolve variables.private org.apache.maven.plugin.MojoExecution
TheMojoExecution
used to get access to the raw configuration ofpomElements
as empty tags are mapped to null.private boolean
Dictates whether dependency exclusions stanzas should be included in the flattened POM.private FlattenDescriptor
TheModel
that defines how to handle additional POM elements.private org.apache.maven.project.MavenProject
The Maven Project.private org.eclipse.aether.RepositorySystem
private org.apache.maven.execution.MavenSession
TheMavenSession
used to get user properties.private org.apache.maven.settings.Settings
TheSettings
used to get active profile properties.private boolean
Iftrue
the flatten goal will be skipped.private Boolean
The flag to indicate if the generated flattened POM shall be set as POM file to the current project.Fields inherited from interface org.apache.maven.plugin.Mojo
ROLE
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected org.apache.maven.model.Model
createCleanPom
(org.apache.maven.model.Model effectivePom) This method creates the clean POM as aModel
where to copy elements from that shall beflattened
.protected org.apache.maven.model.Model
createEffectivePom
(org.apache.maven.model.building.ModelBuildingRequest buildingRequest, boolean embedBuildProfileDependencies, FlattenMode flattenMode) Creates the effective POM for the givenpomFile
trying its best to match the core maven behaviour.protected List
<org.apache.maven.model.Dependency> createFlattenedDependencies
(org.apache.maven.model.Model effectiveModel) Creates theList
ofdependencies
for the flattened POM.protected void
createFlattenedDependencies
(org.apache.maven.model.Model effectiveModel, List<org.apache.maven.model.Dependency> flattenedDependencies) Collects the resolveddependencies
from the giveneffectiveModel
.private void
createFlattenedDependenciesAll
(List<org.apache.maven.model.Dependency> projectDependencies, List<org.apache.maven.model.Dependency> managedDependencies, List<org.apache.maven.model.Dependency> flattenedDependencies) Collects the resolved direct and transitivedependencies
from the giveneffectiveModel
.private void
createFlattenedDependenciesDirect
(List<org.apache.maven.model.Dependency> projectDependencies, List<org.apache.maven.model.Dependency> flattenedDependencies) Collects the resolveddependencies
from the giveneffectiveModel
.protected org.apache.maven.model.Dependency
createFlattenedDependency
(org.apache.maven.model.Dependency projectDependency) protected org.apache.maven.model.Model
createFlattenedPom
(File pomFile) This method creates the flattened POM what is the main task of this plugin.protected static List
<org.apache.maven.model.Repository> createFlattenedRepositories
(List<org.apache.maven.model.Repository> repositories) Creates a flattenedList
ofRepository
elements where those from super-POM are omitted.private org.apache.maven.model.building.ModelBuildingRequest
createModelBuildingRequest
(File pomFile) private org.apache.maven.model.Model
createResolvedPom
(org.apache.maven.model.building.ModelBuildingRequest buildingRequest) void
execute()
protected String
extractHeaderComment
(File xmlFile) This method extracts the XML header comment if available.private FlattenDescriptor
private String
getKey
(org.apache.maven.artifact.Artifact a) Keep in sync withgetKey(org.eclipse.aether.graph.Dependency)
andgetKey(Dependency)
.private String
getKey
(org.apache.maven.model.Dependency d) Keep in sync withgetKey(org.eclipse.aether.graph.Dependency)
andgetKey(Artifact)
private String
getKey
(org.eclipse.aether.graph.Dependency dependency) Keep in sync withgetKey(Dependency)
andgetKey(Artifact)
.private org.apache.maven.model.Model
private List
<org.apache.maven.project.MavenProject> private org.apache.maven.model.Model
getSourceModel
(FlattenDescriptor descriptor, PomProperty<?> property, org.apache.maven.model.Model effectivePom, org.apache.maven.model.Model originalPom, org.apache.maven.model.Model resolvedPom, org.apache.maven.model.Model interpolatedPom, org.apache.maven.model.Model cleanPom) protected static boolean
isBuildTimeDriven
(org.apache.maven.model.Activation activation) private static boolean
isCentralRepositoryFromSuperPom
(org.apache.maven.model.Repository repo) This method determines if the givenRepository
section is identical to what is defined from the super POM.boolean
private boolean
isEmpty
(Collection<?> collection) Null-safe check forCollection.isEmpty()
.boolean
protected boolean
protected void
writePom
(org.apache.maven.model.Model pom, File pomFile, String headerComment, KeepCommentsInPom anOriginalCommentsPath) Writes the given POMModel
to the givenFile
.protected void
writeStringToFile
(String data, File file, String encoding) Writes the givendata
to the givenfile
using the specifiedencoding
.Methods inherited from class org.codehaus.mojo.flatten.AbstractFlattenMojo
getFlattenedPomFile, getFlattenedPomFilename, getOutputDirectory, shouldSkip
Methods inherited from class org.apache.maven.plugin.AbstractMojo
getLog, getPluginContext, setLog, setPluginContext
-
Field Details
-
INITIAL_POM_WRITER_SIZE
private static final int INITIAL_POM_WRITER_SIZE- See Also:
-
settings
@Parameter(defaultValue="${settings}", readonly=true, required=true) private org.apache.maven.settings.Settings settingsTheSettings
used to get active profile properties. -
session
@Parameter(defaultValue="${session}", readonly=true, required=true) private org.apache.maven.execution.MavenSession sessionTheMavenSession
used to get user properties. -
project
@Parameter(defaultValue="${project}", readonly=true, required=true) private org.apache.maven.project.MavenProject projectThe Maven Project. -
updatePomFile
The flag to indicate if the generated flattened POM shall be set as POM file to the current project. By default this is only done for projects with packaging other thanpom
. You may want to also do this forpom
packages projects by setting this parameter totrue
or you can usefalse
in order to only generate the flattened POM but never set it as POM file. IfflattenMode
is set to bom the default value will betrue
. -
embedBuildProfileDependencies
Profiles activated by OS or JDK are valid ways to have different dependencies per environment. However, profiles activated by property of file are less clear. When setting this parameter totrue
, the latter dependencies will be written as direct dependencies of the project. This is not how Maven2 and Maven3 handles dependencies. When keeping this propertyfalse
, all profiles will stay in the flattened-pom. -
mojoExecution
@Parameter(defaultValue="${mojo}", readonly=true, required=true) private org.apache.maven.plugin.MojoExecution mojoExecutionTheMojoExecution
used to get access to the raw configuration ofpomElements
as empty tags are mapped to null. -
pomElements
TheModel
that defines how to handle additional POM elements. Please useflattenMode
in preference if possible. This parameter is only for ultimate flexibility. -
omitExclusions
@Parameter(defaultValue="false", required=false) private boolean omitExclusionsDictates whether dependency exclusions stanzas should be included in the flattened POM. By default exclusions will be included in the flattened POM but if you wish to omit exclusions stanzas from being present then set this configuration property totrue
.- Since:
- 1.3.0
-
flattenMode
The different possible values for flattenMode:Mode Description oss For Open-Source-Software projects that want to keep all optional POM elements
except forrepositories
andpluginRepositories
.ossrh Keeps all optional POM elements
that are required for OSS Repository-Hosting.bom Like ossrh
but additionally keepsdependencyManagement
andproperties
. Especially it will keep thedependencyManagement
as-is without resolving parent influences and import-scoped dependencies. This is useful if your POM represents a BOM (Bill Of Material) and you do not want to deploy it as is (to remove parent and resolve version variables, etc.).defaults The default mode that removes all optional POM elements
exceptrepositories
.clean Removes all optional POM elements
.fatjar Removes all optional POM elements
and alldependencies
.resolveCiFriendliesOnly Only resolves variables revision, sha1 and changelist. Keeps everything else. See Maven CI Friendly for further details. -
flattenDependencyMode
@Parameter(property="flatten.dependency.mode", required=false) private FlattenDependencyMode flattenDependencyModeThe different possible values for flattenDependencyMode:Mode Description direct Flatten only the direct dependency versions. This is the default mode and compatible with Flatten Plugin prior to 1.2.0. all Flatten both direct and transitive dependencies. This will examine the full dependency tree, and pull up all transitive dependencies as a direct dependency, and setting their versions appropriately.
This is recommended if you are releasing a library that uses dependency management to manage dependency versions.
-
keepCommentsInPom
@Parameter(property="flatten.dependency.keepComments", required=false, defaultValue="false") private boolean keepCommentsInPomThe core maven model readers/writers are discarding the comments of the pom.xml. By setting keepCommentsInPom to true the current comments are moved to the flattened pom.xml. Default value is false (= not re-adding comments).- Since:
- 1.3.0
-
skipFlatten
@Parameter(property="flatten.flatten.skip", defaultValue="false") private boolean skipFlattenIftrue
the flatten goal will be skipped.- Since:
- 1.6.0
-
defaultOperation
@Parameter(property="flatten.dependency.defaultOperation", required=false, defaultValue="flatten") private ElementHandling defaultOperationThe default operation to use when no element handling is given. Defaults toflatten
.- Since:
- 1.6.0
-
inheritanceAssembler
-
modelInterpolator
@Inject private org.apache.maven.model.interpolation.ModelInterpolator modelInterpolatorTheModelInterpolator
used to resolve variables. -
modelCiFriendlyInterpolator
TheModelInterpolator
used to resolve variables. -
modelBuilderThreadSafetyWorkaround
-
artifactHandlerManager
@Inject private org.apache.maven.artifact.handler.manager.ArtifactHandlerManager artifactHandlerManager -
repositorySystem
@Inject private org.eclipse.aether.RepositorySystem repositorySystem
-
-
Constructor Details
-
FlattenMojo
public FlattenMojo()The constructor.
-
-
Method Details
-
execute
public void execute() throws org.apache.maven.plugin.MojoExecutionException, org.apache.maven.plugin.MojoFailureException- Throws:
org.apache.maven.plugin.MojoExecutionException
org.apache.maven.plugin.MojoFailureException
-
shouldSkipGoal
protected boolean shouldSkipGoal()- Specified by:
shouldSkipGoal
in classAbstractFlattenMojo
-
extractHeaderComment
protected String extractHeaderComment(File xmlFile) throws org.apache.maven.plugin.MojoExecutionException This method extracts the XML header comment if available.- Parameters:
xmlFile
- is the XMLFile
to parse.- Returns:
- the XML comment between the XML header declaration and the root tag or
null
if NOT available. - Throws:
org.apache.maven.plugin.MojoExecutionException
- if anything goes wrong.
-
writePom
protected void writePom(org.apache.maven.model.Model pom, File pomFile, String headerComment, KeepCommentsInPom anOriginalCommentsPath) throws org.apache.maven.plugin.MojoExecutionException Writes the given POMModel
to the givenFile
.- Parameters:
pom
- theModel
of the POM to write.pomFile
- theFile
where to write the given POM will be written to.Parent directories
arecreated
automatically.headerComment
- is the content of a potential XML comment at the top of the XML (after XML declaration and before root tag). May benull
if not present and to be omitted in target POM.- Throws:
org.apache.maven.plugin.MojoExecutionException
- if the operation failed (e.g. due to anIOException
).
-
writeStringToFile
protected void writeStringToFile(String data, File file, String encoding) throws org.apache.maven.plugin.MojoExecutionException Writes the givendata
to the givenfile
using the specifiedencoding
. -
createFlattenedPom
protected org.apache.maven.model.Model createFlattenedPom(File pomFile) throws org.apache.maven.plugin.MojoExecutionException, org.apache.maven.plugin.MojoFailureException This method creates the flattened POM what is the main task of this plugin.- Parameters:
pomFile
- is the name of the original POM file to read and transform.- Returns:
- the
Model
of the flattened POM. - Throws:
org.apache.maven.plugin.MojoExecutionException
- if anything goes wrong (e.g. POM can not be processed).org.apache.maven.plugin.MojoFailureException
- if anything goes wrong (logical error).
-
createResolvedPom
private org.apache.maven.model.Model createResolvedPom(org.apache.maven.model.building.ModelBuildingRequest buildingRequest) throws org.apache.maven.plugin.MojoExecutionException - Throws:
org.apache.maven.plugin.MojoExecutionException
-
getOriginalModel
private org.apache.maven.model.Model getOriginalModel() throws org.apache.maven.plugin.MojoExecutionException- Throws:
org.apache.maven.plugin.MojoExecutionException
-
createCleanPom
protected org.apache.maven.model.Model createCleanPom(org.apache.maven.model.Model effectivePom) throws org.apache.maven.plugin.MojoExecutionException This method creates the clean POM as aModel
where to copy elements from that shall beflattened
. Will be mainly empty but contains some the minimum elements that have to be kept in flattened POM.- Parameters:
effectivePom
- is the effective POM.- Returns:
- the clean POM.
- Throws:
org.apache.maven.plugin.MojoExecutionException
- if anything goes wrong.
-
getSourceModel
private org.apache.maven.model.Model getSourceModel(FlattenDescriptor descriptor, PomProperty<?> property, org.apache.maven.model.Model effectivePom, org.apache.maven.model.Model originalPom, org.apache.maven.model.Model resolvedPom, org.apache.maven.model.Model interpolatedPom, org.apache.maven.model.Model cleanPom) -
createFlattenedRepositories
protected static List<org.apache.maven.model.Repository> createFlattenedRepositories(List<org.apache.maven.model.Repository> repositories) Creates a flattenedList
ofRepository
elements where those from super-POM are omitted. -
getFlattenDescriptor
private FlattenDescriptor getFlattenDescriptor() throws org.apache.maven.plugin.MojoFailureException- Throws:
org.apache.maven.plugin.MojoFailureException
-
isCentralRepositoryFromSuperPom
private static boolean isCentralRepositoryFromSuperPom(org.apache.maven.model.Repository repo) This method determines if the givenRepository
section is identical to what is defined from the super POM.- Parameters:
repo
- is theRepository
section to check.- Returns:
true
if maven central default configuration,false
otherwise.
-
createModelBuildingRequest
private org.apache.maven.model.building.ModelBuildingRequest createModelBuildingRequest(File pomFile) -
getReactorModelsFromSession
-
createEffectivePom
protected org.apache.maven.model.Model createEffectivePom(org.apache.maven.model.building.ModelBuildingRequest buildingRequest, boolean embedBuildProfileDependencies, FlattenMode flattenMode) throws org.apache.maven.plugin.MojoExecutionException Creates the effective POM for the givenpomFile
trying its best to match the core maven behaviour.- Parameters:
buildingRequest
-ModelBuildingRequest
embedBuildProfileDependencies
- embed build profiles yes/no.flattenMode
- the flattening mode- Returns:
- the parsed and calculated effective POM.
- Throws:
org.apache.maven.plugin.MojoExecutionException
- if anything goes wrong.
-
isEmpty
Null-safe check forCollection.isEmpty()
.- Parameters:
collection
- is theCollection
to test. May benull
.- Returns:
true
ifnull
orempty
,false
otherwise.
-
isEmbedBuildProfileDependencies
public boolean isEmbedBuildProfileDependencies()- Returns:
true
if build-dependent profiles (triggered by OS or JDK) should be evaluated and their effect (variables and dependencies) are resolved and embedded into the flattened POM while the profile itself is stripped. Otherwise iffalse
the profiles will remain untouched.
-
isBuildTimeDriven
protected static boolean isBuildTimeDriven(org.apache.maven.model.Activation activation) - Parameters:
activation
- is theActivation
of aProfile
.- Returns:
true
if the givenActivation
is build-time driven,false
otherwise (if it is triggered by OS or JDK).
-
createFlattenedDependencies
protected List<org.apache.maven.model.Dependency> createFlattenedDependencies(org.apache.maven.model.Model effectiveModel) throws org.apache.maven.plugin.MojoExecutionException Creates theList
ofdependencies
for the flattened POM. These are all resolveddependencies
except for those added fromprofiles
.- Parameters:
effectiveModel
- is the effective POMModel
to process.- Returns:
- the
List
ofdependencies
. - Throws:
org.apache.maven.plugin.MojoExecutionException
- if anything goes wrong.
-
createFlattenedDependenciesDirect
private void createFlattenedDependenciesDirect(List<org.apache.maven.model.Dependency> projectDependencies, List<org.apache.maven.model.Dependency> flattenedDependencies) Collects the resolveddependencies
from the giveneffectiveModel
.- Parameters:
projectDependencies
- is the effective POMModel
's current dependenciesflattenedDependencies
- is theList
where to add the collecteddependencies
.
-
createFlattenedDependenciesAll
private void createFlattenedDependenciesAll(List<org.apache.maven.model.Dependency> projectDependencies, List<org.apache.maven.model.Dependency> managedDependencies, List<org.apache.maven.model.Dependency> flattenedDependencies) throws org.eclipse.aether.resolution.ArtifactDescriptorException, org.eclipse.aether.collection.DependencyCollectionException Collects the resolved direct and transitivedependencies
from the giveneffectiveModel
. The collected dependencies are stored in order, so that the leaf dependencies are prioritized in front of direct dependencies. In addition, every non-leaf dependencies will exclude its own direct dependency, since all transitive dependencies will be collected.Transitive dependencies are all going to be collected and become a direct dependency. Maven should already resolve versions properly because now the transitive dependencies are closer to the artifact. However, when this artifact is being consumed, Maven Enforcer Convergence rule will fail because there may be multiple versions for the same transitive dependency.
Typically, exclusion can be done by using the wildcard. However, a known Maven issue prevents convergence enforcer from working properly w/ wildcard exclusions. Thus, this will exclude each dependencies explicitly rather than using the wildcard.
- Parameters:
projectDependencies
- is the effective POMModel
's current dependenciesflattenedDependencies
- is theList
where to add the collecteddependencies
.- Throws:
org.eclipse.aether.collection.DependencyCollectionException
org.eclipse.aether.resolution.ArtifactDescriptorException
-
getKey
Keep in sync withgetKey(org.eclipse.aether.graph.Dependency)
andgetKey(Dependency)
. -
getKey
Keep in sync withgetKey(org.eclipse.aether.graph.Dependency)
andgetKey(Artifact)
-
getKey
Keep in sync withgetKey(Dependency)
andgetKey(Artifact)
. -
createFlattenedDependencies
protected void createFlattenedDependencies(org.apache.maven.model.Model effectiveModel, List<org.apache.maven.model.Dependency> flattenedDependencies) throws org.apache.maven.plugin.MojoExecutionException Collects the resolveddependencies
from the giveneffectiveModel
.- Parameters:
effectiveModel
- is the effective POMModel
to process.flattenedDependencies
- is theList
where to add the collecteddependencies
.- Throws:
org.apache.maven.plugin.MojoExecutionException
- if anything goes wrong.
-
createFlattenedDependency
protected org.apache.maven.model.Dependency createFlattenedDependency(org.apache.maven.model.Dependency projectDependency) - Parameters:
projectDependency
- is the projectDependency
.- Returns:
- the flattened
Dependency
ornull
if the givenDependency
is NOT relevant for flattened POM.
-
isUpdatePomFile
public boolean isUpdatePomFile()- Returns:
true
if the generated flattened POM shall beset
as POM artifact of theMavenProject
,false
otherwise.
-