Java >> Java tutorial >  >> Tag >> Log4j

hvordan fjerner man log4j form rekursiv afhængighed?

Jeg prøvede at fjerne log4j-afhængigheden fra mit projekt, som er et enormt lager. Efter at have kigget nærmere i gradle-filer fandt jeg, at et af modulerne refererer til log4j-afhængigheden, som jeg udelukkede i gradle som vist i nedenstående kode - ekskludér gruppe:'log4j', modul:'log4j'

client {
    exclude group: 'org.slf4j', module: 'slf4j-log4j12'
    exclude group: 'log4j', module: 'log4j'
    exclude group: 'org.mortbay.jetty'
}

Herefter kørte jeg en søgning efter log4j jar, og den blev ikke fundet i hele repository, dette er søgeresultat i repository –

gunwant@devbox:bdp$ find ./ -regex ".*log4j.*.jar"
./resources/spark/client-lib/apache-log4j-extras-1.2.17.jar
./resources/cassandra/lib/log4j-over-slf4j-1.7.25.jar
./resources/graph-server/lib/apache-log4j-extras-1.2.17.jar
./resources/log4j-appender/lib/cassandra-log4j-appender-3.1.0.jar
./dse-db/lib/log4j-over-slf4j-1.7.25.jar

Men FOSSA-sikkerhedsrapporten om jenkins viser log4j-sårbarhed

Det var her, jeg sad fast. Jeg kiggede igen i repository ved at gøre "gradle allDeps" listede alle afhængighederne, som jeg fandt en rekursiv afhængighed i hadoop-modulet -

|    |    +--- org.apache.hadoop:hadoop-auth:2.7.1.4
|    |    |    +--- org.slf4j:slf4j-api:1.7.10 -> 1.7.25
|    |    |    +--- commons-codec:commons-codec:1.4 -> 1.15
|    |    |    +--- log4j:log4j:1.2.17
|    |    |    +--- org.apache.httpcomponents:httpclient:4.4.1 -> 4.5.9 (*)
|    |    |    +--- org.apache.directory.server:apacheds-kerberos-codec:2.0.0-M15 -> 2.0.0-M24
|    |    |    |    +--- org.apache.directory.server:apacheds-i18n:2.0.0-M24
|    |    |    |    |    --- org.slf4j:slf4j-api:1.7.25
|    |    |    |    +--- org.apache.directory.api:api-asn1-api:1.0.0 -> 1.0.3 (*)
|    |    |    |    +--- org.apache.directory.api:api-asn1-ber:1.0.0 -> 1.0.3 (*)
|    |    |    |    +--- org.apache.directory.api:api-i18n:1.0.0 -> 1.0.3
|    |    |    |    +--- org.apache.directory.api:api-ldap-model:1.0.0 -> 1.0.3 (*)
|    |    |    |    +--- org.apache.directory.api:api-util:1.0.0 -> 1.0.3 (*)
|    |    |    |    +--- net.sf.ehcache:ehcache:2.10.4
|    |    |    |    |    --- org.slf4j:slf4j-api:1.7.7 -> 1.7.25
|    |    |    |    --- org.slf4j:slf4j-api:1.7.25
|    |    |    +--- org.apache.zookeeper:zookeeper:3.4.6

og i zookeeper også –

|    |    |    +--- org.apache.zookeeper:zookeeper:3.4.6
|    |    |    |    +--- org.slf4j:slf4j-api:1.6.1 -> 1.7.25
|    |    |    |    +--- log4j:log4j:1.2.16 -> 1.2.17
|    |    |    |    +--- jline:jline:0.9.94 -> 2.14.6
|    |    |    |    --- io.netty:netty:3.7.0.Final

Mit første spørgsmål er, hvordan kan det være, at FOSSA rapporterer log4j som en sårbarhed, selvom log4j jar-filen ikke er fysisk til stede i repoen? Jeg ved, at FOSSA scanner for rekursiv afhængighed.

Mit andet spørgsmål er, hvordan kan vi udelukke log4j fra org.apache.hadoop og org.apache.zookeeper rekursiv afhængighed?

Jeg er sikker på, at nogen må have løst dette problem tidligere.

Svar

Jeg ville bruge nedenfor, men sørg også for at du tilføjer det korrekte slf4j-bibliotek for at erstatte grænsefladen, dvs. log4j-over-slf4j

project.configurations {
        all*.exclude group: 'commons-logging', module: 'commons-logging'
        all*.exclude group: 'log4j', module: 'log4j'
        all*.exclude group: 'org.slf4j', module: 'slf4j-log4j12'
    }
    project.dependencies { 
        implementation "org.slf4j:slf4j-api"
        implementation 'org.slf4j:jcl-over-slf4j'
        implementation 'org.slf4j:log4j-over-slf4j'
    }

Java tag