diff --git a/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3ServerEmbedderImpl.java b/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3ServerEmbedderImpl.java index cc688216ac7e..385c310a6ed3 100644 --- a/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3ServerEmbedderImpl.java +++ b/plugins/maven/maven3-server-impl/src/org/jetbrains/idea/maven/server/Maven3ServerEmbedderImpl.java @@ -19,9 +19,7 @@ import com.intellij.openapi.util.Comparing; import com.intellij.util.SystemProperties; import gnu.trove.THashMap; import gnu.trove.THashSet; -import org.apache.maven.DefaultMaven; -import org.apache.maven.Maven; -import org.apache.maven.RepositoryUtils; +import org.apache.maven.*; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.InvalidRepositoryException; import org.apache.maven.artifact.factory.ArtifactFactory; @@ -310,6 +308,17 @@ public class Maven3ServerEmbedderImpl extends MavenRemoteObject implements Maven MavenSession oldSession = legacySupport.getSession(); legacySupport.setSession(mavenSession); + + /** adapted from {@link org.apache.maven.DefaultMaven#doExecute(org.apache.maven.execution.MavenExecutionRequest)} */ + try { + for (AbstractMavenLifecycleParticipant listener : getLifecycleParticipants(Collections.emptyList())) { + listener.afterSessionStart(mavenSession); + } + } + catch (MavenExecutionException e) { + throw new RuntimeException(e); + } + try { runnable.run(); } @@ -342,6 +351,7 @@ public class Maven3ServerEmbedderImpl extends MavenRemoteObject implements Maven MavenProject project = buildingResult.getProject(); // copied from DefaultLifecycleExecutor.execute + loadExtensions(project); //findExtensions(project); // end copied from DefaultLifecycleExecutor.execute @@ -387,6 +397,79 @@ public class Maven3ServerEmbedderImpl extends MavenRemoteObject implements Maven return ref.get(); } + /** adapted from {@link org.apache.maven.DefaultMaven#doExecute(org.apache.maven.execution.MavenExecutionRequest)} */ + private void loadExtensions(MavenProject project) { + ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); + Collection lifecycleParticipants = getLifecycleParticipants(Arrays.asList(project)); + if (!lifecycleParticipants.isEmpty()) { + LegacySupport legacySupport = getComponent(LegacySupport.class); + MavenSession session = legacySupport.getSession(); + session.setCurrentProject(project); + session.setProjects(Arrays.asList(project)); + + try { + for (AbstractMavenLifecycleParticipant listener : lifecycleParticipants) { + Thread.currentThread().setContextClassLoader(listener.getClass().getClassLoader()); + listener.afterProjectsRead(session); + } + } + catch (MavenExecutionException e) { + throw new RuntimeException(e); + } + finally { + Thread.currentThread().setContextClassLoader(originalClassLoader); + } + } + } + + /** adapted from {@link org.apache.maven.DefaultMaven#getLifecycleParticipants(java.util.Collection)} */ + private Collection getLifecycleParticipants(Collection projects) { + Collection lifecycleListeners = new LinkedHashSet(); + + ClassLoader originalClassLoader = Thread.currentThread().getContextClassLoader(); + try { + try { + lifecycleListeners.addAll(myContainer.lookupList(AbstractMavenLifecycleParticipant.class)); + } + catch (ComponentLookupException e) { + // this is just silly, lookupList should return an empty list! + warn("Failed to lookup lifecycle participants", e); + } + + Collection scannedRealms = new HashSet(); + + for (MavenProject project : projects) { + ClassLoader projectRealm = project.getClassRealm(); + + if (projectRealm != null && scannedRealms.add(projectRealm)) { + Thread.currentThread().setContextClassLoader(projectRealm); + + try { + lifecycleListeners.addAll(myContainer.lookupList(AbstractMavenLifecycleParticipant.class)); + } + catch (ComponentLookupException e) { + // this is just silly, lookupList should return an empty list! + warn("Failed to lookup lifecycle participants", e); + } + } + } + } + finally { + Thread.currentThread().setContextClassLoader(originalClassLoader); + } + + return lifecycleListeners; + } + + private static void warn(String message, Throwable e) { + try { + Maven3ServerGlobals.getLogger().warn(new RuntimeException(message, e)); + } + catch (RemoteException e1) { + throw new RuntimeException(e1); + } + } + public MavenExecutionRequest createRequest(File file, List activeProfiles, List inactiveProfiles, List goals) throws RemoteException { //Properties executionProperties = myMavenSettings.getProperties();