[MNG-4892] Use of --log-file doesn't capture all output, e.g. from maven-antrun-plugin

git-svn-id: https://svn.apache.org/repos/asf/maven/maven-3/trunk@1032976 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Benjamin Bentmann 2010-11-09 13:09:51 +00:00
parent 32b45f5ae8
commit a77e4c2ebf
3 changed files with 120 additions and 85 deletions

View File

@ -164,8 +164,7 @@ public final class CLIReportingUtils
InputStream resourceAsStream = null; InputStream resourceAsStream = null;
try try
{ {
resourceAsStream = resourceAsStream = MavenCli.class.getResourceAsStream( "/org/apache/maven/messages/build.properties" );
MavenCli.class.getClassLoader().getResourceAsStream( "org/apache/maven/messages/build.properties" );
if ( resourceAsStream != null ) if ( resourceAsStream != null )
{ {
@ -184,8 +183,13 @@ public final class CLIReportingUtils
return properties; return properties;
} }
public static void showError( Logger logger, String message, Exception e, boolean showStackTrace ) public static void showError( Logger logger, String message, Throwable e, boolean showStackTrace )
{ {
if ( logger == null )
{
logger = new PrintStreamLogger( System.out );
}
if ( showStackTrace ) if ( showStackTrace )
{ {
logger.error( message, e ); logger.error( message, e );

View File

@ -39,6 +39,7 @@ import org.apache.maven.exception.DefaultExceptionHandler;
import org.apache.maven.exception.ExceptionHandler; import org.apache.maven.exception.ExceptionHandler;
import org.apache.maven.exception.ExceptionSummary; import org.apache.maven.exception.ExceptionSummary;
import org.apache.maven.execution.DefaultMavenExecutionRequest; import org.apache.maven.execution.DefaultMavenExecutionRequest;
import org.apache.maven.execution.ExecutionListener;
import org.apache.maven.execution.MavenExecutionRequest; import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.execution.MavenExecutionRequestPopulator; import org.apache.maven.execution.MavenExecutionRequestPopulator;
import org.apache.maven.execution.MavenExecutionResult; import org.apache.maven.execution.MavenExecutionResult;
@ -52,12 +53,14 @@ import org.apache.maven.settings.building.SettingsBuilder;
import org.apache.maven.settings.building.SettingsBuildingRequest; import org.apache.maven.settings.building.SettingsBuildingRequest;
import org.apache.maven.settings.building.SettingsBuildingResult; import org.apache.maven.settings.building.SettingsBuildingResult;
import org.apache.maven.settings.building.SettingsProblem; import org.apache.maven.settings.building.SettingsProblem;
import org.apache.maven.settings.building.SettingsSource;
import org.codehaus.plexus.ContainerConfiguration; import org.codehaus.plexus.ContainerConfiguration;
import org.codehaus.plexus.DefaultContainerConfiguration; import org.codehaus.plexus.DefaultContainerConfiguration;
import org.codehaus.plexus.DefaultPlexusContainer; import org.codehaus.plexus.DefaultPlexusContainer;
import org.codehaus.plexus.PlexusContainer; import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.classworlds.ClassWorld; import org.codehaus.plexus.classworlds.ClassWorld;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException; import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.util.StringUtils; import org.codehaus.plexus.util.StringUtils;
import org.sonatype.aether.transfer.TransferListener; import org.sonatype.aether.transfer.TransferListener;
import org.sonatype.plexus.components.cipher.DefaultPlexusCipher; import org.sonatype.plexus.components.cipher.DefaultPlexusCipher;
@ -94,7 +97,7 @@ public class MavenCli
// Per-instance container supports fast embedded execution of core ITs // Per-instance container supports fast embedded execution of core ITs
private DefaultPlexusContainer container; private DefaultPlexusContainer container;
private PrintStreamLogger logger; private Logger logger;
private ModelProcessor modelProcessor; private ModelProcessor modelProcessor;
@ -141,12 +144,30 @@ public class MavenCli
// This supports painless invocation by the Verifier during embedded execution of the core ITs // This supports painless invocation by the Verifier during embedded execution of the core ITs
public int doMain( String[] args, String workingDirectory, PrintStream stdout, PrintStream stderr ) public int doMain( String[] args, String workingDirectory, PrintStream stdout, PrintStream stderr )
{ {
CliRequest cliRequest = new CliRequest( args, classWorld ); PrintStream oldout = System.out;
cliRequest.workingDirectory = workingDirectory; PrintStream olderr = System.err;
cliRequest.stdout = stdout;
cliRequest.stderr = stderr;
return doMain( cliRequest ); try
{
if ( stdout != null )
{
System.setOut( stdout );
}
if ( stderr != null )
{
System.setErr( stderr );
}
CliRequest cliRequest = new CliRequest( args, classWorld );
cliRequest.workingDirectory = workingDirectory;
return doMain( cliRequest );
}
finally
{
System.setOut( oldout );
System.setErr( olderr );
}
} }
// TODO: need to externalize CliRequest // TODO: need to externalize CliRequest
@ -158,9 +179,9 @@ public class MavenCli
// Need to process cli options first to get possible logging options // Need to process cli options first to get possible logging options
cli( cliRequest ); cli( cliRequest );
logging( cliRequest ); logging( cliRequest );
commands( cliRequest );
properties( cliRequest ); properties( cliRequest );
container( cliRequest ); container( cliRequest );
commands( cliRequest );
settings( cliRequest ); settings( cliRequest );
populateRequest( cliRequest ); populateRequest( cliRequest );
encryption( cliRequest ); encryption( cliRequest );
@ -192,24 +213,6 @@ public class MavenCli
private void initialize( CliRequest cliRequest ) private void initialize( CliRequest cliRequest )
{ {
if ( cliRequest.stdout == null )
{
cliRequest.stdout = System.out;
}
if ( cliRequest.stderr == null )
{
cliRequest.stderr = System.err;
}
if ( logger == null )
{
logger = new PrintStreamLogger( cliRequest.stdout );
}
else
{
logger.setStream( cliRequest.stdout );
}
if ( cliRequest.workingDirectory == null ) if ( cliRequest.workingDirectory == null )
{ {
cliRequest.workingDirectory = System.getProperty( "user.dir" ); cliRequest.workingDirectory = System.getProperty( "user.dir" );
@ -253,8 +256,6 @@ public class MavenCli
cliRequest.request.setLoggingLevel( MavenExecutionRequest.LOGGING_LEVEL_INFO ); cliRequest.request.setLoggingLevel( MavenExecutionRequest.LOGGING_LEVEL_INFO );
} }
logger.setThreshold( cliRequest.request.getLoggingLevel() );
if ( cliRequest.commandLine.hasOption( CLIManager.LOG_FILE ) ) if ( cliRequest.commandLine.hasOption( CLIManager.LOG_FILE ) )
{ {
File logFile = new File( cliRequest.commandLine.getOptionValue( CLIManager.LOG_FILE ) ); File logFile = new File( cliRequest.commandLine.getOptionValue( CLIManager.LOG_FILE ) );
@ -263,20 +264,15 @@ public class MavenCli
try try
{ {
cliRequest.fileStream = new PrintStream( logFile ); cliRequest.fileStream = new PrintStream( logFile );
logger.setStream( cliRequest.fileStream );
System.setOut( cliRequest.fileStream );
System.setErr( cliRequest.fileStream );
} }
catch ( FileNotFoundException e ) catch ( FileNotFoundException e )
{ {
cliRequest.stderr.println( e ); System.err.println( e );
logger.setStream( cliRequest.stdout );
} }
} }
else
{
logger.setStream( cliRequest.stdout );
}
cliRequest.request.setExecutionListener( new ExecutionEventLogger( logger ) );
} }
// //
@ -293,8 +289,8 @@ public class MavenCli
} }
catch ( ParseException e ) catch ( ParseException e )
{ {
cliRequest.stderr.println( "Unable to parse command line options: " + e.getMessage() ); System.err.println( "Unable to parse command line options: " + e.getMessage() );
cliManager.displayHelp( cliRequest.stdout ); cliManager.displayHelp( System.out );
throw e; throw e;
} }
@ -302,13 +298,13 @@ public class MavenCli
// //
if ( cliRequest.commandLine.hasOption( CLIManager.HELP ) ) if ( cliRequest.commandLine.hasOption( CLIManager.HELP ) )
{ {
cliManager.displayHelp( cliRequest.stdout ); cliManager.displayHelp( System.out );
throw new ExitException( 0 ); throw new ExitException( 0 );
} }
if ( cliRequest.commandLine.hasOption( CLIManager.VERSION ) ) if ( cliRequest.commandLine.hasOption( CLIManager.VERSION ) )
{ {
CLIReportingUtils.showVersion( cliRequest.stdout ); CLIReportingUtils.showVersion( System.out );
throw new ExitException( 0 ); throw new ExitException( 0 );
} }
} }
@ -317,7 +313,7 @@ public class MavenCli
{ {
if ( cliRequest.debug || cliRequest.commandLine.hasOption( CLIManager.SHOW_VERSION ) ) if ( cliRequest.debug || cliRequest.commandLine.hasOption( CLIManager.SHOW_VERSION ) )
{ {
CLIReportingUtils.showVersion( cliRequest.stdout ); CLIReportingUtils.showVersion( System.out );
} }
if ( cliRequest.showErrors ) if ( cliRequest.showErrors )
@ -325,9 +321,6 @@ public class MavenCli
logger.info( "Error stacktraces are turned on." ); logger.info( "Error stacktraces are turned on." );
} }
//
// TODO: move checksum policies to
//
if ( MavenExecutionRequest.CHECKSUM_POLICY_WARN.equals( cliRequest.request.getGlobalChecksumPolicy() ) ) if ( MavenExecutionRequest.CHECKSUM_POLICY_WARN.equals( cliRequest.request.getGlobalChecksumPolicy() ) )
{ {
logger.info( "Disabling strict checksum verification on all artifact downloads." ); logger.info( "Disabling strict checksum verification on all artifact downloads." );
@ -355,6 +348,8 @@ public class MavenCli
if ( container == null ) if ( container == null )
{ {
logger = setupLogger( cliRequest );
ContainerConfiguration cc = new DefaultContainerConfiguration() ContainerConfiguration cc = new DefaultContainerConfiguration()
.setClassWorld( cliRequest.classWorld ) .setClassWorld( cliRequest.classWorld )
.setName( "maven" ); .setName( "maven" );
@ -363,8 +358,6 @@ public class MavenCli
container.setLoggerManager( new MavenLoggerManager( logger ) ); container.setLoggerManager( new MavenLoggerManager( logger ) );
container.getLoggerManager().setThresholds( cliRequest.request.getLoggingLevel() );
customizeContainer( container ); customizeContainer( container );
if ( cliRequest.classWorld == classWorld ) if ( cliRequest.classWorld == classWorld )
@ -373,6 +366,8 @@ public class MavenCli
} }
} }
container.getLoggerManager().setThresholds( cliRequest.request.getLoggingLevel() );
maven = container.lookup( Maven.class ); maven = container.lookup( Maven.class );
executionRequestPopulator = container.lookup( MavenExecutionRequestPopulator.class ); executionRequestPopulator = container.lookup( MavenExecutionRequestPopulator.class );
@ -384,6 +379,19 @@ public class MavenCli
dispatcher = (DefaultSecDispatcher) container.lookup( SecDispatcher.class, "maven" ); dispatcher = (DefaultSecDispatcher) container.lookup( SecDispatcher.class, "maven" );
} }
private PrintStreamLogger setupLogger( CliRequest cliRequest )
{
PrintStreamLogger logger = new PrintStreamLogger( new PrintStreamLogger.Provider()
{
public PrintStream getStream()
{
return System.out;
}
} );
return logger;
}
protected void customizeContainer( PlexusContainer container ) protected void customizeContainer( PlexusContainer container )
{ {
} }
@ -400,8 +408,7 @@ public class MavenCli
DefaultPlexusCipher cipher = new DefaultPlexusCipher(); DefaultPlexusCipher cipher = new DefaultPlexusCipher();
cliRequest.stdout.println( cipher.encryptAndDecorate( passwd, System.out.println( cipher.encryptAndDecorate( passwd, DefaultSecDispatcher.SYSTEM_PROPERTY_SEC_LOCATION ) );
DefaultSecDispatcher.SYSTEM_PROPERTY_SEC_LOCATION ) );
throw new ExitException( 0 ); throw new ExitException( 0 );
} }
@ -433,7 +440,7 @@ public class MavenCli
DefaultPlexusCipher cipher = new DefaultPlexusCipher(); DefaultPlexusCipher cipher = new DefaultPlexusCipher();
String masterPasswd = cipher.decryptDecorated( master, DefaultSecDispatcher.SYSTEM_PROPERTY_SEC_LOCATION ); String masterPasswd = cipher.decryptDecorated( master, DefaultSecDispatcher.SYSTEM_PROPERTY_SEC_LOCATION );
cliRequest.stdout.println( cipher.encryptAndDecorate( passwd, masterPasswd ) ); System.out.println( cipher.encryptAndDecorate( passwd, masterPasswd ) );
throw new ExitException( 0 ); throw new ExitException( 0 );
} }
@ -590,8 +597,6 @@ public class MavenCli
userSettingsFile = DEFAULT_USER_SETTINGS_FILE; userSettingsFile = DEFAULT_USER_SETTINGS_FILE;
} }
logger.debug( "Reading user settings from " + userSettingsFile );
File globalSettingsFile; File globalSettingsFile;
if ( cliRequest.commandLine.hasOption( CLIManager.ALTERNATE_GLOBAL_SETTINGS ) ) if ( cliRequest.commandLine.hasOption( CLIManager.ALTERNATE_GLOBAL_SETTINGS ) )
@ -611,8 +616,6 @@ public class MavenCli
globalSettingsFile = DEFAULT_GLOBAL_SETTINGS_FILE; globalSettingsFile = DEFAULT_GLOBAL_SETTINGS_FILE;
} }
logger.debug( "Reading global settings from " + globalSettingsFile );
cliRequest.request.setGlobalSettingsFile( globalSettingsFile ); cliRequest.request.setGlobalSettingsFile( globalSettingsFile );
cliRequest.request.setUserSettingsFile( userSettingsFile ); cliRequest.request.setUserSettingsFile( userSettingsFile );
@ -622,6 +625,11 @@ public class MavenCli
settingsRequest.setSystemProperties( cliRequest.systemProperties ); settingsRequest.setSystemProperties( cliRequest.systemProperties );
settingsRequest.setUserProperties( cliRequest.userProperties ); settingsRequest.setUserProperties( cliRequest.userProperties );
logger.debug( "Reading global settings from "
+ getSettingsLocation( settingsRequest.getGlobalSettingsSource(), settingsRequest.getGlobalSettingsFile() ) );
logger.debug( "Reading user settings from "
+ getSettingsLocation( settingsRequest.getUserSettingsSource(), settingsRequest.getUserSettingsFile() ) );
SettingsBuildingResult settingsResult = settingsBuilder.build( settingsRequest ); SettingsBuildingResult settingsResult = settingsBuilder.build( settingsRequest );
executionRequestPopulator.populateFromSettings( cliRequest.request, settingsResult.getEffectiveSettings() ); executionRequestPopulator.populateFromSettings( cliRequest.request, settingsResult.getEffectiveSettings() );
@ -640,12 +648,20 @@ public class MavenCli
} }
} }
private Object getSettingsLocation( SettingsSource source, File file )
{
if ( source != null )
{
return source.getLocation();
}
return file;
}
private MavenExecutionRequest populateRequest( CliRequest cliRequest ) private MavenExecutionRequest populateRequest( CliRequest cliRequest )
{ {
MavenExecutionRequest request = cliRequest.request; MavenExecutionRequest request = cliRequest.request;
CommandLine commandLine = cliRequest.commandLine; CommandLine commandLine = cliRequest.commandLine;
String workingDirectory = cliRequest.workingDirectory; String workingDirectory = cliRequest.workingDirectory;
boolean debug = cliRequest.debug;
boolean quiet = cliRequest.quiet; boolean quiet = cliRequest.quiet;
boolean showErrors = cliRequest.showErrors; boolean showErrors = cliRequest.showErrors;
@ -654,7 +670,7 @@ public class MavenCli
{ {
if ( commandLine.hasOption( deprecatedOption ) ) if ( commandLine.hasOption( deprecatedOption ) )
{ {
cliRequest.stdout.println( "[WARNING] Command line option -" + deprecatedOption logger.warn( "Command line option -" + deprecatedOption
+ " is deprecated and will be removed in future Maven versions." ); + " is deprecated and will be removed in future Maven versions." );
} }
} }
@ -776,38 +792,21 @@ public class MavenCli
} }
else if ( request.isInteractiveMode() ) else if ( request.isInteractiveMode() )
{ {
transferListener = new ConsoleMavenTransferListener( cliRequest.stdout ); transferListener = new ConsoleMavenTransferListener( System.out );
} }
else else
{ {
transferListener = new BatchModeMavenTransferListener( cliRequest.stdout ); transferListener = new BatchModeMavenTransferListener( System.out );
} }
ExecutionListener executionListener = new ExecutionEventLogger( logger );
String alternatePomFile = null; String alternatePomFile = null;
if ( commandLine.hasOption( CLIManager.ALTERNATE_POM_FILE ) ) if ( commandLine.hasOption( CLIManager.ALTERNATE_POM_FILE ) )
{ {
alternatePomFile = commandLine.getOptionValue( CLIManager.ALTERNATE_POM_FILE ); alternatePomFile = commandLine.getOptionValue( CLIManager.ALTERNATE_POM_FILE );
} }
int loggingLevel;
if ( debug )
{
loggingLevel = MavenExecutionRequest.LOGGING_LEVEL_DEBUG;
}
else if ( quiet )
{
// TODO: we need to do some more work here. Some plugins use sys out or log errors at info level.
// Ideally, we could use Warn across the board
loggingLevel = MavenExecutionRequest.LOGGING_LEVEL_ERROR;
// TODO:Additionally, we can't change the mojo level because the component key includes the version and
// it isn't known ahead of time. This seems worth changing.
}
else
{
loggingLevel = MavenExecutionRequest.LOGGING_LEVEL_INFO;
}
File userToolchainsFile; File userToolchainsFile;
if ( commandLine.hasOption( CLIManager.ALTERNATE_USER_TOOLCHAINS ) ) if ( commandLine.hasOption( CLIManager.ALTERNATE_USER_TOOLCHAINS ) )
{ {
@ -827,7 +826,7 @@ public class MavenCli
.setShowErrors( showErrors ) // default: false .setShowErrors( showErrors ) // default: false
.addActiveProfiles( activeProfiles ) // optional .addActiveProfiles( activeProfiles ) // optional
.addInactiveProfiles( inactiveProfiles ) // optional .addInactiveProfiles( inactiveProfiles ) // optional
.setLoggingLevel( loggingLevel ) // default: info .setExecutionListener( executionListener )
.setTransferListener( transferListener ) // default: batch mode which goes along with interactive .setTransferListener( transferListener ) // default: batch mode which goes along with interactive
.setUpdateSnapshots( updateSnapshots ) // default: false .setUpdateSnapshots( updateSnapshots ) // default: false
.setNoSnapshotUpdates( noSnapshotUpdates ) // default: false .setNoSnapshotUpdates( noSnapshotUpdates ) // default: false
@ -1002,8 +1001,6 @@ public class MavenCli
{ {
String[] args; String[] args;
CommandLine commandLine; CommandLine commandLine;
PrintStream stdout;
PrintStream stderr;
ClassWorld classWorld; ClassWorld classWorld;
String workingDirectory; String workingDirectory;
boolean debug; boolean debug;

View File

@ -34,7 +34,12 @@ public class PrintStreamLogger
extends AbstractLogger extends AbstractLogger
{ {
private PrintStream out; static interface Provider
{
PrintStream getStream();
}
private Provider provider;
private static final String FATAL_ERROR = "[FATAL] "; private static final String FATAL_ERROR = "[FATAL] ";
@ -46,6 +51,17 @@ public class PrintStreamLogger
private static final String DEBUG = "[DEBUG] "; private static final String DEBUG = "[DEBUG] ";
public PrintStreamLogger( Provider provider )
{
super( Logger.LEVEL_INFO, Maven.class.getName() );
if ( provider == null )
{
throw new IllegalArgumentException( "output stream provider missing" );
}
this.provider = provider;
}
public PrintStreamLogger( PrintStream out ) public PrintStreamLogger( PrintStream out )
{ {
super( Logger.LEVEL_INFO, Maven.class.getName() ); super( Logger.LEVEL_INFO, Maven.class.getName() );
@ -53,20 +69,28 @@ public class PrintStreamLogger
setStream( out ); setStream( out );
} }
public void setStream( PrintStream out ) public void setStream( final PrintStream out )
{ {
if ( out == null ) if ( out == null )
{ {
throw new IllegalArgumentException( "output stream missing" ); throw new IllegalArgumentException( "output stream missing" );
} }
this.out = out; this.provider = new Provider()
{
public PrintStream getStream()
{
return out;
}
};
} }
public void debug( String message, Throwable throwable ) public void debug( String message, Throwable throwable )
{ {
if ( isDebugEnabled() ) if ( isDebugEnabled() )
{ {
PrintStream out = provider.getStream();
out.print( DEBUG ); out.print( DEBUG );
out.println( message ); out.println( message );
@ -81,6 +105,8 @@ public class PrintStreamLogger
{ {
if ( isInfoEnabled() ) if ( isInfoEnabled() )
{ {
PrintStream out = provider.getStream();
out.print( INFO ); out.print( INFO );
out.println( message ); out.println( message );
@ -95,6 +121,8 @@ public class PrintStreamLogger
{ {
if ( isWarnEnabled() ) if ( isWarnEnabled() )
{ {
PrintStream out = provider.getStream();
out.print( WARNING ); out.print( WARNING );
out.println( message ); out.println( message );
@ -109,6 +137,8 @@ public class PrintStreamLogger
{ {
if ( isErrorEnabled() ) if ( isErrorEnabled() )
{ {
PrintStream out = provider.getStream();
out.print( ERROR ); out.print( ERROR );
out.println( message ); out.println( message );
@ -123,6 +153,8 @@ public class PrintStreamLogger
{ {
if ( isFatalErrorEnabled() ) if ( isFatalErrorEnabled() )
{ {
PrintStream out = provider.getStream();
out.print( FATAL_ERROR ); out.print( FATAL_ERROR );
out.println( message ); out.println( message );
@ -135,6 +167,8 @@ public class PrintStreamLogger
public void close() public void close()
{ {
PrintStream out = provider.getStream();
if ( out == System.out || out == System.err ) if ( out == System.out || out == System.err )
{ {
out.flush(); out.flush();