diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/Log4J2EnforcementSubstitutionsUsing.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/Log4J2EnforcementSubstitutionsUsing.java new file mode 100644 index 00000000..881c1533 --- /dev/null +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/Log4J2EnforcementSubstitutionsUsing.java @@ -0,0 +1,22 @@ +package org.gradlex.jvm.dependency.conflict.resolution; + +import org.gradle.api.Action; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.artifacts.component.ComponentSelector; +import org.gradlex.jvm.dependency.conflict.detection.rules.logging.LoggingModuleIdentifiers; + +public class Log4J2EnforcementSubstitutionsUsing implements Action { + @Override + public void execute(Configuration configuration) { + configuration.getResolutionStrategy().dependencySubstitution(substitution -> { + // TODO We are missing substitutions here + + // TODO this is wrong, it cannot be a substitution for commons-logging. It must be a dependency addition + ComponentSelector jclOverLog4J = substitution.module(LoggingModuleIdentifiers.LOG4J_JCL.asFirstVersion()); + substitution.substitute(substitution.module(LoggingModuleIdentifiers.COMMONS_LOGGING.moduleId)).using(jclOverLog4J); + substitution.substitute(substitution.module(LoggingModuleIdentifiers.LOG4J_JCL.moduleId)).using(jclOverLog4J); + substitution.substitute(substitution.module(LoggingModuleIdentifiers.SPRING_JCL.moduleId)).using(jclOverLog4J); + + }); + } +} diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/Logging.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/Logging.java index 5f4ddd51..b412aabd 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/Logging.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/Logging.java @@ -395,6 +395,8 @@ public void enforceLog4J2() { selectJCLImplementation(LoggingModuleIdentifiers.LOG4J_JCL.moduleId); selectLog4J12Implementation(LoggingModuleIdentifiers.LOG4J12API.moduleId); + getConfigurations().all(new Log4J2EnforcementSubstitutionsUsing()); + } /** diff --git a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/Slf4JEnforcementSubstitutionsUsing.java b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/Slf4JEnforcementSubstitutionsUsing.java index 9883f0dd..e38e3294 100644 --- a/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/Slf4JEnforcementSubstitutionsUsing.java +++ b/src/main/java/org/gradlex/jvm/dependency/conflict/resolution/Slf4JEnforcementSubstitutionsUsing.java @@ -31,6 +31,7 @@ public void execute(Configuration configuration) { substitution.substitute(substitution.module(LoggingModuleIdentifiers.LOG4J_JUL.moduleId)).using(substitution.module(LoggingModuleIdentifiers.JUL_TO_SLF4J.asFirstVersion())); + // TODO this is wrong, it cannot be a substitution for commons-logging. It must be a dependency addition ComponentSelector jclOverSlf4J = substitution.module(LoggingModuleIdentifiers.JCL_OVER_SLF4J.asFirstVersion()); substitution.substitute(substitution.module(LoggingModuleIdentifiers.COMMONS_LOGGING.moduleId)).using(jclOverSlf4J); substitution.substitute(substitution.module(LoggingModuleIdentifiers.LOG4J_JCL.moduleId)).using(jclOverSlf4J); diff --git a/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/logging/LoggingCapabilitiesPluginSelectionFunctionalTest.groovy b/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/logging/LoggingCapabilitiesPluginSelectionFunctionalTest.groovy index 49d769fa..868d926f 100644 --- a/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/logging/LoggingCapabilitiesPluginSelectionFunctionalTest.groovy +++ b/src/test/groovy/org/gradlex/jvm/dependency/conflict/test/logging/LoggingCapabilitiesPluginSelectionFunctionalTest.groovy @@ -328,4 +328,42 @@ ${additional.collect { " runtimeOnly(\"$it\")" }.join("\n")} then: outcomeOf(result, ':doIt') == SUCCESS } + + def "issue 119"() { + given: + withBuildScript(""" + plugins { + `java-library` + id("org.gradlex.jvm-dependency-conflict-resolution") + } + + repositories { + mavenCentral() + } + + jvmDependencyConflicts.logging { + enforceLog4J2() + } + + dependencies { + implementation("log4j:log4j:1.2.17") + implementation("ch.qos.reload4j:reload4j:1.2.25") + implementation("org.slf4j:slf4j-api:2.0.13") + implementation("commons-logging:commons-logging:1.3.1") + implementation("org.apache.logging.log4j:log4j-api:2.23.1") + implementation("org.apache.logging.log4j:log4j-slf4j-impl:2.23.1") + } + + tasks.register("doIt") { + doLast { + println(configurations["runtimeClasspath"].files) + } + } +""") + when: + def result = build(['doIt', 'dependencies', '--configuration', 'runtimeClasspath']) + + then: + outcomeOf(result, ':doIt') == SUCCESS + } }