Actualicé la dependencia log4j a la última versión 2.15.0 y ahora mi aplicación Spring Boot arroja un error al iniciar
Exception in thread "main" java.lang.NoSuchFieldError: EMPTY_BYTE_ARRAY at org.apache.logging.log4j.core.config.ConfigurationSource.<clinit>(ConfigurationSource.java:56) at org.apache.logging.log4j.core.config.NullConfiguration.<init>(NullConfiguration.java:32) at org.apache.logging.log4j.core.LoggerContext.<clinit>(LoggerContext.java:85) at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.createContext(ClassLoaderContextSelector.java:254) at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.locateContext(ClassLoaderContextSelector.java:218) at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:136) at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:123) at org.apache.logging.log4j.core.selector.ClassLoaderContextSelector.getContext(ClassLoaderContextSelector.java:117) at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:150) at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:47) at org.apache.logging.log4j.LogManager.getContext(LogManager.java:194) at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:581) at foo.bar.org.MyApp.<clinit>(MyApp.java:13)Aquí está mi clase principal
@Log4j2 @SpringBootApplication(exclude={DataSourceAutoConfiguration.class}) public class MyApp { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } }En caso de que tenga lo siguiente en su pom.xml:
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.15.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.15.0</version> </dependency>asegúrese de que ambos tengan la misma versión. Lo olvidé por uno (dejé la versión anterior) y vi el mismo error.
<properties> <log4j2.version>2.15.0</log4j2.version> </properties> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>${log4j2.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>${log4j2.version}</version> </dependency>Lo que funcionó para mí fue excluir todas las dependencias transitivas de la versión en conflicto para log4j-api y log4j-core .
Los he rastreado con:
mvn dependency:tree -Dverbose -Dincludes=org.apache.logging.log4j:log4j-api
y
mvn dependency:tree -Dverbose -Dincludes=org.apache.logging.log4j:log4j-core
Así que me aseguré de que la versión 2.15.0 fuera la única versión para ambas dependencias de log4j en todo el proyecto.
Nuestro proyecto anterior tiene el mismo problema con 2.15.0 o 2.16.0, luego intentamos que 2.12.2 esté bien, y esto también corrige la vulnerabilidad de seguridad. Aquí el sitio log4j: https://logging.apache.org/log4j/2 .X/
Mitigación
En la versión 2.12.2 Log4j deshabilita el acceso a JNDI por defecto. El uso de JNDI en la configuración ahora debe habilitarse explícitamente. Las llamadas a JndiLookup ahora devolverán una cadena constante. Además, Log4j ahora limita los protocolos de forma predeterminada solo a Java. La función de búsqueda de mensajes se ha eliminado por completo.
En la versión 2.16.0 Log4j deshabilita el acceso a JNDI por defecto. Las búsquedas JNDI en la configuración ahora deben habilitarse explícitamente. Además, Log4j ahora limita los protocolos de forma predeterminada a solo java, ldap y ldaps y limita los protocolos ldap a solo acceder a objetos primitivos de Java. Los hosts que no sean el host local deben estar explícitamente permitidos. La función de búsqueda de mensajes se ha eliminado por completo.