2010-10-20 7 views
3

J'écris un plugin Maven (Mojo) qui importe une bibliothèque Jar utilisée par d'autres projets. Au moins une des classes de cette bibliothèque utilise Apache Log4j pour la journalisation, mais Log4j ne sera pas correctement configuré par le logger que Maven fournit à Mojo.Maven Plugin Logger Compatibilité

Existe-t-il un moyen simple de faire le pont entre ces éléments? Malheureusement, org.apache.log4j.Logger et org.apache.maven.logging.Log ne partagent pas une superinterface ou superclasse commune, donc je ne peux pas simplement avoir une fonction de type setLog(). Toute suggestion serait la bienvenue; Actuellement, je prévois soit de l'ignorer, soit d'écrire une classe de bridge qui peut l'utiliser.

Répondre

2

Si vous voulez écrire une classe de pont, regardez les sources SLF4J: http://www.slf4j.org/legacy.html#log4j-over-slf4j Ils font quelque chose de très similaire dans leur pont log4j.

+0

Pas exactement ce que j'espérais, mais merci pour l'info. Si personne d'autre ne donne une meilleure réponse dans environ une semaine, je vais accepter celui-ci. – Jonathan

10

J'ai eu le même problème et résolu d'écrire un simple pont entre Maven Logger et Log4j:

import org.apache.log4j.AppenderSkeleton; 
import org.apache.log4j.Level; 
import org.apache.log4j.spi.LoggingEvent; 
import org.apache.maven.plugin.logging.Log; 

public class MavenLoggerLog4jBridge extends AppenderSkeleton { 
    private Log logger; 

    public MavenLoggerLog4jBridge(Log logger) { 
     this.logger = logger; 
    } 

    protected void append(LoggingEvent event) { 
     int level = event.getLevel().toInt(); 
     String msg = event.getMessage().toString(); 
     if (level == Level.DEBUG_INT || level == Level.TRACE_INT) { 
      this.logger.debug(msg); 
     } else if (level == Level.INFO_INT) { 
      this.logger.info(msg); 
     } else if (level == Level.WARN_INT) { 
      this.logger.warn(msg); 
     } else if (level == Level.ERROR_INT || level == Level.FATAL_INT) { 
      this.logger.error(msg); 
     } 
    } 

    public void close() { 
    } 

    public boolean requiresLayout() { 
     return false; 
    } 
} 

Et dans mon Mojo, j'ai utilisé le BasicConfigurator classe de l'API Log4j, avec une instance de ce pont :

public void execute() throws MojoExecutionException { 
    org.apache.maven.plugin.logging.Log mavenLogger = getLog(); 
    BasicConfigurator.configure(new MavenLoggerLog4jBridge(mavenLogger)); 
} 

Je ne sais pas si l'infrastructure Maven ont déjà ce pont, je ne l'ai pas essayé de chercher quelque chose de plus « maven-like », mais cette solution a bien fonctionné.

+0

Merci un million! Votre pont et votre solution m'ont sauvé beaucoup d'ennuis. –