From a77e4c2ebf8a0615c20a9ec02a465459a6647b5f Mon Sep 17 00:00:00 2001 From: Benjamin Bentmann Date: Tue, 9 Nov 2010 13:09:51 +0000 Subject: [PATCH] [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 --- .../apache/maven/cli/CLIReportingUtils.java | 10 +- .../java/org/apache/maven/cli/MavenCli.java | 155 +++++++++--------- .../apache/maven/cli/PrintStreamLogger.java | 40 ++++- 3 files changed, 120 insertions(+), 85 deletions(-) diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java b/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java index cf093bab8f..0e7945fc1e 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/CLIReportingUtils.java @@ -164,8 +164,7 @@ static Properties getBuildProperties() InputStream resourceAsStream = null; try { - resourceAsStream = - MavenCli.class.getClassLoader().getResourceAsStream( "org/apache/maven/messages/build.properties" ); + resourceAsStream = MavenCli.class.getResourceAsStream( "/org/apache/maven/messages/build.properties" ); if ( resourceAsStream != null ) { @@ -184,8 +183,13 @@ static Properties getBuildProperties() 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 ) { logger.error( message, e ); diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java index 68dcf50db2..336fdf41c6 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java @@ -39,6 +39,7 @@ import org.apache.maven.exception.ExceptionHandler; import org.apache.maven.exception.ExceptionSummary; import org.apache.maven.execution.DefaultMavenExecutionRequest; +import org.apache.maven.execution.ExecutionListener; import org.apache.maven.execution.MavenExecutionRequest; import org.apache.maven.execution.MavenExecutionRequestPopulator; import org.apache.maven.execution.MavenExecutionResult; @@ -52,12 +53,14 @@ import org.apache.maven.settings.building.SettingsBuildingRequest; import org.apache.maven.settings.building.SettingsBuildingResult; import org.apache.maven.settings.building.SettingsProblem; +import org.apache.maven.settings.building.SettingsSource; import org.codehaus.plexus.ContainerConfiguration; import org.codehaus.plexus.DefaultContainerConfiguration; import org.codehaus.plexus.DefaultPlexusContainer; import org.codehaus.plexus.PlexusContainer; import org.codehaus.plexus.classworlds.ClassWorld; import org.codehaus.plexus.component.repository.exception.ComponentLookupException; +import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.util.StringUtils; import org.sonatype.aether.transfer.TransferListener; import org.sonatype.plexus.components.cipher.DefaultPlexusCipher; @@ -94,7 +97,7 @@ public class MavenCli // Per-instance container supports fast embedded execution of core ITs private DefaultPlexusContainer container; - private PrintStreamLogger logger; + private Logger logger; private ModelProcessor modelProcessor; @@ -141,12 +144,30 @@ public static int doMain( String[] args, ClassWorld classWorld ) // 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 ) { - CliRequest cliRequest = new CliRequest( args, classWorld ); - cliRequest.workingDirectory = workingDirectory; - cliRequest.stdout = stdout; - cliRequest.stderr = stderr; + PrintStream oldout = System.out; + PrintStream olderr = System.err; - 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 @@ -158,9 +179,9 @@ public int doMain( CliRequest cliRequest ) // Need to process cli options first to get possible logging options cli( cliRequest ); logging( cliRequest ); - commands( cliRequest ); properties( cliRequest ); container( cliRequest ); + commands( cliRequest ); settings( cliRequest ); populateRequest( cliRequest ); encryption( cliRequest ); @@ -192,24 +213,6 @@ public int doMain( 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 ) { cliRequest.workingDirectory = System.getProperty( "user.dir" ); @@ -253,8 +256,6 @@ else if ( cliRequest.quiet ) cliRequest.request.setLoggingLevel( MavenExecutionRequest.LOGGING_LEVEL_INFO ); } - logger.setThreshold( cliRequest.request.getLoggingLevel() ); - if ( cliRequest.commandLine.hasOption( CLIManager.LOG_FILE ) ) { File logFile = new File( cliRequest.commandLine.getOptionValue( CLIManager.LOG_FILE ) ); @@ -263,20 +264,15 @@ else if ( cliRequest.quiet ) try { cliRequest.fileStream = new PrintStream( logFile ); - logger.setStream( cliRequest.fileStream ); + + System.setOut( cliRequest.fileStream ); + System.setErr( cliRequest.fileStream ); } catch ( FileNotFoundException e ) { - cliRequest.stderr.println( e ); - logger.setStream( cliRequest.stdout ); + System.err.println( e ); } } - else - { - logger.setStream( cliRequest.stdout ); - } - - cliRequest.request.setExecutionListener( new ExecutionEventLogger( logger ) ); } // @@ -293,8 +289,8 @@ private void cli( CliRequest cliRequest ) } catch ( ParseException e ) { - cliRequest.stderr.println( "Unable to parse command line options: " + e.getMessage() ); - cliManager.displayHelp( cliRequest.stdout ); + System.err.println( "Unable to parse command line options: " + e.getMessage() ); + cliManager.displayHelp( System.out ); throw e; } @@ -302,13 +298,13 @@ private void cli( CliRequest cliRequest ) // if ( cliRequest.commandLine.hasOption( CLIManager.HELP ) ) { - cliManager.displayHelp( cliRequest.stdout ); + cliManager.displayHelp( System.out ); throw new ExitException( 0 ); } if ( cliRequest.commandLine.hasOption( CLIManager.VERSION ) ) { - CLIReportingUtils.showVersion( cliRequest.stdout ); + CLIReportingUtils.showVersion( System.out ); throw new ExitException( 0 ); } } @@ -317,7 +313,7 @@ private void commands( CliRequest cliRequest ) { if ( cliRequest.debug || cliRequest.commandLine.hasOption( CLIManager.SHOW_VERSION ) ) { - CLIReportingUtils.showVersion( cliRequest.stdout ); + CLIReportingUtils.showVersion( System.out ); } if ( cliRequest.showErrors ) @@ -325,9 +321,6 @@ private void commands( CliRequest cliRequest ) logger.info( "Error stacktraces are turned on." ); } - // - // TODO: move checksum policies to - // if ( MavenExecutionRequest.CHECKSUM_POLICY_WARN.equals( cliRequest.request.getGlobalChecksumPolicy() ) ) { logger.info( "Disabling strict checksum verification on all artifact downloads." ); @@ -355,6 +348,8 @@ private void container( CliRequest cliRequest ) if ( container == null ) { + logger = setupLogger( cliRequest ); + ContainerConfiguration cc = new DefaultContainerConfiguration() .setClassWorld( cliRequest.classWorld ) .setName( "maven" ); @@ -363,8 +358,6 @@ private void container( CliRequest cliRequest ) container.setLoggerManager( new MavenLoggerManager( logger ) ); - container.getLoggerManager().setThresholds( cliRequest.request.getLoggingLevel() ); - customizeContainer( container ); if ( cliRequest.classWorld == classWorld ) @@ -373,6 +366,8 @@ private void container( CliRequest cliRequest ) } } + container.getLoggerManager().setThresholds( cliRequest.request.getLoggingLevel() ); + maven = container.lookup( Maven.class ); executionRequestPopulator = container.lookup( MavenExecutionRequestPopulator.class ); @@ -384,6 +379,19 @@ private void container( CliRequest cliRequest ) 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 ) { } @@ -400,8 +408,7 @@ private void encryption( CliRequest cliRequest ) DefaultPlexusCipher cipher = new DefaultPlexusCipher(); - cliRequest.stdout.println( cipher.encryptAndDecorate( passwd, - DefaultSecDispatcher.SYSTEM_PROPERTY_SEC_LOCATION ) ); + System.out.println( cipher.encryptAndDecorate( passwd, DefaultSecDispatcher.SYSTEM_PROPERTY_SEC_LOCATION ) ); throw new ExitException( 0 ); } @@ -433,7 +440,7 @@ else if ( cliRequest.commandLine.hasOption( CLIManager.ENCRYPT_PASSWORD ) ) DefaultPlexusCipher cipher = new DefaultPlexusCipher(); 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 ); } @@ -590,8 +597,6 @@ private void settings( CliRequest cliRequest ) userSettingsFile = DEFAULT_USER_SETTINGS_FILE; } - logger.debug( "Reading user settings from " + userSettingsFile ); - File globalSettingsFile; if ( cliRequest.commandLine.hasOption( CLIManager.ALTERNATE_GLOBAL_SETTINGS ) ) @@ -611,8 +616,6 @@ private void settings( CliRequest cliRequest ) globalSettingsFile = DEFAULT_GLOBAL_SETTINGS_FILE; } - logger.debug( "Reading global settings from " + globalSettingsFile ); - cliRequest.request.setGlobalSettingsFile( globalSettingsFile ); cliRequest.request.setUserSettingsFile( userSettingsFile ); @@ -622,6 +625,11 @@ private void settings( CliRequest cliRequest ) settingsRequest.setSystemProperties( cliRequest.systemProperties ); 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 ); executionRequestPopulator.populateFromSettings( cliRequest.request, settingsResult.getEffectiveSettings() ); @@ -640,12 +648,20 @@ private void settings( CliRequest cliRequest ) } } + private Object getSettingsLocation( SettingsSource source, File file ) + { + if ( source != null ) + { + return source.getLocation(); + } + return file; + } + private MavenExecutionRequest populateRequest( CliRequest cliRequest ) { MavenExecutionRequest request = cliRequest.request; CommandLine commandLine = cliRequest.commandLine; String workingDirectory = cliRequest.workingDirectory; - boolean debug = cliRequest.debug; boolean quiet = cliRequest.quiet; boolean showErrors = cliRequest.showErrors; @@ -654,7 +670,7 @@ private MavenExecutionRequest populateRequest( CliRequest cliRequest ) { 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." ); } } @@ -776,38 +792,21 @@ else if ( profileAction.startsWith( "+" ) ) } else if ( request.isInteractiveMode() ) { - transferListener = new ConsoleMavenTransferListener( cliRequest.stdout ); + transferListener = new ConsoleMavenTransferListener( System.out ); } else { - transferListener = new BatchModeMavenTransferListener( cliRequest.stdout ); + transferListener = new BatchModeMavenTransferListener( System.out ); } + ExecutionListener executionListener = new ExecutionEventLogger( logger ); + String alternatePomFile = null; if ( commandLine.hasOption( 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; if ( commandLine.hasOption( CLIManager.ALTERNATE_USER_TOOLCHAINS ) ) { @@ -827,7 +826,7 @@ else if ( quiet ) .setShowErrors( showErrors ) // default: false .addActiveProfiles( activeProfiles ) // optional .addInactiveProfiles( inactiveProfiles ) // optional - .setLoggingLevel( loggingLevel ) // default: info + .setExecutionListener( executionListener ) .setTransferListener( transferListener ) // default: batch mode which goes along with interactive .setUpdateSnapshots( updateSnapshots ) // default: false .setNoSnapshotUpdates( noSnapshotUpdates ) // default: false @@ -1002,8 +1001,6 @@ static class CliRequest { String[] args; CommandLine commandLine; - PrintStream stdout; - PrintStream stderr; ClassWorld classWorld; String workingDirectory; boolean debug; diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/PrintStreamLogger.java b/maven-embedder/src/main/java/org/apache/maven/cli/PrintStreamLogger.java index 44a724dcc6..577ee3e49f 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/PrintStreamLogger.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/PrintStreamLogger.java @@ -34,7 +34,12 @@ public class PrintStreamLogger extends AbstractLogger { - private PrintStream out; + static interface Provider + { + PrintStream getStream(); + } + + private Provider provider; private static final String FATAL_ERROR = "[FATAL] "; @@ -46,6 +51,17 @@ public class PrintStreamLogger 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 ) { super( Logger.LEVEL_INFO, Maven.class.getName() ); @@ -53,20 +69,28 @@ public PrintStreamLogger( PrintStream out ) setStream( out ); } - public void setStream( PrintStream out ) + public void setStream( final PrintStream out ) { if ( out == null ) { 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 ) { if ( isDebugEnabled() ) { + PrintStream out = provider.getStream(); + out.print( DEBUG ); out.println( message ); @@ -81,6 +105,8 @@ public void info( String message, Throwable throwable ) { if ( isInfoEnabled() ) { + PrintStream out = provider.getStream(); + out.print( INFO ); out.println( message ); @@ -95,6 +121,8 @@ public void warn( String message, Throwable throwable ) { if ( isWarnEnabled() ) { + PrintStream out = provider.getStream(); + out.print( WARNING ); out.println( message ); @@ -109,6 +137,8 @@ public void error( String message, Throwable throwable ) { if ( isErrorEnabled() ) { + PrintStream out = provider.getStream(); + out.print( ERROR ); out.println( message ); @@ -123,6 +153,8 @@ public void fatalError( String message, Throwable throwable ) { if ( isFatalErrorEnabled() ) { + PrintStream out = provider.getStream(); + out.print( FATAL_ERROR ); out.println( message ); @@ -135,6 +167,8 @@ public void fatalError( String message, Throwable throwable ) public void close() { + PrintStream out = provider.getStream(); + if ( out == System.out || out == System.err ) { out.flush();