How to exclude jar that contains StaticLoggerBinder from activemq-all maven dependency? - java

I'm using ActiveMQ (an apache camel component) to send SMS from web to GSM mobile, so I needed to use SLF4J.
I got this in the output of my netbeans project when i run it
it seems like the jar is present two times, and i think that i need to add an exclusion in the dependency in my pom.xml but i dont know what to do exactly !
This is the part of SLF4 in my pom.xml:
<!-- logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
<!-- <exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions> -->
</dependency>
And this is my output while running my project
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/asus/.m2/repository/org/apache/activemq/activemq-all/5.9.0/activemq-all-5.9.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/asus/.m2/repository/org/slf4j/slf4j-log4j12/1.7.5/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]

Try the following:
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.9.0</version>
<type>pom</type>
</dependency>
See more in [AMQ-5009] Switch activemq-all from shaded jar to pom dependency aggregator - ASF JIRA.

Your question is lacking a bit of context, but I'd say you should simply drop that slf4j-log4j12 dependency from your POM, since an SLF4J binding is embedded in activemq-all-5.9.0.jar anyway.
Or maybe you could try not using activemq-all with embedded dependencies and use individual ActiveMQ artifacts with ordinary transitive dependencies.

I agree with not using activemq-all, instead using the individual dependencies you need. In general I've found that using '-all' dependencies can create problems. Typically these repackage other dependencies where the normal Maven dependency resolution process can't get at them. Then, if you need to use a later version of an embedded dependency, problems result, and it's tricky/time-consuming to track down.
(Making this comment an answer per #bmargulies request.)

Related

How to solve "No SLF4J providers were found" SLF4J: "Defaulting to no-operation (NOP) logger implementation" errors in java selenium project [duplicate]

I use Lombok.
Some time ago when building a project, the compiler started issuing the following message:
Found slf4j-api dependency but no providers were found. Did you mean
to add slf4j-simple? See https://www.slf4j.org/codes.html#noProviders
.
If you follow the link, there is a rather vague comment:
This warning, i.e. not an error, message is reported when no SLF4J
providers could be found on the class path. Placing one (and only one)
of slf4j-nop.jar slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar
or logback-classic.jar on the class path should solve the problem.
Note that these providers must target slf4j-api 1.8 or later.
In the absence of a provider, SLF4J will default to a no-operation
(NOP) logger provider.
Please note that slf4j-api version 1.8.x and later use the
ServiceLoader mechanism. Earlier versions relied on the static binder
mechanism which is no longer honored by slf4j-api. Please read the FAQ
entry What has changed in SLF4J version 1.8.0? for further important
details.
If you are responsible for packaging an application and do not care
about logging, then placing slf4j-nop.jar on the class path of your
application will get rid of this warning message. Note that embedded
components such as libraries or frameworks should not declare a
dependency on any SLF4J providers but only depend on slf4j-api. When a
library declares a compile-time dependency on a SLF4J provider, it
imposes that provider on the end-user, thus negating SLF4J's purpose.
I have no idea how to do it correctly. If you have an experience, please, explain me how to do it.
As stated in tutorialspoint :
SLF4J stands for Simple Logging Facade for Java. It provides a simple
abstraction of all the logging frameworks. It enables a user to work
with any of the logging frameworks such as Log4j, Logback, JUL
(java.util.logging), etc. using single dependency.
This means that you have to provide a concrete java logging library on your classpath on top of the dependency for SLF4J itself (Example with Maven):
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.0-alpha0</version>
</dependency>
You will also need to specify the dependency on your preferred logging library. For instance:
For standard jdk1.4 logging :
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-jdk14 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>2.0.0-alpha0</version>
<scope>runtime</scope>
</dependency>
For slf4j-simple logging :
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.0-alpha0</version>
<scope>runtime</scope>
</dependency>
For log4j logging :
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>2.0.0-alpha0</version>
<scope>runtime</scope>
</dependency>
Refer this Page: http://www.slf4j.org/codes.html#noProviders
You may add either of the following dependencies: Placing one (and only one) of slf4j-nop.jar slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar or logback-classic.jar on the class path should solve the problem
I used "slf4j-simple" maven dependency from https://mvnrepository.com/artifact/org.slf4j/log4j-over-slf4j
This can be due to the version of slf4J API and you are using. try this changing the version like this.
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>

why is my maven sub dependency version for spark connector package different from others

I am trying to use a pom file from a existing project and I am getting an error "Cannot resolve org.yaml:snakeyaml:1.15"
What I find out about this error is that the com.datastax.spark:spark-cassandra-connector_2.11:2.5.0 uses a couple dependencies and a couple levels down it is using snakeyaml:1.15 which is quarantined by company proxy. Is there a way to specify for a given maven dependency that I want to use snakeyaml:1.16?
One thing I do not understand is that I look into the reference project that is also using com.datastax.spark:spark-cassandra-connector_2.11:2.5.0, it is using the updated com.datastax.oss:java-driver-core-shaded:4.9.0, which no longer requires snakeyaml:1.15
where as mine uses the old com.datastax.oss:java-driver-core-shaded:4.5.0
Why is it working in that pom? we have the same maven listing version for com.datastax.spark:spark-cassandra-connector_2.11:2.5.0
I see it has some exclusions but none addresses the snake yaml version or any of its parent dependencies.
Is there another section of the pom file that addresses this I am missing? please advise.
My pom
<scala.compat.version>2.11</scala.compat.version>
<spark.cassandra.version>2.5.0</spark.cassandra.version>
<dependency>
<groupId>com.datastax.spark</groupId>
<artifactId>spark-cassandra-connector_${scala.compat.version}</artifactId>
<version>${spark.cassandra.version}</version>
</dependency>
where it goes wrong
however another project is using the correct shaded version com.datastax.oss:java-driver-core-shaded:4.9.0, which eliminates the snake dependency
working pom
<scala.compat.version>2.11</scala.compat.version>
<spark.cassandra.version>2.5.0</spark.cassandra.version>
<dependency>
<artifactId>spark-cassandra-connector_${scala.compat.version}</artifactId>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
<exclusion>
<artifactId>netty-all</artifactId>
<groupId>io.netty</groupId>
</exclusion>
<exclusion>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
</exclusion>
</exclusions>
<groupId>com.datastax.spark</groupId>
<version>${spark.cassandra.version}</version>
</dependency>
You add an entry your <dependencyManagement> section of your POM, where you specify the version of snakeyaml that you want.
This will override all transitive version definitions of snakeyaml.
I suggest to switch to the SCC 2.5.2 (or at least 2.5.1) - there were fixes there regarding dependencies, it has driver upgraded to 4.10.0, etc. Another possibility is to use spark-cassandra-connector-assembly instead, with all dependencies included & shaded.

Maven: Resolve dependencies using container dependencies first

I have a plugin project which is added to other container projects as a dependency.
Now, this plugin project uses many frequent dependencies like spring-security, commons-lang, etc.
Usually, the container projects contain their own versions of such frequent dependencies. So, when we add our plugin dependency there are conflicts and the dependencies are resolved based on regular maven dependency resolver and depending on scopes and optional tags provided in the plugin project dependencies.
Is there a way where all the dependencies are resolved using the version in parent dependencies first and iff they are not available then use the version specified in plugin dependency.
Note: optional and scope runtime have a problem that these dependencies are provided by the container and thus beats the aim to provide a hassle-free single dependency to add plugin dependency.
In your plugins pom define the version of a dependency as range of the versions you know the plugin to be able to use. If a container-dependency overlaps this will be used. If no overlapping version, of the dependency both container and plugin need, can be found, an error will be produced, since the negotiation failed.
Use no special scope for the dependencies, since you want them to be included if necessary into the container,
See:
https://maven.apache.org/enforcer/enforcer-rules/versionRanges.html
And:
https://books.sonatype.com/mvnref-book/reference/pom-relationships-sect-project-dependencies.html#pom-relationships-sect-version-ranges
Assuming that your container and plugin projects use the same parent pom you could utilize the <dependencyManagement> section in the parent to define the common artifacts. This allows you to omit the version in the plugins <dependencies> section.
parent:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>group-a</groupId>
<artifactId>artifact-a</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</dependencyManagement>
plugin/module:
<dependencies>
<dependency>
<groupId>group-a</groupId>
<artifactId>artifact-a</artifactId>
</dependency>
</dependencies>
See https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html for further details.
you can exclude it when you build a plugin project and add a dependency to maven.
This is an example. Dependency and main project have conflicted due to logging library. Below is to exclude log4j in dependency project.
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zk.version}</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
P/S: Added from my comments:
I have also developed a system which has a similar architecture with yours. I separate this system into 3 main parts: 1. Commons which contains common code and required maven dependencies, 2. The main project, 3. plugin project. You can refer this.

Class path contains multiple SLF4J bindings

I tried to debug my project but got this
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/local/storm/lib/logback-classic-1.0.13.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/user/.m2/repository/ch/qos/logback/logback-classic/1.0.13/logback-classic-1.0.13.jar!/org/slf4j/impl/StaticLoggerBinder.class]
what should i do ?
i haven't any dependency for SLF4J in POM just this
<dependency>
<groupId>org.apache.storm</groupId>
<artifactId>storm-core</artifactId>
<version>0.9.6</version>
<scope>provided</scope>
</dependency>
i tried to use the solutions i found in similar posts but didn't solve it ! like
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>logback-classic</groupId>
<artifactId>ch.qos.logback</artifactId>
</exclusion>
</exclusions>
I tried to replace provided to compile but didn't solve it too .
I got this with using mvn dependency:tree
org.slf4j:log4j-over-slf4j:jar:1.6.6:provided
org.slf4j:slf4j-api:jar:1.7.5:compile
You have 2 sources of dependencies for storm one from /usr/local/storm/lib/ directory and the second from maven which cause multiple binding for sl4j.
Try using just one source of dependencies.
Following the line of the accepted answer, the way i found to try using just one source of dependencies, was to clone/create again the project i was working on. In my case was an already started project and probably due to poor connection speed, i had a few issues re importing all Maven Projects. So i messed up a bit with the project's settings trying to access all the propper dependencies.
That caused some unexpected changes on my project's pom.xml file that leaded to the error. So, cloning again de project to a new folder and making the maven re import with some decent internet speed just worked fine for me.
Hope to be helpful. Regards

"Failed to load class "org.slf4j.impl.StaticLoggerBinder"." [duplicate]

My application is to be deployed on both tcServer and WebSphere 6.1. This application uses ehCache and so requires slf4j as a dependency.
As a result I've added the slf4j-api.jar (1.6) jar to my war file bundle.
The application works fine in tcServer except for the following error:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
However, when I deploy in WebSphere I get a java.lang.NoClassDefFoundError: org.slf4j.impl.StaticLoggerBinder.
Also accompanied by Failed to load class "org.slf4j.impl.StaticMDCBinder"
I've checked the classpaths of both application servers and there is no other slf4j jar.
Does anyone have any ideas what may be happening here?
I had the same issue with WebSphere 6.1. As Ceki pointed out, there were tons of jars that WebSphere was using and one of them was pointing to an older version of slf4j.
The No-Op fallback happens only with slf4j -1.6+ so anything older than that will throw an exception and halts your deployment.
There is a documentation in SLf4J site which resolves this. I followed that and added slf4j-simple-1.6.1.jar to my application along with slf4j-api-1.6.1.jar which I already had.
If you use Maven, add the following dependencies, with ${slf4j.version} being the latest version of slf4j
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>${slf4j.version}</version>
</dependency>
This solved my issue.
This is for those who came here from google search.
If you use maven just add the following
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
Or
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.4</version>
</dependency>
Simply add this to your pom.xml:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
Quite a few answers here recommend adding the slf4j-simple dependency to your maven pom file. You might want to check for the most current version.
At https://mvnrepository.com/artifact/org.slf4j/slf4j-simple
you'll find the latest version of the SLF4J Simple Binding. Pick the one that suites you best (still 1.7.32 from 2021-07 is the stable version as of 2021-10) and include it to your pom.xml.
For your convenience some dependencies are shown here - but they might not be up-to-date when you read this!
Alpha Version of 2021-08
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.0-alpha5</version>
</dependency>
Beta Version of Feb 2019
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.8.0-beta4</version>
</dependency>
Stable Version 2021-07
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.32</version>
</dependency>
I removed the scope test part thanks to the comment below.
You need to add following jar file in your classpath: slf4j-simple-1.6.2.jar. If you don't have it, please download it. Please refer to http://www.slf4j.org/codes.html#multiple_bindings
Sometime we should see the note from the warnin SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details..
This happens when no appropriate SLF4J binding could be found on the class path
You can search the reason why this warning comes.
Adding one of the jar from *slf4j-nop.jar, slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar or logback-classic.jar* to the class path should solve the problem.
compile "org.slf4j:slf4j-simple:1.6.1"
for example add the above code to your build.gradle or the corresponding code to pom.xml for maven project.
I was facing same error. I have configured slf4j-api, slf4j-log4j12 and log4j, in my local development. All configuration was fine, but slf4j-log4j12 dependency which I copied from mvnrepository had test scope <scope>test</scope>. When I removed this every thing is fine.
Some times silly mistakes breaks our head ;)
put file slf4j-log4j12-1.6.4.jar in the classpath will do the trick.
SLF4j is an abstraction for various logging frameworks. Hence apart from having slf4j you need to include any of your logging framework like log4j or logback (etc) in your classpath.
To have an idea refer the First Baby Step in http://logback.qos.ch/manual/introduction.html
If you are using maven to dependency management so you can just add following dependency in pom.xml
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.6</version>
</dependency>
For non-Maven users
Just download the library and put it into your project classpath.
Here you can see details: http://www.mkyong.com/wicket/java-lang-classnotfoundexception-org-slf4j-impl-staticloggerbinder/
I got into this issue when I get the following error:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
when I was using slf4j-api-1.7.5.jar in my libs.
Inspite I tried with the whole suggested complement jars, like slf4j-log4j12-1.7.5.jar, slf4j-simple-1.7.5 the error message still persisted. The problem finally was solved when I added slf4j-jdk14-1.7.5.jar to the java libs.
Get the whole slf4j package at http://www.slf4j.org/download.html
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
Put above mentioned dependency in pom.xml file
I was facing the similar problem with Spring-boot-2 applications with Java 9 library.
Adding the following dependency in my pom.xml solved the issue for me:
<dependency>
<groupId>com.googlecode.slf4j-maven-plugin-log</groupId>
<artifactId>slf4j-maven-plugin-log</artifactId>
<version>1.0.0</version>
</dependency>
Slf4j is a facade for the underlying logging frameworks like log4j, logback, java.util.logging.
To connect with underlying frameworks, slf4j uses a binding.
log4j - slf4j-log4j12-1.7.21.jar
java.util.logging - slf4j-jdk14-1.7.21.jar etc
The above error is thrown if the binding jar is missed. You can download this jar and add it to classpath.
For maven dependency,
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
This dependency in addition to slf4j-log4j12-1.7.21.jar,it will pull slf4j-api-1.7.21.jar as well as log4j-1.2.17.jar into your project
Reference: http://www.slf4j.org/manual.html
Please add the following dependencies to pom to resolve this issue.
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
As an alternative to the jar inclusion and pure maven solutions, you can include it from maven with gradle.
Example for version 1.7.25
// https://mvnrepository.com/artifact/org.slf4j/slf4j-simple
api group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25'
Put this within the dependencies of your build.gradle file.
In the Websphere case, you have an older version of slf4j-api.jar, 1.4.x. or 1.5.x lying around somewhere. The behavior you observe on tcServer, that is fail-over to NOP, occurs on slf4j versions 1.6.0 and later. Make sure that you are using slf4j-api-1.6.x.jar on all platforms and that no older version of slf4j-api is placed on the class path.
I am working in a project Struts2+Spring. So it need a dependency slf4j-api-1.7.5.jar.
If I run the project, I am getting error like
Failed to load class "org.slf4j.impl.StaticLoggerBinder"
I solved my problem by adding the slf4j-log4j12-1.7.5.jar.
So add this jar in your project to solve the issue.
As SLF4J Manual states
The Simple Logging Facade for Java (SLF4J) serves as a simple facade
or abstraction for various logging frameworks, such as
java.util.logging, logback and log4j.
and
The warning will disappear as soon as you add a binding to your class path.
So you should choose which binding do you want to use.
NoOp binding (slf4j-nop)
Binding for NOP, silently discarding all logging.
Check fresh version at https://search.maven.org/search?q=g:org.slf4j%20AND%20a:slf4j-nop&core=gav
Simple binding (slf4j-simple)
outputs all events to System.err. Only messages of level INFO and higher are printed. This binding may be useful in the context of small applications.
Check fresh version at https://search.maven.org/search?q=g:org.slf4j%20AND%20a:slf4j-simple&core=gav
Bindings for the logging frameworks (java.util.logging, logback, log4j)
You need one of these bindings if you are going to write log to a file.
See description and instructions at https://www.slf4j.org/manual.html#projectDep
My opinion
I would recommend Logback because it's a successor to the log4j project.
Check latest version of the binding for it at https://search.maven.org/search?q=g:ch.qos.logback%20AND%20a:logback-classic&core=gav
You get console output out of the box but if you need to write logs into file just put FileAppender configuration to the src/main/resources/logback.xml or to the src/test/resources/logback-test.xml just like this:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>logs/logs.log</file>
<encoder>
<pattern>%date %level [%thread] %logger{10} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
<logger level="DEBUG" name="com.myapp"/>
</configuration>
(See detailed description in manual: https://logback.qos.ch/manual/configuration.html)
this can resolve using the same version. I tried this and solved it
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
I added this dependency to resolve this issue:
https://mvnrepository.com/artifact/org.slf4j/slf4j-simple/1.7.25
Most likely your problem was because of <scope>test</scope> (in some cases also <scope>provided</scope>), as mentioned #thangaraj.
Documentation says:
This scope indicates that the dependency is not required for normal
use of the application, and is only available for the test compilation
and execution phases. Test dependencies aren’t transitive and are only present for test and execution classpaths.
So, if you don't need dependecies for test purposes then you can use instead of (what you will see in mvnrepository):
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-nop -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.24</version>
<scope>test</scope>
</dependency>
Without any scopes (by default would be compile scope when no other scope is provided):
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-nop -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.25</version>
</dependency>
This is the same as:
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-nop -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.25</version>
<scope>compile</scope>
</dependency>
Here are my 5 cents...
I had the same issues while running tests. So I've fixed it by adding an implementation for the test runtime only. I'm using gradle for this project.
// https://mvnrepository.com/artifact/ch.qos.logback/logback-classic
testRuntimeOnly group: 'ch.qos.logback', name: 'logback-classic',
version: '1.2.3'
encountered the same problem on payara 5.191
jcl-over-slf4j together with slf4j-log4j12 solved the problem
<properties>
<slf4j.version>1.7.29</slf4j.version>
</properties>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
As per the SLF4J Error Codes
Failed to load class org.slf4j.impl.StaticLoggerBinder
This warning message is reported when the org.slf4j.impl.StaticLoggerBinder class could not be loaded into memory. This happens when no appropriate SLF4J binding could be found on the class path. Placing one (and only one) of slf4j-nop.jar slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar or logback-classic.jar on the class path should solve the problem.
Note that slf4j-api versions 2.0.x and later use the ServiceLoader mechanism. Backends such as logback 1.3 and later which target slf4j-api 2.x, do not ship with org.slf4j.impl.StaticLoggerBinder. If you place a logging backend which targets slf4j-api 2.0.x, you need slf4j-api-2.x.jar on the classpath. See also relevant faq entry.
SINCE 1.6.0 As of SLF4J version 1.6, in the absence of a binding, SLF4J will default to a no-operation (NOP) logger implementation.
If you are responsible for packaging an application and do not care about logging, then placing slf4j-nop.jar on the class path of your application will get rid of this warning message. Note that embedded components such as libraries or frameworks should not declare a dependency on any SLF4J binding but only depend on slf4j-api. When a library declares a compile-time dependency on a SLF4J binding, it imposes that binding on the end-user, thus negating SLF4J's purpose.
for me the total fix was:
1
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
plus
2 create file log4j.properties
and add inside:
# Root logger option
log4j.rootLogger=INFO, stdout
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
else I got some exceptions in the console.
According to SLF4J official documentation
Failed to load class org.slf4j.impl.StaticLoggerBinder
This warning message is reported when the
org.slf4j.impl.StaticLoggerBinder class could not be loaded into
memory. This happens when no appropriate SLF4J binding could be found
on the class path. Placing one (and only one) of slf4j-nop.jar,
slf4j-simple.jar, slf4j-log4j12.jar, slf4j-jdk14.jar or
logback-classic.jar on the class path should solve the problem.
Simply add this jar along with slf4j api.jar to your classpath to get things done.
Best of luck
I solve it adding this library: slf4j-simple-1.7.25.jar
You can download this in official web https://www.slf4j.org/download.html
For me the issue was:
Using Hibernate, I saw that it already used slf4j, and it was in my classpath already, so I decided to use it.
The next step - adding imlementor for slf4j, so I added to maven:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.25</version>
</dependency>
But it failed with error! SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”
The solution was:
Hibernate's dependency of slf4j was version 1.7.26, and I added minor version dependency 1.7.25. So when I fixed this - all became OK
I know this post is a little old, but in case anyone else runs into this problem:
Add slf4j-jdk14-X.X.X.jar to your CLASSPATH (where X.X.X is the version number - e.g. slf4j-jdk14-1.7.5.jar).
HTH
Peter

Categories

Resources