Dave,
Thank you for the clarifications. Looking at [1] and given that
o.a.c.logging.LogFactory class as shipped in jcl104-over-slf4j.jar does not
define FACTORY_PROPERTIES and FACTORY_DEFAULT, do you have an idea how can
the code run? The code should barf before the find() method in
DiscoverSingleton can be invoked...
Have you modified jcl104-over-slf4j.jar?
Anyway, at this point, the correct thing to do would be to define the
missing variables in jcl104-over-slf4j. Would you like to give a modified
copy of SLF4J a try?
[1]
http://svn.apache.org/viewcvs.cgi/webservices/axis/trunk/java/src/org/apache/axis/components/logger/LogFactory.java
At 06:00 PM 3/21/2006, Dave Wallace wrote:
Hi Ceki,
I knew I did I horrible job of explaining, there's just too many levels
of indirection involved ! :) Anyhow:
I am pretty certain that I've gotten rid of commons-logging, I believe
the code that caused the problem is actually in
org.apache.axis.components.logger.LogFactory in the _axis.jar_. In
which there is a bit of code:
-----
return DiscoverSingleton.find(org.apache.commons.logging.LogFactory.class,
org.apache.commons.logging.LogFactory.FACTORY_PROPERTIES,
org.apache.commons.logging.LogFactory.FACTORY_DEFAULT);
----
Since my copy of axis.jar was compiled against commons-logging.jar,
org.apache.commons.logging.LogFactory.FACTORY_* must refer to constants
that were _folded into the axis.jar_ code (these constants do not appear
in jcl104-over-slf4j.jar) with these values (from commons-logging source):
----
public static final String FACTORY_PROPERTY =
"org.apache.commons.logging.LogFactory";
public static final String FACTORY_DEFAULT =
"org.apache.commons.logging.impl.LogFactoryImpl";
----
And my original failure resulted precisely because I do not have
"org.apache.commons.logging.impl.LogFactoryImpl" in my classpath.
DiscoverSingleton is from org.apache.commons.discovery.tools:
http://jakarta.apache.org/commons/discovery/commons-discovery-0.2/docs/api/org/apache/commons/discovery/tools/DiscoverSingleton.html
.
Those docs describe how the discovery process works, first looking for
the property, then attempting an SPI lookup, then falling back to the
default.
At any rate, my take on the /META-INF/services SPI mechanism is that it
allows jcl104-over-slf4j.jar to announce: "I am the provider of the
service named org.apache.commons.logging.LogFactory and the
implementation is org.apache.commons.logging.impl.SLF4FLogFactory"
-Dave
Ceki Gülcü wrote:
>
> Hello Dave,
>
> I am a little puzzled by your message. The code contained in
> jcl104-over-slf4j.jar makes no use of meta-information or the
> org.apache.commons.logging.LogFactory system variable. The fact that
> setting JCL related variables has an effect means that you have a copy
> of commons-logging.jar or commons-logging-api.jar in your environment.
> Have you checked that?
>
> Cheers,
>
> At 04:25 PM 3/21/2006, Dave Wallace wrote:
>> Hello,
>> I recently encountered some trouble adding axis.jar to an existing
>> project that uses slf4j and jcl104-over-slf4j.jar to take over logging
>> for hibernate and a few other apache commons jars.
>> The application failed to load axis.jar until I set this property on the
>> Java VM command line:
>>
-Dorg.apache.commons.logging.LogFactory=org.apache.commons.logging.impl.SLF4FLogFactory.
>>
>>
>> As it turns out, axis.jar uses commons-logging but through a
>> commons-discovery mechanism that looks for a factory implementation
>> based on the value of a property with a name from
>> org.apache.commons.logging.LogFactory.FACTORY_PROPERTY. Hence the
>> property is required, but this led me to look a little deeper into the
>> discovery mechanism.
>>
>> Following
>> http://java.sun.com/j2se/1.3/docs/guide/jar/jar.html#Service%20Provider
>> I added a file named
>> "/META-INF/services/org.apache.commons.logging.LogFactory" to
>> jcl104-over-slf4j.jar. The file contained a single line naming
>> org.apache.commons.logging.impl.SLF4FLogFactory as a provider of the
>> LogFactory service. With this modification the property is no longer
>> necessary.
>>
>> Do you think this might be a good thing to add to the jar permanently so
>> that whenever jcl104-over-slf4j.jar is dropped in the classpath it
>> becomes a provider of the org.apache.commons.logging.LogFactory service?
>>
>> - Dave
>
_______________________________________________
dev mailing list
dev@slf4j.org
http://slf4j.org/mailman/listinfo/dev
--
Ceki Gülcü
http://ceki.blogspot.com/
_______________________________________________
dev mailing list
dev@slf4j.org
http://slf4j.org/mailman/listinfo/dev