【问题标题】:Lombok SLF4J impl inheritance issuesLombok SLF4J impl 继承问题
【发布时间】:2019-05-28 08:29:29
【问题描述】:

我在我的多模块 maven 项目中遇到了 Lombok 的问题。我有两节课:

@Slf4j
public class Parent {}

@Slf4j
public class Child extends Parent {
    public void m() {
        log.debug("hello");
    }
}

还有一个父 maven 项目,其中定义了 lombok 依赖项。还有一个子 maven 项目,我在其中将父项目定义为 maven parent。

当我在Child 类中使用生成的log 实例时,出现编译错误:

[ERROR] log has private access in <Child class>

我可以通过两种方式解决这个问题:

  • 我自己手动创建了名为“log”的私有字段。
  • 我在子 maven 项目中定义了 Lombok 依赖项。

为什么会这样?定义 lombok 依赖项的任何解决方法/最佳方法?

感谢您的帮助。

使用:

  • 龙目岛 1.16.18
  • JDK 1.8
  • Maven 3.5.3

【问题讨论】:

    标签: java maven slf4j lombok


    【解决方案1】:

    继承不应以任何方式影响您的问题。当您使用@Slf4j 注释时,Lombok 会创建private static final 字段并且static 字段不会被继承。在您的情况下,生成的代码如下所示:

    public class Parent {
        private static final Logger log = LoggerFactory.getLogger(Parent.class);
    
        public Parent() {}
    }
    
    public class Child extends Parent {
        private static final Logger log = LoggerFactory.getLogger(Child.class);
    
        public Child() {}
    
        public void m() {
            log.debug("hello");
        }
    }
    

    对于多模块 maven 项目,您需要确保正确指定模块间依赖项。如果 lombok 在类路径上,一切都应该开箱即用。

    【讨论】:

      【解决方案2】:

      我找到了原因,子项目的依赖关系树中的 Lombok 依赖项在提供的范围内。我在依赖项中添加了 Lombok,然后正确生成了该字段。

      【讨论】:

      • Lombok 应始终添加为provided,否则它将最终出现在您的运行时类路径中,而您不希望这样。
      猜你喜欢
      • 2020-07-18
      • 2018-10-02
      • 2021-06-18
      • 2012-07-12
      • 2011-04-13
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2019-01-12
      相关资源
      最近更新 更多