I have an Web Service JWS application running in Weblogic 10.2 and its logs were being mixing with another web application running in the same server.
I thought that applications were totaly independent in the server but they are not. They share some classloaders. See picture bellow:
This problem occurs because jog4j.jar is shared between applications and it is retrieved from the same classloader.
In order to solve this issue, it is necessary that each application has its own log4j.jar packed in its .war (or .ear when applicable). It is important that all applications have its own log4j packed. If one of them does not, the problem will still persist.
Besides having log4j.jar packed, its also necessary to edit weblogic-application.xml to warn Weblogic to use log4j classes from application classloader.
Here you have an example of weblogic-application.xml:
<?xml version='1.0' encoding='UTF-8'?>
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<prefer-application-packages>
<package-name>org.apache.log4j.*</package-name>
</prefer-application-packages>
</weblogic-application>
If you are using ant to build your Weblogic JWS webservice with task jwsc, here you have a snippet of build.xml that you can use to pack log4j into .war and use a custom weblogic-application.xml.
log4j.jar must be placed into .war in WEB-INF/lib and weblogic-application.xml into .ear in META-INF
<target name="jwsc" description="build web service">
<delete dir="${build.dir}"/>
<mkdir dir="${build.dir}"/>
<jwsc
srcdir="${webapp.dir}"
destdir="${build.dir}"
verbose="on" debug="on"
keepGenerated="no" >
<jws file="${jwsc.file}"
compiledWsdl="${jwsc.jws.compiledWsdl}"
contextPath="${jwsc.jws.contextPath}"
type="JAXWS" explode="false" >
</jws>
</jwsc>
<war destfile="${war.built}" update="true" >
<fileset dir="${webapp.dir}">
<include name="**/*.jar" />
</fileset>
</war>
<copy file="${service.src}/resource/weblogic-application.xml" todir="${build.dir}/META-INF/" overwrite="true" />
</target>
It is important to know that ${war.built} must point to .war file and ${webapp.dir} must point to the web service source that owns WEB-INF folder, that owns lib folder, that owns log4j.jar.
Links:
http://download.oracle.com/docs/cd/E12840_01/wls/docs103/programming/classloading.html
https://forums.oracle.com/forums/thread.jspa?threadID=689458
http://www.coderanch.com/t/554020/Web-Services/java/adding-jar-files-building-war
http://ant.apache.org/manual/Tasks/war.html
No comments:
Post a Comment