Created
September 20, 2021 15:04
-
-
Save mdproctor/f4e4d73640026a5aea1cf17ab0680e4a to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package net.cardosi.mojo; | |
import java.io.File; | |
import java.lang.reflect.Method; | |
import java.nio.file.Files; | |
import java.util.Arrays; | |
import java.util.List; | |
import java.util.Map; | |
import org.apache.maven.DefaultMaven; | |
import org.apache.maven.Maven; | |
import org.apache.maven.execution.DefaultMavenExecutionRequest; | |
import org.apache.maven.execution.DefaultMavenExecutionResult; | |
import org.apache.maven.execution.MavenExecutionRequest; | |
import org.apache.maven.execution.MavenExecutionRequestPopulator; | |
import org.apache.maven.execution.MavenExecutionResult; | |
import org.apache.maven.execution.MavenSession; | |
import org.apache.maven.graph.DefaultGraphBuilder; | |
import org.apache.maven.graph.DefaultProjectDependencyGraph; | |
import org.apache.maven.graph.GraphBuilder; | |
import org.apache.maven.model.Plugin; | |
import org.apache.maven.plugin.ContextEnabled; | |
import org.apache.maven.plugin.Mojo; | |
import org.apache.maven.plugin.MojoExecution; | |
import org.apache.maven.plugin.descriptor.MojoDescriptor; | |
import org.apache.maven.plugin.descriptor.PluginDescriptor; | |
import org.apache.maven.plugin.testing.AbstractMojoTestCase; | |
import org.apache.maven.project.DefaultProjectBuilder; | |
import org.apache.maven.project.DefaultProjectBuildingRequest; | |
import org.apache.maven.project.MavenProject; | |
import org.apache.maven.project.ProjectBuilder; | |
import org.apache.maven.project.ProjectBuildingRequest; | |
import org.apache.maven.project.ProjectBuildingResult; | |
import org.codehaus.plexus.component.annotations.Requirement; | |
import org.eclipse.aether.DefaultRepositorySystemSession; | |
import org.eclipse.aether.RepositorySystemSession; | |
import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory; | |
import org.eclipse.aether.repository.LocalRepository; | |
import org.junit.Test; | |
public class MojoTest | |
extends AbstractMojoTestCase { | |
protected void setUp() throws Exception { | |
// required for mojo lookups to work | |
super.setUp(); | |
} | |
protected void tearDown() | |
throws Exception { | |
// required | |
super.tearDown(); | |
} | |
public static void main(String[] args) throws Exception { | |
MojoTest test = new MojoTest(); | |
test.setUp(); | |
test.testMojoGoal(); | |
} | |
protected MavenSession newMavenSession() { | |
try { | |
MavenExecutionRequest request = new DefaultMavenExecutionRequest(); | |
MavenExecutionResult result = new DefaultMavenExecutionResult(); | |
// populate sensible defaults, including repository basedir and remote repos | |
MavenExecutionRequestPopulator populator; | |
populator = getContainer().lookup( MavenExecutionRequestPopulator.class ); | |
populator.populateDefaults( request ); | |
// this is needed to allow java profiles to get resolved; i.e. avoid during project builds: | |
// [ERROR] Failed to determine Java version for profile java-1.5-detected @ org.apache.commons:commons-parent:22, /Users/alex/.m2/repository/org/apache/commons/commons-parent/22/commons-parent-22.pom, line 909, column 14 | |
request.setSystemProperties( System.getProperties() ); | |
// and this is needed so that the repo session in the maven session | |
// has a repo manager, and it points at the local repo | |
// (cf MavenRepositorySystemUtils.newSession() which is what is otherwise done) | |
DefaultMaven maven = (DefaultMaven) getContainer().lookup(Maven.class); | |
DefaultRepositorySystemSession repoSession = | |
(DefaultRepositorySystemSession) maven.newRepositorySession( request ); | |
repoSession.setLocalRepositoryManager( | |
new SimpleLocalRepositoryManagerFactory().newInstance(repoSession, | |
new LocalRepository(request.getLocalRepository().getBasedir() ))); | |
@SuppressWarnings("deprecation") | |
MavenSession session = new MavenSession( getContainer(), | |
repoSession, | |
request, result ); | |
return session; | |
} catch (Exception e) { | |
throw new RuntimeException(e); | |
} | |
} | |
/** As {@link #lookupConfiguredMojo(MavenProject, String)} but taking the pom file | |
* and creating the {@link MavenProject}. */ | |
protected Mojo lookupConfiguredMojo(File pom, String goal) throws Exception { | |
assertNotNull( pom ); | |
assertTrue( pom.exists() ); | |
MavenSession mavenSession = newMavenSession(); | |
mavenSession.getRequest().setPom(pom); | |
mavenSession.getProjectBuildingRequest().setResolveDependencies(true); | |
DefaultProjectBuilder projectBuilder = (DefaultProjectBuilder) getContainer().lookup(ProjectBuilder.class); | |
ProjectBuildingRequest request = new DefaultProjectBuildingRequest(mavenSession.getProjectBuildingRequest()); | |
ProjectBuildingResult result = projectBuilder.build(pom, request); | |
MavenProject project = result.getProject(); | |
mavenSession.setCurrentProject( project ); | |
mavenSession.setProjects(Arrays.asList(project)); | |
mavenSession.setAllProjects(Arrays.asList(project)); | |
DefaultProjectDependencyGraph dependencyGraph = new DefaultProjectDependencyGraph(mavenSession.getProjects()); | |
mavenSession.setProjectDependencyGraph(dependencyGraph); | |
GraphBuilder gbuilder = getContainer().lookup(GraphBuilder.class); | |
//((DefaultGraphBuilder)gbuilder)..getProjectsForMavenReactor(); | |
gbuilder.build(mavenSession); | |
List<MavenProject> mavenProjects = mavenSession.getProjects(); | |
Method method = projectBuilder.getClass().getDeclaredMethod("resolveDependencies", MavenProject.class, RepositorySystemSession.class); | |
method.setAccessible(true); | |
for (MavenProject mavenProject : mavenProjects) { | |
method.invoke(projectBuilder, mavenProject, mavenSession.getRepositorySession()); | |
} | |
final MojoExecution mojoExecution = newMojoExecution(goal); | |
MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor(); | |
PluginDescriptor pluginDescriptor = mojoDescriptor.getPluginDescriptor(); | |
Plugin plugin = mavenSession.getCurrentProject().getBuild().getPluginsAsMap().get(pluginDescriptor.getGroupId() + ":" + pluginDescriptor.getArtifactId()); | |
pluginDescriptor.setPlugin(plugin); | |
AbstractBuildMojo mojo = (AbstractBuildMojo) lookupConfiguredMojo( mavenSession, newMojoExecution( goal ) ); | |
Map<String, Object> pluginContext = mojo.mavenSession.getPluginContext(pluginDescriptor, mavenSession.getCurrentProject()); | |
pluginContext.put( "project", mavenSession.getCurrentProject() ); | |
pluginContext.put( "pluginDescriptor", pluginDescriptor ); | |
( (ContextEnabled) mojo ).setPluginContext(pluginContext); | |
return mojo; | |
} | |
@Test | |
// @Ignore | |
public void testMojoGoal() throws Exception | |
{ | |
File testPom = new File(getBasedir(), | |
"target/test-classes/hello-world-single/pom.xml" ); | |
Files.exists(testPom.toPath()); | |
final WatchMojo mojo = (WatchMojo) this.lookupConfiguredMojo(testPom, "watch"); | |
//WatchMojo mojo = (WatchMojo) lookupMojo( "watch", testPom ); | |
mojo.execute(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment