Skip to content

Instantly share code, notes, and snippets.

@gamerson
Created August 16, 2016 04:04
Show Gist options
  • Save gamerson/054e101d2bd1e3e2ba6c4e4b501b062b to your computer and use it in GitHub Desktop.
Save gamerson/054e101d2bd1e3e2ba6c4e4b501b062b to your computer and use it in GitHub Desktop.
ArchetypeClient
import java.io.File;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.apache.maven.archetype.ArchetypeGenerationRequest;
import org.apache.maven.archetype.ArchetypeGenerationResult;
import org.apache.maven.archetype.DefaultArchetypeManager;
import org.apache.maven.archetype.common.ArchetypeFilesResolver;
import org.apache.maven.archetype.common.DefaultArchetypeArtifactManager;
import org.apache.maven.archetype.common.DefaultArchetypeFilesResolver;
import org.apache.maven.archetype.downloader.DefaultDownloader;
import org.apache.maven.archetype.generator.DefaultArchetypeGenerator;
import org.apache.maven.archetype.generator.DefaultFilesetArchetypeGenerator;
import org.apache.maven.artifact.factory.DefaultArtifactFactory;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
import org.apache.maven.artifact.repository.DefaultArtifactRepositoryFactory;
import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
import org.apache.maven.artifact.resolver.DefaultArtifactResolver;
import org.apache.maven.artifact.transform.ArtifactTransformation;
import org.apache.maven.artifact.transform.DefaultArtifactTransformationManager;
import org.apache.maven.artifact.transform.LatestArtifactTransformation;
import org.apache.maven.artifact.transform.ReleaseArtifactTransformation;
import org.apache.maven.artifact.transform.SnapshotTransformation;
import org.apache.velocity.runtime.RuntimeConstants;
import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
import org.codehaus.plexus.logging.AbstractLogEnabled;
import org.codehaus.plexus.logging.console.ConsoleLogger;
import org.codehaus.plexus.velocity.DefaultVelocityComponent;
public class ArchetypeClient
{
public static void main( String[] args ) throws Exception
{
DefaultArchetypeManager archetypeManager = new DefaultArchetypeManager();
Field generator = DefaultArchetypeManager.class.getDeclaredField( "generator" );
generator.setAccessible( true );
DefaultArchetypeGenerator defaultArchetypeGenerator = new DefaultArchetypeGenerator();
Field manager = DefaultArchetypeGenerator.class.getDeclaredField( "archetypeArtifactManager" );
manager.setAccessible( true );
DefaultArchetypeArtifactManager defaultArchetypeArtifactManager = new DefaultArchetypeArtifactManager();
Field logger = AbstractLogEnabled.class.getDeclaredField( "logger" );
logger.setAccessible( true );
final ConsoleLogger consoleLogger = new ConsoleLogger( 0, "console" );
logger.set( defaultArchetypeArtifactManager, consoleLogger );
Field downloader = DefaultArchetypeArtifactManager.class.getDeclaredField( "downloader" );
downloader.setAccessible( true );
DefaultDownloader defaultDownloader = new DefaultDownloader();
Field artifactResolver = DefaultDownloader.class.getDeclaredField( "artifactResolver" );
artifactResolver.setAccessible( true );
DefaultArtifactResolver dar = new DefaultArtifactResolver();
Field transformationManager = DefaultArtifactResolver.class.getDeclaredField( "transformationManager" );
transformationManager.setAccessible( true );
DefaultArtifactTransformationManager datm = new DefaultArtifactTransformationManager();
Field artifactTransformations = DefaultArtifactTransformationManager.class.getDeclaredField( "artifactTransformations" );
artifactTransformations.setAccessible( true );
List<ArtifactTransformation> artifactTransformationsValue = new ArrayList<>();
artifactTransformationsValue.add( new LatestArtifactTransformation() );
artifactTransformationsValue.add( new ReleaseArtifactTransformation() );
artifactTransformationsValue.add( new SnapshotTransformation() );
artifactTransformations.set( datm, artifactTransformationsValue );
datm.initialize();
transformationManager.set( dar, datm );
artifactResolver.set( defaultDownloader, dar );
Field artifactFactory = DefaultDownloader.class.getDeclaredField( "artifactFactory" );
artifactFactory.setAccessible( true );
DefaultArtifactFactory defaultArtifactFactory = new DefaultArtifactFactory();
Field artifactHandlerManager = DefaultArtifactFactory.class.getDeclaredField( "artifactHandlerManager" );
artifactHandlerManager.setAccessible( true );
artifactHandlerManager.set( defaultArtifactFactory, new SimpleArtifactHandlerManager() );
artifactFactory.set( defaultDownloader, defaultArtifactFactory );
downloader.set( defaultArchetypeArtifactManager, defaultDownloader );
manager.set( defaultArchetypeGenerator, defaultArchetypeArtifactManager );
Field filesetGenerator = DefaultArchetypeGenerator.class.getDeclaredField( "filesetGenerator" );
filesetGenerator.setAccessible( true );
DefaultFilesetArchetypeGenerator dfag = new DefaultFilesetArchetypeGenerator();
Field archetypeArtifactManager = DefaultFilesetArchetypeGenerator.class.getDeclaredField( "archetypeArtifactManager" );
archetypeArtifactManager.setAccessible( true );
DefaultArchetypeArtifactManager daam = new DefaultArchetypeArtifactManager();
downloader.set( daam, defaultDownloader );
logger.set( daam, consoleLogger );
logger.set( dfag, consoleLogger );
archetypeArtifactManager.set( dfag, daam );
filesetGenerator.set( defaultArchetypeGenerator, dfag );
generator.set( archetypeManager, defaultArchetypeGenerator );
ArchetypeGenerationRequest archetypeGenerationRequest = new ArchetypeGenerationRequest();
archetypeGenerationRequest.setArchetypeArtifactId( "com.liferay.project.templates.mvcportlet" );
archetypeGenerationRequest.setArchetypeGroupId( "com.liferay" );
archetypeGenerationRequest.setArchetypeVersion( "1.0.0" );
archetypeGenerationRequest.setArtifactId( "foo" );
archetypeGenerationRequest.setGroupId( "com.liferay" );
archetypeGenerationRequest.setVersion( "1.0.0" );
archetypeGenerationRequest.setInteractiveMode( false );
archetypeGenerationRequest.setPackage( "com.liferay.foo" );
archetypeGenerationRequest.setOutputDirectory( "target" );
ArtifactRepositoryFactory artifactRepositoryFactory = new DefaultArtifactRepositoryFactory();
ArtifactRepository localRepository = artifactRepositoryFactory.createArtifactRepository( "local", new File("/Users/greg/.m2/repository").toURI().toURL().toExternalForm(), new DefaultRepositoryLayout(), null, null );
archetypeGenerationRequest.setLocalRepository( localRepository );
Properties additionalProperties = new Properties();
additionalProperties.put( "package", "com.liferay.foo" );
additionalProperties.put( "className", "Bar" );
archetypeGenerationRequest.setProperties( additionalProperties );
logger.set( archetypeManager, consoleLogger );
DefaultVelocityComponent defaultVelocityComponent = new DefaultVelocityComponent();
logger.set( defaultVelocityComponent, consoleLogger );
Field properties = DefaultVelocityComponent.class.getDeclaredField( "properties" );
properties.setAccessible( true );
Properties velocityProps = new Properties();
velocityProps.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
velocityProps.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
properties.set( defaultVelocityComponent, velocityProps );
Field velocity = DefaultFilesetArchetypeGenerator.class.getDeclaredField( "velocity" );
velocity.setAccessible( true );
velocity.set( dfag, defaultVelocityComponent );
defaultVelocityComponent.initialize();
DefaultArchetypeFilesResolver defaultArchetypeFilesResolver = new DefaultArchetypeFilesResolver();
Field archetypeFilesResolver = DefaultFilesetArchetypeGenerator.class.getDeclaredField( "archetypeFilesResolver" );
archetypeFilesResolver.setAccessible( true );
archetypeFilesResolver.set( dfag, defaultArchetypeFilesResolver );
ArchetypeGenerationResult result = archetypeManager.generateProjectFromArchetype(archetypeGenerationRequest);
System.out.println( result.getCause() );
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment