【问题标题】:Issue with log4j 2.17.0 update: ClassNotFoundException SetUtilslog4j 2.17.0 更新问题:ClassNotFoundException SetUtils
【发布时间】:2022-01-22 11:08:52
【问题描述】:

在版本升级到 log4j 2.17.0 之后,在单元测试期间引发了此异常:

java.lang.ClassNotFoundException: org.apache.logging.log4j.core.util.SetUtils

如何解决这个问题?

【问题讨论】:

    标签: java log4j log4shell


    【解决方案1】:

    我曾询问过 Log4j 开发人员如何处理这个问题。 该类被视为内部类,不应使用。

    看。 https://issues.apache.org/jira/browse/LOG4J2-3309

    可能用来替换类的代码应该更不像下面这样(使用:org.apache.commons.collections4

    import org.apache.commons.collections4.Predicate;
    import org.apache.commons.collections4.SetUtils;
    
    // generic
    Predicate<E> predicate = x -> (doSthWith(x));
    final Set<E> resultSet = SetUtils.predicatedSet(setOfElements, predicate);
    final String[] array = (String[]) resultSet.toArray();
    
    // for example
    Predicate<String> containsString = str -> (str.startsWith(stringToSearch));
    final Set<String> resultSet = SetUtils.predicatedSet(setOfStrings, containsString);
    final String[] arrayOfStrings= (String[]) resultSet.toArray();
    

    【讨论】:

      【解决方案2】:

      经过反复试验I found here 升级到 log4j 2.17.0 意味着新的依赖 log4j-web

      <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-web -->
      <dependency>
          <groupId>org.apache.logging.log4j</groupId>
          <artifactId>log4j-web</artifactId>
          <version>2.17.0</version>
      </dependency>
      

      【讨论】:

      • 这个类在哪里指定?我试图找到它并没有看到它? logging.apache.org/log4j/log4j-2.17.0/log4j-web/apidocs/…
      • 这是一个内部类——你不应该为了使用这样的 util/private 类而拉取 log4j-web 依赖项。 @SewerynHabdank-Wojewódzki 帖子是正确的解决方案。
      • @PaoloC 我不使用这个内部类,在我的情况下,它是tomcat(不知何故)具有这种内部依赖关系。此答案仅用于帮助有此问题的人。
      • 在这种情况下,我建议在标题中添加“Tomcat”,并指定 Tomcat 的版本。否则这似乎是一个普遍的问题,但它仅适用于应用程序服务器(以某些方式配置)。
      猜你喜欢
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      • 2010-11-21
      • 1970-01-01
      相关资源
      最近更新 更多