Issue Details (XML | Word | Printable)

Key: MULE-3417
Type: Bug Bug
Status: Open Open
Priority: To be reviewed To be reviewed
Assignee: Unassigned
Reporter: Greg Slonim
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
Mule

Mule classloader does not see custom Log4j filters written by user and included with user jar. Issues ClassNotFoundException during start

Created: 30/May/08 11:55 AM   Updated: 30/May/08 12:37 PM
Component/s: Core: Bootstrap / Java Service Wrapper
Affects Version/s: 1.4.4
Fix Version/s: None

Time Tracking:
Not Specified

Environment:
OS - Windows
JDK - 1.6

Labels:
User impact: High
Effort points: 4
Configuration: I do not think that mule configuration is important here, please let me know if I need to include it anyway
Log Output:
--> Wrapper Started as Console
Launching a JVM...
log4j:ERROR Could not instantiate class [org.integrationlayer.util.logging.GenericOutputFilter].
java.lang.ClassNotFoundException: org.integrationlayer.util.logging.GenericOutputFilter
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at org.apache.log4j.helpers.Loader.loadClass(Loader.java:178)
at org.apache.log4j.helpers.OptionConverter.instantiateByClassName(OptionConverter.java:319)
at org.apache.log4j.xml.DOMConfigurator.parseFilters(DOMConfigurator.java:279)
at org.apache.log4j.xml.DOMConfigurator.parseAppender(DOMConfigurator.java:200)
at org.apache.log4j.xml.DOMConfigurator.findAppenderByName(DOMConfigurator.java:150)
at org.apache.log4j.xml.DOMConfigurator.findAppenderByReference(DOMConfigurator.java:163)
at org.apache.log4j.xml.DOMConfigurator.parseChildrenOfLoggerElement(DOMConfigurator.java:425)
at org.apache.log4j.xml.DOMConfigurator.parseRoot(DOMConfigurator.java:394)
at org.apache.log4j.xml.DOMConfigurator.parse(DOMConfigurator.java:829)
at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:712)
at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:618)
at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:470)
at org.apache.log4j.LogManager.<clinit>(LogManager.java:122)
at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:73)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:88)
at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:155)
at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:131)
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:203)
at org.mule.modules.boot.LicenseHandler.<clinit>(LicenseHandler.java:34)
at org.mule.modules.boot.MuleBootstrap.requestLicenseAcceptance(MuleBootstrap.java:135)
at org.mule.modules.boot.MuleBootstrap.prepareBootstrapPhase(MuleBootstrap.java:99)
at org.mule.modules.boot.MuleBootstrap.main(MuleBootstrap.java:62)
Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
  Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.


 Description  « Hide
SUMMARY:

Mule boot classloader does not find a custom-written Log4j filter included in our code distribution when Mule is started.
Issues java.lang.ClassNotFoundException and crashes.

DETAIL:

We had a need to write a custom Log4J filter to use in our logging process.
We use SLF4J as a façade for Log4J
We know that Mule is using a static bridge JCL->SLF4J
We wrote the filter, configured it in log4j.xml, deployed the application on Mule.

Here is a snippet of log4j.properties

<appender name="MainSystemAppender" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="system.log"/>
<param name="Append" value="true"/>
<param name="MaxFileSize" value="5MB"/>
<param name="MaxBackupIndex" value="5"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d [%t] %c: %m\n"/>
</layout>

<filter class="org.integrationlayer.util.logging.GenericOutputFilter">
<param name="objectValue" value="HealthCheck"/>
</filter>
</appender>

We absolutely verified that the filter class file is in the jar. Jar is deployed under $MULE_HOME/lib/user. Mule would not start, issues exception:

log4j:ERROR Could not instantiate class [org.integrationlayer.util.logging.GenericOutputFilter].
java.lang.ClassNotFoundException: org.integrationlayer.util.logging.GenericOutputFilter
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at org.apache.log4j.helpers.Loader.loadClass(Loader.java:178)
at org.apache.log4j.helpers.OptionConverter.instantiateByClassName(OptionConverter.java:319)
at org.apache.log4j.xml.DOMConfigurator.parseFilters(DOMConfigurator.java:279)
at org.apache.log4j.xml.DOMConfigurator.parseAppender(DOMConfigurator.java:200)
at org.apache.log4j.xml.DOMConfigurator.findAppenderByName(DOMConfigurator.java:150)
at org.apache.log4j.xml.DOMConfigurator.findAppenderByReference(DOMConfigurator.java:163)
at org.apache.log4j.xml.DOMConfigurator.parseChildrenOfLoggerElement(DOMConfigurator.java:425)
at org.apache.log4j.xml.DOMConfigurator.parseRoot(DOMConfigurator.java:394)
at org.apache.log4j.xml.DOMConfigurator.parse(DOMConfigurator.java:829)
at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:712)
at org.apache.log4j.xml.DOMConfigurator.doConfigure(DOMConfigurator.java:618)
at org.apache.log4j.helpers.OptionConverter.selectAndConfigure(OptionConverter.java:470)
at org.apache.log4j.LogManager.<clinit>(LogManager.java:122)
at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:73)
at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:88)
at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:155)
at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:131)
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:203)
at org.mule.modules.boot.LicenseHandler.<clinit>(LicenseHandler.java:34)
at org.mule.modules.boot.MuleBootstrap.requestLicenseAcceptance(MuleBootstrap.java:135)
at org.mule.modules.boot.MuleBootstrap.prepareBootstrapPhase(MuleBootstrap.java:99)
at org.mule.modules.boot.MuleBootstrap.main(MuleBootstrap.java:62)

It seems that the boot classloader cannot see our application jars sitting in the $MULE_HOME/lib/user. In fact, I attempted to move the jar with the filter into $MULE_HOME/lib/opt without any result

Any and all advice is greatly appreciated. It has been very frustrating to see Classloader issues here.



 All   Comments   Work Log   Change History   Transitions   FishEye      Sort Order: Ascending order - Click to sort in descending order
Andrew Perepelytsya added a comment - 30/May/08 11:59 AM
I think you can try dropping your custom filter in lib/boot

Haven't investigated it, but it seems that Mule didn't even have a chance to setup a classloader when this error occured. Really more of a deployment exercise than coding.


Greg Slonim added a comment - 30/May/08 12:37 PM
Andrew, thanks for the tip. I copied the jar with the filter into lib/boot. Same result, class not found.