1+ package ch .ivyteam .ivy .maven .validate ;
2+
3+ import java .util .ArrayList ;
4+ import java .util .Collections ;
5+ import java .util .HashMap ;
6+ import java .util .LinkedHashSet ;
7+ import java .util .List ;
8+ import java .util .Map ;
9+ import java .util .Optional ;
10+ import java .util .Set ;
11+ import java .util .stream .Collectors ;
12+
13+ import org .apache .maven .execution .MavenSession ;
14+ import org .apache .maven .model .Plugin ;
15+ import org .apache .maven .plugin .AbstractMojo ;
16+ import org .apache .maven .plugin .MojoExecutionException ;
17+ import org .apache .maven .plugin .MojoFailureException ;
18+ import org .apache .maven .plugins .annotations .Mojo ;
19+ import org .apache .maven .plugins .annotations .Parameter ;
20+ import org .apache .maven .project .MavenProject ;
21+
22+ /**
23+ * Validates that only one version of the project-build-plugin is active in one maven reactor.
24+ *
25+ * @since 10.0.17
26+ */
27+ @ Mojo (name = ValidateMojo .GOAL , requiresProject = true )
28+ public class ValidateMojo extends AbstractMojo {
29+
30+ public static final String GOAL = "validate" ;
31+ protected static final String PLUGIN_GROUPID = "com.axonivy.ivy.ci" ;
32+ protected static final String PLUGIN_ARTIFACTID = "project-build-plugin" ;
33+
34+ @ Parameter (defaultValue = "${session}" , readonly = true , required = true )
35+ private MavenSession session ;
36+
37+ @ Override
38+ public void execute () throws MojoExecutionException , MojoFailureException {
39+ validateConsistentPluginVersion (session .getAllProjects ());
40+ }
41+
42+ void validateConsistentPluginVersion (List <MavenProject > projects ) throws MojoExecutionException {
43+ var versionToProjectsMap = new HashMap <String , Set <MavenProject >>();
44+ for (var project : projects ) {
45+ findProjectBuildPlugin (project .getBuild ().getPlugins ()).ifPresent (plugin -> {
46+ var version = plugin .getVersion ();
47+ getLog ().debug (PLUGIN_GROUPID + ":" + plugin .getArtifactId () + ":" + version + " configured in " + project );
48+ var projectSet = versionToProjectsMap .computeIfAbsent (version , v -> new LinkedHashSet <>());
49+ projectSet .add (project );
50+ });
51+ }
52+ if (versionToProjectsMap .size () > 1 ) {
53+ var versions = new ArrayList <>(versionToProjectsMap .keySet ());
54+ Collections .sort (versions );
55+ var error = "Several versions of project-build-plugins are configured " + versions + ":\n " ;
56+ error += versions .stream ().map (v -> versionProjects (versionToProjectsMap , v )).collect (Collectors .joining ("\n " ));
57+ getLog ().error (error );
58+ throw new MojoExecutionException ("All project-build-plugins configured in one reactor must use the same version" );
59+ }
60+ }
61+
62+ private Optional <Plugin > findProjectBuildPlugin (List <Plugin > plugins ) {
63+ return plugins .stream ()
64+ .filter (p -> PLUGIN_GROUPID .equals (p .getGroupId ()) && PLUGIN_ARTIFACTID .equals (p .getArtifactId ()))
65+ .filter (p -> p .getVersion () != null ) // Skip plug-ins that do not have a version
66+ .findFirst ();
67+ }
68+
69+ private String versionProjects (Map <String , Set <MavenProject >> versionToProjectsMap , String version ) {
70+ return version + " -> [" +
71+ versionToProjectsMap .get (version ).stream ()
72+ .map (p -> p .getArtifactId ())
73+ .collect (Collectors .joining (", " )) +
74+ "]" ;
75+ }
76+ }
0 commit comments