diff --git a/src/main/java/org/apache/maven/plugins/install/InstallMojo.java b/src/main/java/org/apache/maven/plugins/install/InstallMojo.java index d002520..f3183f5 100644 --- a/src/main/java/org/apache/maven/plugins/install/InstallMojo.java +++ b/src/main/java/org/apache/maven/plugins/install/InstallMojo.java @@ -98,6 +98,7 @@ private enum State { } private static final String INSTALL_PROCESSED_MARKER = InstallMojo.class.getName() + ".processed"; + private static final String PROJECTS_USING_PLUGIN_KEY = InstallMojo.class.getName() + ".projectsUsingPlugin"; public InstallMojo() {} @@ -120,6 +121,26 @@ private boolean hasState(Project project) { return pluginContext.containsKey(INSTALL_PROCESSED_MARKER); } + /** + * Returns the list of reactor projects that have this plugin configured, cached on first call. + * The list is invariant during a build and is stored in the current project's plugin + * context to avoid recomputing it on every module invocation (O(N) total instead of O(N²)). + */ + @SuppressWarnings("unchecked") + private List getProjectsUsingPlugin() { + List allProjects = session.getProjects(); + if (allProjects.isEmpty()) { + return List.of(); + } + Map ctx = session.getPluginContext(allProjects.get(0)); + List cached = (List) ctx.get(PROJECTS_USING_PLUGIN_KEY); + if (cached == null) { + cached = allProjects.stream().filter(this::usingPlugin).collect(Collectors.toList()); + ctx.put(PROJECTS_USING_PLUGIN_KEY, cached); + } + return cached; + } + private boolean usingPlugin(Project project) { Plugin plugin = project.getBuild().getPluginsAsMap().get("org.apache.maven.plugins:maven-install-plugin"); return plugin != null @@ -144,8 +165,7 @@ public void execute() { } } - List projectsUsingPlugin = - session.getProjects().stream().filter(this::usingPlugin).collect(Collectors.toList()); + List projectsUsingPlugin = getProjectsUsingPlugin(); if (allProjectsMarked(projectsUsingPlugin)) { for (Project reactorProject : projectsUsingPlugin) { State state = getState(reactorProject);