mirror of https://github.com/apache/maven.git
o adding jochen's MavenEmbedder2 as reference, i won't be replacing the embedder with it but I will cherry pick
from it. Thanks for the contribution and I hope you'll help with some smaller patches! :-) git-svn-id: https://svn.apache.org/repos/asf/maven/components/trunk@379670 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
eab65e11ad
commit
c100cbea1c
|
@ -0,0 +1,588 @@
|
|||
/*
|
||||
* Copyright (c) 2006 Your Corporation. All Rights Reserved.
|
||||
*/
|
||||
package org.apache.maven.embedder;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.Properties;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
import org.apache.maven.Maven;
|
||||
import org.apache.maven.SettingsConfigurationException;
|
||||
import org.apache.maven.artifact.manager.WagonManager;
|
||||
import org.apache.maven.artifact.repository.ArtifactRepository;
|
||||
import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
|
||||
import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
|
||||
import org.apache.maven.artifact.repository.DefaultArtifactRepository;
|
||||
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
|
||||
import org.apache.maven.cli.BatchModeDownloadMonitor;
|
||||
import org.apache.maven.cli.ConsoleDownloadMonitor;
|
||||
import org.apache.maven.execution.DefaultMavenExecutionRequest;
|
||||
import org.apache.maven.execution.MavenExecutionRequest;
|
||||
import org.apache.maven.execution.ReactorManager;
|
||||
import org.apache.maven.monitor.event.DefaultEventDispatcher;
|
||||
import org.apache.maven.monitor.event.DefaultEventMonitor;
|
||||
import org.apache.maven.monitor.event.EventDispatcher;
|
||||
import org.apache.maven.plugin.Mojo;
|
||||
import org.apache.maven.profiles.DefaultProfileManager;
|
||||
import org.apache.maven.profiles.ProfileManager;
|
||||
import org.apache.maven.reactor.MavenExecutionException;
|
||||
import org.apache.maven.settings.MavenSettingsBuilder;
|
||||
import org.apache.maven.settings.RuntimeInfo;
|
||||
import org.apache.maven.settings.Settings;
|
||||
import org.codehaus.plexus.PlexusContainerException;
|
||||
import org.codehaus.plexus.component.repository.exception.ComponentLifecycleException;
|
||||
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
|
||||
import org.codehaus.plexus.embed.Embedder;
|
||||
import org.codehaus.plexus.logging.Logger;
|
||||
import org.codehaus.plexus.logging.LoggerManager;
|
||||
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
|
||||
|
||||
|
||||
/** Replacement for the {@link MavenEmbedder}.
|
||||
*/
|
||||
public class MavenEmbedder2 {
|
||||
private final MavenEmbedderLogger logger;
|
||||
|
||||
private Embedder embedder;
|
||||
|
||||
private boolean debug, showErrors, batchMode, suppressPluginRegistry;
|
||||
private boolean forcePluginUpdates, forcePluginUpdates2;
|
||||
private boolean suppressPluginUpdates, offline, updateSnapshots;
|
||||
private boolean checksumFailurePolicy, checksumWarningPolicy;
|
||||
private boolean nonRecursive, failFast, failAtEnd, failNever;
|
||||
private boolean reactor;
|
||||
private String activateProfiles;
|
||||
private Properties executionProperties;
|
||||
private File userSettingsFile, alternatePomFile;
|
||||
|
||||
/** Creates a new instance with the given logger.
|
||||
*/
|
||||
public MavenEmbedder2(MavenEmbedderLogger pLogger) {
|
||||
logger = pLogger;
|
||||
}
|
||||
|
||||
/** Returns, whether debugging mode is on.
|
||||
*/
|
||||
public boolean isDebug() {
|
||||
return debug;
|
||||
}
|
||||
|
||||
/** Sets, whether debugging mode is on.
|
||||
*/
|
||||
public void setDebug(boolean pDebug) {
|
||||
debug = pDebug;
|
||||
}
|
||||
|
||||
/** Returns, whether stack traces are being shown.
|
||||
*/
|
||||
public boolean isShowErrors() {
|
||||
return showErrors;
|
||||
}
|
||||
|
||||
/** Sets, whether stack traces are being shown.
|
||||
*/
|
||||
public void setShowErrors(boolean pShowErrors) {
|
||||
showErrors = pShowErrors;
|
||||
}
|
||||
|
||||
/** Returns the set of predefined properties.
|
||||
*/
|
||||
public Properties getExecutionProperties() {
|
||||
return executionProperties;
|
||||
}
|
||||
|
||||
/** Sets the set of predefined properties.
|
||||
*/
|
||||
public void setExecutionProperties(Properties pExecutionProperties) {
|
||||
executionProperties = pExecutionProperties;
|
||||
}
|
||||
|
||||
/** Returns the location of an alternate file with
|
||||
* user settings.
|
||||
*/
|
||||
public File getUserSettingsFile() {
|
||||
return userSettingsFile;
|
||||
}
|
||||
|
||||
/** Sets the location of an alternate file with
|
||||
* user settings.
|
||||
*/
|
||||
public void setUserSettingsFile(File pUserSettingsPath) {
|
||||
userSettingsFile = pUserSettingsPath;
|
||||
}
|
||||
|
||||
/** Returns, whether batch mode is on.
|
||||
*/
|
||||
public boolean isBatchMode() {
|
||||
return batchMode;
|
||||
}
|
||||
|
||||
/** Sets, whether batch mode is on.
|
||||
*/
|
||||
public void setBatchMode(boolean pBatchMode) {
|
||||
batchMode = pBatchMode;
|
||||
}
|
||||
|
||||
/** Returns, whether the plugin registry is being suppressed.
|
||||
*/
|
||||
public boolean isSuppressPluginRegistry() {
|
||||
return suppressPluginRegistry;
|
||||
}
|
||||
|
||||
/** Sets, whether the plugin registry is being suppressed.
|
||||
*/
|
||||
public void setSuppressPluginRegistry(boolean pSuppressPluginRegistry) {
|
||||
suppressPluginRegistry = pSuppressPluginRegistry;
|
||||
}
|
||||
|
||||
/** Returns, whether plugin updates are being forced.
|
||||
*/
|
||||
public boolean isForcePluginUpdates() {
|
||||
return forcePluginUpdates;
|
||||
}
|
||||
|
||||
/** Sets, whether plugin updates are being forced.
|
||||
*/
|
||||
public void setForcePluginUpdates(boolean pForcePluginUpdates) {
|
||||
forcePluginUpdates = pForcePluginUpdates;
|
||||
}
|
||||
|
||||
/** Returns, whether plugin updates are being forced2.
|
||||
*/
|
||||
public boolean isForcePluginUpdates2() {
|
||||
return forcePluginUpdates2;
|
||||
}
|
||||
|
||||
/** Sets, whether plugin updates are being forced2.
|
||||
*/
|
||||
public void setForcePluginUpdates2(boolean pForcePluginUpdates2) {
|
||||
forcePluginUpdates2 = pForcePluginUpdates2;
|
||||
}
|
||||
|
||||
/** Returns a definition of profiles, which are being
|
||||
* activated.
|
||||
*/
|
||||
public String getActivateProfiles() {
|
||||
return activateProfiles;
|
||||
}
|
||||
|
||||
/** Sets a definition of profiles, which are being
|
||||
* activated.
|
||||
*/
|
||||
public void setActivateProfiles(String pActivateProfiles) {
|
||||
activateProfiles = pActivateProfiles;
|
||||
}
|
||||
|
||||
/** Returns, whether offline mode is enabled.
|
||||
*/
|
||||
public boolean isOffline() {
|
||||
return offline;
|
||||
}
|
||||
|
||||
/** Sets, whether offline mode is enabled.
|
||||
*/
|
||||
public void setOffline(boolean pOffline) {
|
||||
offline = pOffline;
|
||||
}
|
||||
|
||||
/** Returns, whether snapshots are being updated.
|
||||
*/
|
||||
public boolean isUpdateSnapshots() {
|
||||
return updateSnapshots;
|
||||
}
|
||||
|
||||
/** Sets, whether snapshots are being updated.
|
||||
*/
|
||||
public void setUpdateSnapshots(boolean pUpdateSnapshots) {
|
||||
updateSnapshots = pUpdateSnapshots;
|
||||
}
|
||||
|
||||
/** Returns, whether wrong checksums are considered a
|
||||
* failure.
|
||||
*/
|
||||
public boolean isChecksumFailurePolicy() {
|
||||
return checksumFailurePolicy;
|
||||
}
|
||||
|
||||
/** Sets, whether wrong checksums are considered a
|
||||
* failure.
|
||||
*/
|
||||
public void setChecksumFailurePolicy(boolean pChecksumFailurePolicy) {
|
||||
checksumFailurePolicy = pChecksumFailurePolicy;
|
||||
}
|
||||
|
||||
/** Returns, whether wrong checksums are considered a
|
||||
* warning.
|
||||
*/
|
||||
public boolean isChecksumWarningPolicy() {
|
||||
return checksumWarningPolicy;
|
||||
}
|
||||
|
||||
/** Sets, whether wrong checksums are considered a
|
||||
* warning.
|
||||
*/
|
||||
public void setChecksumWarningPolicy(boolean pChecksumWarningPolicy) {
|
||||
checksumWarningPolicy = pChecksumWarningPolicy;
|
||||
}
|
||||
|
||||
/** Returns, whether calling submodules is disabled.
|
||||
*/
|
||||
public boolean isNonRecursive() {
|
||||
return nonRecursive;
|
||||
}
|
||||
|
||||
/** Sets, whether calling submodules is disabled.
|
||||
*/
|
||||
public void setNonRecursive(boolean pNonRecursive) {
|
||||
nonRecursive = pNonRecursive;
|
||||
}
|
||||
|
||||
/** Returns, whether failures will abort the program.
|
||||
*/
|
||||
public boolean isFailFast() {
|
||||
return failFast;
|
||||
}
|
||||
|
||||
/** Sets, whether failures will abort the program.
|
||||
*/
|
||||
public void setFailFast(boolean pFailFast) {
|
||||
failFast = pFailFast;
|
||||
}
|
||||
|
||||
/** Returns, whether failures are reported at the end.
|
||||
*/
|
||||
public boolean isFailAtEnd() {
|
||||
return failAtEnd;
|
||||
}
|
||||
|
||||
/** Sets, whether failures are reported at the end.
|
||||
*/
|
||||
public void setFailAtEnd(boolean pFailAtEnd) {
|
||||
failAtEnd = pFailAtEnd;
|
||||
}
|
||||
|
||||
/** Returns, whether failures are suppressed.
|
||||
*/
|
||||
public boolean isFailNever() {
|
||||
return failNever;
|
||||
}
|
||||
|
||||
/** Sets, whether failures are suppressed.
|
||||
*/
|
||||
public void setFailNever(boolean pFailNever) {
|
||||
failNever = pFailNever;
|
||||
}
|
||||
|
||||
/** Returns, whether the reactor is on.
|
||||
*/
|
||||
public boolean isReactor() {
|
||||
return reactor;
|
||||
}
|
||||
|
||||
/** Sets, whether the reactor is on.
|
||||
*/
|
||||
public void setReactor(boolean pReactor) {
|
||||
reactor = pReactor;
|
||||
}
|
||||
|
||||
/** Returns the location of an alternate POM file.
|
||||
*/
|
||||
public File getAlternatePomFile() {
|
||||
return alternatePomFile;
|
||||
}
|
||||
|
||||
/** Sets the location of an alternate POM file.
|
||||
*/
|
||||
public void setAlternatePomFile(File pAlternatePomFile) {
|
||||
alternatePomFile = pAlternatePomFile;
|
||||
}
|
||||
|
||||
/** Returns, whether plugin updates are being suppressed.
|
||||
*/
|
||||
public boolean isSuppressPluginUpdates() {
|
||||
return suppressPluginUpdates;
|
||||
}
|
||||
|
||||
/** Sets, whether plugin updates are being suppressed.
|
||||
*/
|
||||
public void setSuppressPluginUpdates(boolean pSuppressPluginUpdates) {
|
||||
suppressPluginUpdates = pSuppressPluginUpdates;
|
||||
}
|
||||
|
||||
private Settings buildSettings()
|
||||
throws ComponentLookupException, SettingsConfigurationException
|
||||
{
|
||||
|
||||
Settings settings = null;
|
||||
|
||||
MavenSettingsBuilder settingsBuilder = (MavenSettingsBuilder) embedder.lookup( MavenSettingsBuilder.ROLE );
|
||||
|
||||
try
|
||||
{
|
||||
if ( userSettingsFile != null )
|
||||
{
|
||||
|
||||
if ( userSettingsFile.exists() && !userSettingsFile.isDirectory() )
|
||||
{
|
||||
settings = settingsBuilder.buildSettings( userSettingsFile );
|
||||
}
|
||||
else
|
||||
{
|
||||
logger.warn( "WARNING: Alternate user settings file: " + userSettingsFile +
|
||||
" is invalid. Using default path." );
|
||||
}
|
||||
}
|
||||
|
||||
if ( settings == null )
|
||||
{
|
||||
settings = settingsBuilder.buildSettings();
|
||||
}
|
||||
}
|
||||
catch ( IOException e )
|
||||
{
|
||||
throw new SettingsConfigurationException( "Error reading settings file", e );
|
||||
}
|
||||
catch ( XmlPullParserException e )
|
||||
{
|
||||
throw new SettingsConfigurationException( e.getMessage(), e.getDetail(), e.getLineNumber(),
|
||||
e.getColumnNumber() );
|
||||
}
|
||||
|
||||
// why aren't these part of the runtime info? jvz.
|
||||
|
||||
if ( isBatchMode() )
|
||||
{
|
||||
settings.setInteractiveMode( false );
|
||||
}
|
||||
|
||||
if ( isSuppressPluginRegistry() )
|
||||
{
|
||||
settings.setUsePluginRegistry( false );
|
||||
}
|
||||
|
||||
// Create settings runtime info
|
||||
|
||||
settings.setRuntimeInfo( createRuntimeInfo( settings ) );
|
||||
|
||||
return settings;
|
||||
}
|
||||
|
||||
private RuntimeInfo createRuntimeInfo( Settings settings )
|
||||
{
|
||||
RuntimeInfo runtimeInfo = new RuntimeInfo( settings );
|
||||
|
||||
if ( isForcePluginUpdates() || isForcePluginUpdates2() )
|
||||
{
|
||||
runtimeInfo.setPluginUpdateOverride( Boolean.TRUE );
|
||||
}
|
||||
else if ( isSuppressPluginUpdates() )
|
||||
{
|
||||
runtimeInfo.setPluginUpdateOverride( Boolean.FALSE );
|
||||
}
|
||||
|
||||
return runtimeInfo;
|
||||
}
|
||||
|
||||
/** Executes the given set of goals in the given
|
||||
* directory.
|
||||
*/
|
||||
public void execute( String[] pGoals, File pBaseDir )
|
||||
throws PlexusContainerException, ComponentLookupException,
|
||||
SettingsConfigurationException, MavenExecutionException
|
||||
{
|
||||
embedder = new Embedder();
|
||||
EventDispatcher eventDispatcher = new DefaultEventDispatcher();
|
||||
embedder.start();
|
||||
|
||||
Settings settings = buildSettings();
|
||||
|
||||
Maven maven = null;
|
||||
MavenExecutionRequest request = null;
|
||||
final LoggerManager loggerManager;
|
||||
|
||||
// logger must be created first
|
||||
loggerManager = (LoggerManager) embedder.lookup( LoggerManager.ROLE );
|
||||
|
||||
try {
|
||||
if ( debug )
|
||||
{
|
||||
loggerManager.setThreshold( Logger.LEVEL_DEBUG );
|
||||
}
|
||||
|
||||
ProfileManager profileManager = new DefaultProfileManager( embedder.getContainer() );
|
||||
|
||||
String profilesLine = getActivateProfiles();
|
||||
if ( profilesLine != null )
|
||||
{
|
||||
StringTokenizer profileTokens = new StringTokenizer( profilesLine, "," );
|
||||
|
||||
while ( profileTokens.hasMoreTokens() )
|
||||
{
|
||||
String profileAction = profileTokens.nextToken().trim();
|
||||
|
||||
if ( profileAction.startsWith( "-" ) )
|
||||
{
|
||||
profileManager.explicitlyDeactivate( profileAction.substring( 1 ) );
|
||||
}
|
||||
else if ( profileAction.startsWith( "+" ) )
|
||||
{
|
||||
profileManager.explicitlyActivate( profileAction.substring( 1 ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
// TODO: deprecate this eventually!
|
||||
profileManager.explicitlyActivate( profileAction );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
request = createRequest( settings, pGoals, eventDispatcher,
|
||||
loggerManager, profileManager, pBaseDir );
|
||||
|
||||
setProjectFileOptions( request );
|
||||
|
||||
maven = createMavenInstance( settings.isInteractiveMode() );
|
||||
}
|
||||
finally
|
||||
{
|
||||
try
|
||||
{
|
||||
embedder.release( loggerManager );
|
||||
}
|
||||
catch ( ComponentLifecycleException e )
|
||||
{
|
||||
logger.fatalError( "Error releasing logging manager", e );
|
||||
}
|
||||
}
|
||||
|
||||
maven.execute( request );
|
||||
}
|
||||
|
||||
|
||||
private MavenExecutionRequest createRequest( Settings settings, String[] goals,
|
||||
EventDispatcher eventDispatcher, LoggerManager loggerManager,
|
||||
ProfileManager profileManager,
|
||||
File baseDir)
|
||||
throws ComponentLookupException
|
||||
{
|
||||
MavenExecutionRequest request;
|
||||
|
||||
ArtifactRepository localRepository = createLocalRepository( settings );
|
||||
|
||||
request = new DefaultMavenExecutionRequest( localRepository, settings, eventDispatcher,
|
||||
Arrays.asList(goals), baseDir.getPath(), profileManager,
|
||||
executionProperties, showErrors );
|
||||
|
||||
// TODO [BP]: do we set one per mojo? where to do it?
|
||||
Logger log = loggerManager.getLoggerForComponent( Mojo.ROLE );
|
||||
|
||||
if ( log != null )
|
||||
{
|
||||
request.addEventMonitor( new DefaultEventMonitor( log ) );
|
||||
}
|
||||
|
||||
if ( isNonRecursive() )
|
||||
{
|
||||
request.setRecursive( false );
|
||||
}
|
||||
|
||||
if ( isFailFast() )
|
||||
{
|
||||
request.setFailureBehavior( ReactorManager.FAIL_FAST );
|
||||
}
|
||||
else if ( isFailAtEnd() )
|
||||
{
|
||||
request.setFailureBehavior( ReactorManager.FAIL_AT_END );
|
||||
}
|
||||
else if ( isFailNever() )
|
||||
{
|
||||
request.setFailureBehavior( ReactorManager.FAIL_NEVER );
|
||||
}
|
||||
|
||||
return request;
|
||||
}
|
||||
|
||||
private void setProjectFileOptions( MavenExecutionRequest request )
|
||||
{
|
||||
if ( isReactor() )
|
||||
{
|
||||
request.setReactorActive( true );
|
||||
}
|
||||
else if ( getAlternatePomFile() != null )
|
||||
{
|
||||
request.setPomFile( getAlternatePomFile().getPath() );
|
||||
}
|
||||
}
|
||||
|
||||
private Maven createMavenInstance( boolean interactive )
|
||||
throws ComponentLookupException
|
||||
{
|
||||
// TODO [BP]: doing this here as it is CLI specific, though it doesn't feel like the right place (likewise logger).
|
||||
WagonManager wagonManager = (WagonManager) embedder.lookup( WagonManager.ROLE );
|
||||
if ( interactive )
|
||||
{
|
||||
wagonManager.setDownloadMonitor( new ConsoleDownloadMonitor() );
|
||||
}
|
||||
else
|
||||
{
|
||||
wagonManager.setDownloadMonitor( new BatchModeDownloadMonitor() );
|
||||
}
|
||||
|
||||
wagonManager.setInteractive( interactive );
|
||||
|
||||
return (Maven) embedder.lookup( Maven.ROLE );
|
||||
}
|
||||
|
||||
private ArtifactRepository createLocalRepository( Settings settings )
|
||||
throws ComponentLookupException
|
||||
{
|
||||
// TODO: release
|
||||
// TODO: something in plexus to show all active hooks?
|
||||
ArtifactRepositoryLayout repositoryLayout =
|
||||
(ArtifactRepositoryLayout) embedder.lookup( ArtifactRepositoryLayout.ROLE, "default" );
|
||||
|
||||
ArtifactRepositoryFactory artifactRepositoryFactory =
|
||||
(ArtifactRepositoryFactory) embedder.lookup( ArtifactRepositoryFactory.ROLE );
|
||||
|
||||
String url = settings.getLocalRepository();
|
||||
|
||||
if ( !url.startsWith( "file:" ) )
|
||||
{
|
||||
url = "file://" + url;
|
||||
}
|
||||
|
||||
ArtifactRepository localRepository = new DefaultArtifactRepository( "local", url, repositoryLayout );
|
||||
|
||||
boolean snapshotPolicySet = false;
|
||||
|
||||
if ( isOffline() )
|
||||
{
|
||||
settings.setOffline( true );
|
||||
|
||||
snapshotPolicySet = true;
|
||||
}
|
||||
|
||||
if ( !snapshotPolicySet && isUpdateSnapshots() )
|
||||
{
|
||||
artifactRepositoryFactory.setGlobalUpdatePolicy( ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS );
|
||||
}
|
||||
|
||||
if ( isChecksumFailurePolicy() )
|
||||
{
|
||||
logger.info( "+ Enabling strict checksum verification on all artifact downloads." );
|
||||
|
||||
artifactRepositoryFactory.setGlobalChecksumPolicy( ArtifactRepositoryPolicy.CHECKSUM_POLICY_FAIL );
|
||||
}
|
||||
else if ( isChecksumWarningPolicy() )
|
||||
{
|
||||
System.out.println( "+ Disabling strict checksum verification on all artifact downloads." );
|
||||
|
||||
artifactRepositoryFactory.setGlobalChecksumPolicy( ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN );
|
||||
}
|
||||
|
||||
return localRepository;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue