如何将Log依赖注入到非Mojo类实例中?
非Mojo类注入Maven Log解决方案
问题根因
Maven的依赖注入容器默认仅会处理@Mojo注解标注的类的注入逻辑,自行实例化的普通服务类不会被容器扫描和托管,因此直接在服务类中加@Inject注入Log的写法无法生效。
可行方案
方案1:将服务类交给Maven DI容器管理(兼容原生Maven Log)
只要满足以下两个条件,容器实例化服务类时就会自动注入Log实例:
- 给服务类添加
org.eclipse.sisu.Typed或javax.inject.Named注解,注册到Maven容器 - 在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
相关产品推荐
相关产品推荐

