aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/DefaultBuildPluginManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/DefaultBuildPluginManager.java')
-rw-r--r--framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/DefaultBuildPluginManager.java244
1 files changed, 244 insertions, 0 deletions
diff --git a/framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/DefaultBuildPluginManager.java b/framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/DefaultBuildPluginManager.java
new file mode 100644
index 00000000..8145bd58
--- /dev/null
+++ b/framework/src/maven/apache-maven-3.3.3/maven-core/src/main/java/org/apache/maven/plugin/DefaultBuildPluginManager.java
@@ -0,0 +1,244 @@
+package org.apache.maven.plugin;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.util.List;
+
+import org.apache.maven.execution.MavenSession;
+import org.apache.maven.execution.MojoExecutionEvent;
+import org.apache.maven.execution.MojoExecutionListener;
+import org.apache.maven.execution.scope.internal.MojoExecutionScope;
+import org.apache.maven.model.Plugin;
+import org.apache.maven.plugin.descriptor.MojoDescriptor;
+import org.apache.maven.plugin.descriptor.PluginDescriptor;
+import org.apache.maven.project.MavenProject;
+import org.codehaus.plexus.classworlds.realm.ClassRealm;
+import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.component.annotations.Requirement;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.repository.RemoteRepository;
+
+// TODO: the antrun plugin has its own configurator, the only plugin that does. might need to think about how that works
+// TODO: remove the coreArtifactFilterManager
+
+@Component( role = BuildPluginManager.class )
+public class DefaultBuildPluginManager
+ implements BuildPluginManager
+{
+
+ @Requirement
+ private MavenPluginManager mavenPluginManager;
+
+ @Requirement
+ private LegacySupport legacySupport;
+
+ @Requirement
+ private MojoExecutionScope scope;
+
+ private MojoExecutionListener mojoExecutionListener;
+
+ // this tricks plexus-component-metadata generate required metadata
+ @Requirement( role = MojoExecutionListener.class )
+ private List<MojoExecutionListener> mojoExecutionListeners;
+
+ public void setMojoExecutionListeners( final List<MojoExecutionListener> listeners )
+ {
+ this.mojoExecutionListeners = listeners;
+ this.mojoExecutionListener = new CompoundMojoExecutionListener( listeners );
+ }
+
+ /**
+ * @param plugin
+ * @param repositories
+ * @param session
+ * @return PluginDescriptor The component descriptor for the Maven plugin.
+ * @throws PluginNotFoundException The plugin could not be found in any repositories.
+ * @throws PluginResolutionException The plugin could be found but could not be resolved.
+ * @throws InvalidPluginDescriptorException
+ */
+ public PluginDescriptor loadPlugin( Plugin plugin, List<RemoteRepository> repositories,
+ RepositorySystemSession session )
+ throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException,
+ InvalidPluginDescriptorException
+ {
+ return mavenPluginManager.getPluginDescriptor( plugin, repositories, session );
+ }
+
+ // ----------------------------------------------------------------------
+ // Mojo execution
+ // ----------------------------------------------------------------------
+
+ public void executeMojo( MavenSession session, MojoExecution mojoExecution )
+ throws MojoFailureException, MojoExecutionException, PluginConfigurationException, PluginManagerException
+ {
+ MavenProject project = session.getCurrentProject();
+
+ MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor();
+
+ Mojo mojo = null;
+
+ ClassRealm pluginRealm;
+ try
+ {
+ pluginRealm = getPluginRealm( session, mojoDescriptor.getPluginDescriptor() );
+ }
+ catch ( PluginResolutionException e )
+ {
+ throw new PluginExecutionException( mojoExecution, project, e );
+ }
+
+ ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader( pluginRealm );
+
+ MavenSession oldSession = legacySupport.getSession();
+
+ scope.enter();
+
+ try
+ {
+ scope.seed( MavenProject.class, project );
+ scope.seed( MojoExecution.class, mojoExecution );
+
+ mojo = mavenPluginManager.getConfiguredMojo( Mojo.class, session, mojoExecution );
+
+ legacySupport.setSession( session );
+
+ // NOTE: DuplicateArtifactAttachmentException is currently unchecked, so be careful removing this try/catch!
+ // This is necessary to avoid creating compatibility problems for existing plugins that use
+ // MavenProjectHelper.attachArtifact(..).
+ try
+ {
+ MojoExecutionEvent mojoExecutionEvent = new MojoExecutionEvent( session, project, mojoExecution, mojo );
+
+ mojoExecutionListener.beforeMojoExecution( mojoExecutionEvent );
+
+ mojo.execute();
+
+ mojoExecutionListener.afterMojoExecutionSuccess( mojoExecutionEvent );
+ }
+ catch ( ClassCastException e )
+ {
+ // to be processed in the outer catch block
+ throw e;
+ }
+ catch ( RuntimeException e )
+ {
+ throw new PluginExecutionException( mojoExecution, project, e );
+ }
+ }
+ catch ( PluginContainerException e )
+ {
+ mojoExecutionListener.afterExecutionFailure( new MojoExecutionEvent( session, project, mojoExecution, mojo,
+ e ) );
+
+ throw new PluginExecutionException( mojoExecution, project, e );
+ }
+ catch ( NoClassDefFoundError e )
+ {
+ mojoExecutionListener.afterExecutionFailure( new MojoExecutionEvent( session, project, mojoExecution, mojo,
+ e ) );
+
+ ByteArrayOutputStream os = new ByteArrayOutputStream( 1024 );
+ PrintStream ps = new PrintStream( os );
+ ps.println( "A required class was missing while executing " + mojoDescriptor.getId() + ": "
+ + e.getMessage() );
+ pluginRealm.display( ps );
+
+ Exception wrapper = new PluginContainerException( mojoDescriptor, pluginRealm, os.toString(), e );
+
+ throw new PluginExecutionException( mojoExecution, project, wrapper );
+ }
+ catch ( LinkageError e )
+ {
+ mojoExecutionListener.afterExecutionFailure( new MojoExecutionEvent( session, project, mojoExecution, mojo,
+ e ) );
+
+ ByteArrayOutputStream os = new ByteArrayOutputStream( 1024 );
+ PrintStream ps = new PrintStream( os );
+ ps.println( "An API incompatibility was encountered while executing " + mojoDescriptor.getId() + ": "
+ + e.getClass().getName() + ": " + e.getMessage() );
+ pluginRealm.display( ps );
+
+ Exception wrapper = new PluginContainerException( mojoDescriptor, pluginRealm, os.toString(), e );
+
+ throw new PluginExecutionException( mojoExecution, project, wrapper );
+ }
+ catch ( ClassCastException e )
+ {
+ mojoExecutionListener.afterExecutionFailure( new MojoExecutionEvent( session, project, mojoExecution, mojo,
+ e ) );
+
+ ByteArrayOutputStream os = new ByteArrayOutputStream( 1024 );
+ PrintStream ps = new PrintStream( os );
+ ps.println( "A type incompatibility occured while executing " + mojoDescriptor.getId() + ": "
+ + e.getMessage() );
+ pluginRealm.display( ps );
+
+ throw new PluginExecutionException( mojoExecution, project, os.toString(), e );
+ }
+ catch ( RuntimeException e )
+ {
+ mojoExecutionListener.afterExecutionFailure( new MojoExecutionEvent( session, project, mojoExecution, mojo,
+ e ) );
+
+ throw e;
+ }
+ finally
+ {
+ mavenPluginManager.releaseMojo( mojo, mojoExecution );
+
+ scope.exit();
+
+ Thread.currentThread().setContextClassLoader( oldClassLoader );
+
+ legacySupport.setSession( oldSession );
+ }
+ }
+
+ /**
+ * TODO pluginDescriptor classRealm and artifacts are set as a side effect of this
+ * call, which is not nice.
+ * @throws PluginResolutionException
+ */
+ public ClassRealm getPluginRealm( MavenSession session, PluginDescriptor pluginDescriptor )
+ throws PluginResolutionException, PluginManagerException
+ {
+ ClassRealm pluginRealm = pluginDescriptor.getClassRealm();
+ if ( pluginRealm != null )
+ {
+ return pluginRealm;
+ }
+
+ mavenPluginManager.setupPluginRealm( pluginDescriptor, session, null, null, null );
+
+ return pluginDescriptor.getClassRealm();
+ }
+
+ public MojoDescriptor getMojoDescriptor( Plugin plugin, String goal, List<RemoteRepository> repositories,
+ RepositorySystemSession session )
+ throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException,
+ MojoNotFoundException, InvalidPluginDescriptorException
+ {
+ return mavenPluginManager.getMojoDescriptor( plugin, goal, repositories, session );
+ }
+
+}