From 03ddf04b2a9535cc801a0f309c56c35c255ef252 Mon Sep 17 00:00:00 2001 From: Rundeck CI Date: Wed, 19 Aug 2026 09:05:56 -0700 Subject: [PATCH] Stop bundling a duplicate slf4j-api in the plugin lib sshj (and its transitive dep asn-one) resolve org.slf4j:slf4j-api to 2.0.17, and since pluginLibs resolves transitively, that jar was getting copied into the plugin's bundled lib/ and added to its runtime classpath alongside Rundeck's own slf4j-api + log4j binding. The host's log4j-slf4j-impl only implements the legacy 1.7.x-style binding (org.slf4j.impl.StaticLoggerBinder), not the 2.x provider SPI, so when the plugin's bundled 2.x slf4j-api initializes it finds no compatible provider and falls back to a NOP logger, printing the 'No SLF4J providers were found' warning on every job execution. Excluding the transitive slf4j-api from sshj/asn-one keeps the plugin from shipping a second copy at all, so it defers to whatever slf4j-api the host already has wired up correctly. Fixes #70 --- build.gradle | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 6a52ff4..7e251c3 100644 --- a/build.gradle +++ b/build.gradle @@ -57,8 +57,15 @@ configurations{ } dependencies { - pluginLibs libs.sshj - pluginLibs libs.asnOne + // slf4j-api is provided by the Rundeck host at runtime; excluding it here keeps + // sshj/asn-one from bundling their own copy, which otherwise shadows the host's + // binding and trips SLF4J's "no providers found" NOP warning (see #70). + pluginLibs(libs.sshj) { + exclude group: 'org.slf4j', module: 'slf4j-api' + } + pluginLibs(libs.asnOne) { + exclude group: 'org.slf4j', module: 'slf4j-api' + } pluginLibs libs.bundles.bouncycastle pluginLibs libs.expectitCore