1

我想通过我的 Java 代码运行 Maven 编译。因此,我使用了此处解释的 Maven Embedder 用法示例。

这很好用,只是我想将 Maven Embedder 写入的所有日志重定向到我自己的 Logger。所以,我创建了自己的MavenEmbedderLoggeroutPrintStream我的):

class MvnLogger extends AbstractMavenEmbedderLogger {

    public void error(String s, Throwable throwable) {
        out.println("[error] " + s);
        print(throwable);
    }

    public void info(String s, Throwable throwable) {
        out.println("[info] " + s);
        print(throwable);
    }

    ...

    public void close() {
    }

    private void print(Throwable t) {
        if (t != null) {
            t.printStackTrace(out);
        }
    }

}

然后,我将此记录器设置为嵌入器:

    Configuration config = new DefaultConfiguration();
    config.setUserSettingsFile(new File("..."));
    config.setClassLoader(Thread.currentThread().getContextClassLoader());
    ConfigurationValidationResult validationResult = MavenEmbedder.validateConfiguration(config);
    if (validationResult.isValid()) {
        try {
            MavenEmbedder embedder = new MavenEmbedder(config);
            // SET THE LOGGER
            embedder.setLogger(new MvnLogger());
            MavenExecutionRequest request = new DefaultMavenExecutionRequest();
            request.setBaseDirectory(path);
            request.setGoals(Arrays.asList(new String[] { "clean", "install" }));
            MavenExecutionResult result = embedder.execute(request);
            ...

但是,当我执行此代码时,来自 Maven 的所有日志都显示在默认 Logger(在我的情况下为System.out)而不是我的 Logger 中。

我做错了什么?

4

1 回答 1

2

好的,我自己发现的: Logger 必须设置为Configuration,而不是MavenEmbedder类:

    Configuration config = new DefaultConfiguration();
    // SET THE LOGGER HERE !
    config.setMavenEmbedderLogger(new MvnLogger());
    config.setUserSettingsFile(new File(...));
    config.setClassLoader(Thread.currentThread().getContextClassLoader());
    ConfigurationValidationResult validationResult = MavenEmbedder.validateConfiguration(config);
    if (validationResult.isValid()) {
        try {
            MavenEmbedder embedder = new MavenEmbedder(config);
            // AND NOT HERE!
            // embedder.setLogger(new MvnLogger());
            MavenExecutionRequest request = new DefaultMavenExecutionRequest();
            request.setBaseDirectory(path);
            request.setGoals(Arrays.asList(new String[] { "clean", "install" }));
            // request.setProperties();
            MavenExecutionResult result = embedder.execute(request);

但是,这很奇怪,在我之前的代码中,没有使用 Logger 而不是System.out...

于 2009-10-27T15:59:57.790 回答