Package dependencies in a jar - java

I'm trying with a .jar library but the init method has a call to slf4j. I have added slf4j to my dependencies Project but I believe that I need to repackage the library with the dependency inside the jar.
The method I'm calling in the jar has this line:
private static final org.slf4j.Logger LOG =
org.slf4j.LoggerFactory.getLogger(Init.class);
But I have this error:
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.

You also need an slf4j implementation, just as your error said. There are multiple. Here are a two:
slf4j-simple: it prints out to your console/terminal
log4j-slf4j-impl: The Apache Log4j SLF4J API binding to Log4j 2 Core
If you need just the .jar, choose your needed version and you can download it under files.
If you need more help, the official manual explains it quite good.
Hope I could help you

Related

Apache James 3.7.2 Spring - SLF4J: No SLF4J providers were found

I downloaded a binary distribution of Apache James, the Spring wired distribution.
I run it but I get the below error:
C:\prod\james-server-spring-app-3.7.2\bin>run
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See https://www.slf4j.org/codes.html#noProviders for further details.
SLF4J: Class path contains SLF4J bindings targeting slf4j-api versions 1.7.x or earlier.
SLF4J: Ignoring binding found at [jar:file:/C:/prod/james-server-spring-app-3.7.2/lib/log4j-slf4j-impl-2.17.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See https://www.slf4j.org/codes.html#ignoredBindings for an explanation.
https://james.apache.org/server/monitor-logging.html
The distribution is unchanged but in "\conf" folder there is not the "log4j.properties" as stated in the official documentation.
Instead there is the "log4j2.xml" file.
In "\lib" folder there are the below libs:
slf4j-api-2.0.1.jar
log4j-api-2.17.1.jar
log4j-core-2.17.1.jar
log4j-slf4j-impl-2.17.1.jar
Please could someone help me to start James in mode that I can follow the activities?
Thank you in advance.
Ivano
SOLVED
The important message is the below:
SLF4J: Class path contains SLF4J bindings targeting slf4j-api versions 1.7.x or earlier.
So I replaced the libs distribued from Apache James community with the below libs:
log4j-api-2.19.0.jar
log4j-core-2.19.0.jar
log4j-slf4j2-impl-2.19.0.jar
slf4j-api-2.0.5.jar
The above combination of libs makes slf4j happy to works with log4j log provider.

Using solrj library

I'm trying to use solrj library in order to do some indexing work on my Cloudera Sorl server.
At this point
String zkHostString = "http://xxx.xxx.xxx.xxx:xxxx/solr";
CloudSolrClient solr = new CloudSolrClient(zkHostString);
I got 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
File slf4j-api-1.7.7.jar exists in my library path (I got all jar files from /dist and /dist/solrj-lib)
To build my project I'm using Eclipse if it doues matter.
Most likely you have old version of slf4j in your classpath, that came from a transitive dependency. Try to check this and then run dependency tree or any other tool to find and resolve the conflicts.

Multiple SLF4J bindings

I have two jar files in my classpath which has a dependency with slf4j. This causes a warning message in my Java program:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/lib/slf4j-log4j12-1.7.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/lib/myprogram.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]
Is there a way to remove this warning message by only changing the gradle file, and without removing any of above jar files from my classpath?
Thanks
Is there a way to remove this warning message by only changing the gradle file, and without removing any of above jar files from my classpath?
No.
The only way to remove that warning is by providing only a single binding for SLF4J. And you really should do so:
Even when multiple bindings are present, SLF4J will pick one logging framework/implementation and bind with it. The way SLF4J picks a binding is determined by the JVM and for all practical purposes should be considered random.
Since you provide a binding in your own jar, the easiest way to restrict yourself to a single binding would be to exclude the slf4j-log4j12-1.7.6.jar.

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". Java Application Error

I am writing server side socket application using Java, but I have no idea what can cause this 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.
How can I solve this problem?
You are getting this message because slf4j could not find a binding in your classpath. slf4j is like a wrapper over other logging frameworks. It needs the binding library of the logging framework you intend to use to actually log the messages. e.g., for using log4j, add the libraries slf4j-log4j12.jar and log4j.jar.
More details can be found in the SLF4J manual at http://www.slf4j.org/manual.html.
To switch logging frameworks, just replace slf4j bindings on your
class path. For example, to switch from java.util.logging to log4j,
just replace slf4j-jdk14-1.7.10.jar with slf4j-log4j12-1.7.10.jar.
SLF4J does not rely on any special class loader machinery. In fact,
each SLF4J binding is hardwired at compile time to use one and only
one specific logging framework. For example, the
slf4j-log4j12-1.7.10.jar binding is bound at compile time to use
log4j. In your code, in addition to slf4j-api-1.7.10.jar, you simply
drop one and only one binding of your choice onto the appropriate
class path location. Do not place more than one binding on your class
path.

failed to load class 'org.slf4j.impl.StaticLoggerBinder'

I created a jar file with all the dependencies, and I implemented the logging using slf4j + logback. Thus I have a logback.xml file defined for all the loggers. However when I run the jar it gave me this message:
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.
I dont see any logging happening. After I unzip the jar file, I can see the org.slf4j folder. I don't know why this is not working.
From http://www.slf4j.org/codes.html#StaticLoggerBinder (the link in the message):
This error 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. 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. You can download SLF4J bindings from the
project download page.
In other words, you need a slf4j backend in your classpath, e.g. logback.
It seems logback-classic.jar is missing from classpath.
Take a look at http://slf4j.org/manual.html#swapping.
Is this a scala project? If yes then adding the below dependency will help. It worked for me.
"org.slf4j" % "slf4j-simple" % "1.7.12"

Categories

Resources