Thursday, October 20, 2011

Log4j mixing log messages between applications into Weblogic


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

Wednesday, October 19, 2011

Why Log4j is not logging?


Recently I had a problem with the log mechanism in a small system I had to maintain.

It simply was ignoring log4j.properties configuration and was logging messages with INFO level.

After some time I discovered that it was using common-logging instead pure log4j.

There is no problem using commons-logging, it does work fine. The real problem was that only commons-logging-api.jar and log4j.jar were included in classpath. It was missing commons-logging.jar.

To support log4j, commos-logging needs both jars in classpath: commons-logging and commons-logging-api.

After adding commons-logging.jar in the classpath, log4j.properties started being read and respected.

Read more about commons-logging here: http://commons.apache.org/logging/guide.html#Jars Included in the Standard Distribution

Saturday, October 1, 2011

1Z0-894 Oracle Certified Expert Java Platform, Enterprise Edition 6 JavaServer Pages and Servlet Developer



I've just started my preparation to Java for Web development certification, former SCWCD - Sun Certified Web Component Developer. 


In the newest version of this certification, and already in the Oracle world, its certification
code is 1Z0-894, and the name is Oracle Certified Expert, Java Platform, Enterprise Edition 6 Servlet and JavaServer Pages Developer.


You'll find more details about this test on the Oracle site: http://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=41&p_exam_id=1Z0_894


EPractize Labs's website also has interesting information, including a simulation of how long you will need to prepare for the test: http://www.epractizelabs.com/blog2/?p=106


Because this test is relatively new, and I had already read the book Head First Servlets & JSP 1.4 JEE twice, I decided to prepare only with the Study Guide and Mock Exam EPractize Labs:
http://www.epractizelabs.com/certification/sun/oce-jsp-servlet-exam-6.html


This material is $ 40.5 dollars, but the EPractize Labs guarantees money back if you get the test failed.


This Study Guide has some Ctlr-C/Ctrl-V errors, several typos and content is very superficial, but I intend to fill the gap in Internet surveys.


I have also created a project in Eclipse to get going in practice what I learn in the Study Guide.


My goal is to make the test in the first week of December/2011, I hope it is enough time!


If you have tips or questions about this certification, share commenting on this post.


--
PS: The result: http://dotdebug.blogspot.com/2011/12/pass-1z0-894-oracle-certified-expert.html