You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Log依赖注入到非Mojo类实例中?

非Mojo类注入Maven Log解决方案

问题根因

Maven的依赖注入容器默认仅会处理@Mojo注解标注的类的注入逻辑,自行实例化的普通服务类不会被容器扫描和托管,因此直接在服务类中加@Inject注入Log的写法无法生效。

可行方案

方案1:将服务类交给Maven DI容器管理(兼容原生Maven Log)

只要满足以下两个条件,容器实例化服务类时就会自动注入Log实例:

  1. 给服务类添加org.eclipse.sisu.Typed或javax.inject.Named注解,注册到Maven容器
  2. 在Mojo类中通过@Inject注入服务类实例,不要手动new创建

服务类示例代码

import javax.inject.Inject;
import javax.inject.Singleton;
import org.eclipse.sisu.Typed;
import org.apache.maven.plugin.logging.Log;

@Singleton
@Typed(ServiceInterface.class)
public class AServiceClass implements ServiceInterface {
    @Inject
    private Log log;

    @Override
    public void doTask() {
        log.info("服务类日志正常输出");
    }
}

Mojo类示例代码

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugins.annotations.Mojo;
import javax.inject.Inject;

@Mojo(name = "run")
public class CustomMojo extends AbstractMojo {
    @Inject
    private ServiceInterface service;

    @Override
    public void execute() {
        service.doTask();
    }
}

方案2:直接使用SLF4J日志门面(无侵入,适配所有场景)

Maven 3.1及以上版本默认内置SLF4J日志实现,无需额外依赖配置,直接在服务类中调用SLF4J API获取日志实例即可,日志输出规则完全适配Maven配置,和原生getLog()表现一致:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Singleton
public class AServiceClass implements ServiceInterface {
    private static final Logger LOGGER = LoggerFactory.getLogger(AServiceClass.class);

    @Override
    public void doTask() {
        LOGGER.info("日志正常输出,支持Maven -X参数打印debug级别日志");
    }
}

该方案不需要修改Mojo代码,也不需要依赖容器托管服务类,哪怕是手动创建的服务实例也可以正常输出日志,不需要从Mojo传递Log对象。

内容的提问来源于stack exchange,提问作者Mansur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 16:45:03