ClassNotFoundException and NoClassDefFoundError when running plugin
-------------------------------------------------------------------
Key: MNG-2550
URL: http://jira.codehaus.org/browse/MNG-2550
Project: Maven 2
Issue Type: Bug
Components: Plugins and Lifecycle
Affects Versions: 2.0.4
Reporter: Joost den Boer
I created a plugin which runs a small application which does some parsing,
logging and serializing. When running the plugin I get ClassNotFoundExceptions
and NoClassDefFoundErrors.
The application used BeanUtils (1.7). Somewhere in that package a Log instance
is created, but the classloader cannot find org.apache.log4j.Logger and an
NoClassDefFoundError is thrown.
The application serializes objects to a file using the ObjectOutputStream and
ObjectInputStream. Serializing to a file works fine. Serializing from file to
an Object throws a ClassNotFoundException because the base classloader does not
know any object from any dependency.
Both errors are caused by the classloader not knowing any of the dependend
packages of the Maven project in which the plugin is used or on which the
plugin depends.
I tried several solutions: using my own URLClassLoader extention and using
ClassWorld and creating a new ClassRealm. To both I added all
project.RuntimeClasspathElements.
These solutions fixed some problems but not all. In some cases the original
classloader is still used (by included packages like org.apache.common.logging
or by base java classes like java.io.ObjectInputStream) and that classloaded
does not know my project classes and dependend packages.
Can't maven itself not just include all dependend packages of the project (and
plugin) on the classpath so you don't have to do that yourself inside the
plugin ?
I searched for similar bugs and found some but they are all fixed and closed in
older maven version.
Can someone please help me with this issue ?
Here part of the stacktrace. As you can see, the ObjectInputStream uses
Class.forName() which resolves to the RealmClassLoader, but not to my
MyURLClassLoader instance.
java.lang.ClassNotFoundException: nl.eid.aegon.rpf.parser.model.ClassDescription
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at
org.codehaus.classworlds.RealmClassLoader.loadClassDirect(RealmClassLoader.java:195)
at
org.codehaus.classworlds.DefaultClassRealm.loadClass(DefaultClassRealm.java:255)
at
org.codehaus.classworlds.DefaultClassRealm.loadClass(DefaultClassRealm.java:274)
at
org.codehaus.classworlds.DefaultClassRealm.loadClass(DefaultClassRealm.java:274)
at
org.codehaus.classworlds.RealmClassLoader.loadClass(RealmClassLoader.java:214)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:242)
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:584)
at
java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1543)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1465)
at
java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1698)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1304)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:349)
Here the stacktrace for the NoClassDefFoundError. It starts when I try to log
something in the application using org.apache.common.logging. The only way I
could solve this was to put the log4j package in the Maven lib directory, but
this is not a prefered solution. The log4j.jar is a dependend package and
should be included on the classpath by the classloader.
[INFO] ------------------------------------------------------------------------
[INFO] Trace
java.lang.ExceptionInInitializerError
at nl.eid.replatforming_framework.parser.Parser.parse(Parser.java:45)
at
nl.eid.replatforming_framework.maven.RunAllMojo.runAll(RunAllMojo.java:404)
at
nl.eid.replatforming_framework.maven.RunAllMojo.execute(RunAllMojo.java:139)
at
org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:412)
at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:534)
at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:488)
at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:458)
at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:306)
at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:273)
at
org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:140)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:322)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:115)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:256)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.codehaus.classworlds.Launcher.launchEnhanced(Launcher.java:315)
at org.codehaus.classworlds.Launcher.launch(Launcher.java:255)
at org.codehaus.classworlds.Launcher.mainWithExitCode(Launcher.java:430)
at org.codehaus.classworlds.Launcher.main(Launcher.java:375)
Caused by: org.apache.commons.logging.LogConfigurationException:
org.apache.commons.logging.LogConfigurationException: No suitable Log
constructor [Ljava.lang.Class;@9260ee for
org.apache.commons.logging.impl.Log4JLogger
at
org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:532)
at
org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:272)
at
org.apache.commons.logging.impl.LogFactoryImpl.getInstance(LogFactoryImpl.java:246)
at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:395)
at
nl.eid.replatforming_framework.config.Configuration.<clinit>(Configuration.java:37)
... 21 more
Caused by: org.apache.commons.logging.LogConfigurationException: No suitable
Log constructor [Ljava.lang.Class;@9260ee for
org.apache.commons.logging.impl.Log4JLogger
at
org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:432)
at
org.apache.commons.logging.impl.LogFactoryImpl.newInstance(LogFactoryImpl.java:525)
... 25 more
Caused by: java.lang.NoClassDefFoundError: org/apache/log4j/Logger
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2328)
at java.lang.Class.getConstructor0(Class.java:2640)
at java.lang.Class.getConstructor(Class.java:1629)
at
org.apache.commons.logging.impl.LogFactoryImpl.getLogConstructor(LogFactoryImpl.java:429)
... 26 more
[INFO] ------------------------------------------------------------------------
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.codehaus.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira