I'm in the process of upgrading some oldish code, and I'm encountering some compatibility problems with the loggers required by various libraries.
See the *appendix* below for my project.clj, which loads a number of libraries and to which I've recently added statements like this:
[com.hp.hpl.jena/jena "2.6.4"
:exclusions [org.slf4j/slf4j-log4j12
org.slf4j/slf4j-api
]
]
I added these exclusions to turn off this error:
java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;[Ljava/lang/Object;Ljava/lang/Throwable;)V
Which I gather from reading things like this:
<
http://stackoverflow.com/questions/3519978/logging-framework-incompatibility>
- stem from incompatible logging libraries.
Excluding these dependencies seems to turn off this error, but now when I try load my code, I'm getting this error:
org.slf4j.LoggerFactory
[Thrown class java.lang.ClassNotFoundException]
See the appendix for a stack trace.
I'm including org.clojure/tools.logging in the project.clj, but it's not clear to me how to keep the logger associated with my 'jena' library happy without re-introducing my compatibility error.
Up to this point, my logging has 'just worked', so I guess this is an opportunity to learn about this stuff. Is there a good way to deal with the fact that different supporting libraries will use different logging regimes?
Thanks for any help.
* appendix *
(defproject MyProject "1.0.0-SNAPSHOT"
:jvm-opts ["-Xmx8g" "-XX:+HeapDumpOnOutOfMemoryError" "-XX:+UseSerialGC"]
:dependencies [[org.clojure/clojure "1.3.0"]
[org.clojure/math.numeric-tower "0.0.1"]
[org.clojure/tools.trace "0.7.1"]
[org.clojure/tools.logging "0.2.3"]
[org.clojure/algo.generic "0.1.0"]
[clojure-csv "1.3.2"]
;;statistics...
[incanter/incanter-core "1.3.0-SNAPSHOT"]
[incanter/incanter-charts "1.3.0-SNAPSHOT"]
[incanter/incanter-processing "1.3.0-SNAPSHOT"]
;;web
[compojure "1.1.1"]
[hiccup "1.0.0"]
[ring "1.1.1"]
;;jena ...
[com.hp.hpl.jena/jena "2.6.4"
:exclusions [org.slf4j/slf4j-log4j12
org.slf4j/slf4j-api
]
]
;;TDB
[com.hp.hpl.jena/arq "2.8.8"
:exclusions [org.slf4j/slf4j-api]
]
[com.hp.hpl.jena/iri "0.8"]
[com.ibm.icu/icu4j "3.4.4"]
[com.hp.hpl.jena/tdb "0.8.10"
:exclusions [org.slf4j/slf4j-api]
]
;;lucene
[org.apache.lucene/lucene-core "2.3.1"]
]
:dev-dependencies [
[swank-clojure "1.3.2"
:exclusions [org.clojure/clojure]]
[lein-autodoc "0.9.0"]
]
)
-- stack trace:
org.slf4j.LoggerFactory
[Thrown class java.lang.ClassNotFoundException]
Backtrace:
0: java.net.URLClassLoader$1.run(URLClassLoader.java:217)
1: java.security.AccessController.doPrivileged(Native Method)
2: java.net.URLClassLoader.findClass(URLClassLoader.java:205)
3: java.lang.ClassLoader.loadClass(ClassLoader.java:321)
4: sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
5: java.lang.ClassLoader.loadClass(ClassLoader.java:266)
6: com.hp.hpl.jena.util.Metadata.<clinit>(Metadata.java:26)
7: com.hp.hpl.jena.JenaRuntime.<clinit>(JenaRuntime.java:25)
8: com.hp.hpl.jena.rdf.model.impl.RDFReaderFImpl.<clinit>(RDFReaderFImpl.java:85)
9: com.hp.hpl.jena.rdf.model.impl.ModelCom.<clinit>(ModelCom.java:42)