You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@maven.apache.org by "Brett Porter (JIRA)" <ji...@codehaus.org> on 2008/12/18 13:12:20 UTC

[jira] Closed: (MNG-2550) ClassNotFoundException and NoClassDefFoundError when running plugin

     [ http://jira.codehaus.org/browse/MNG-2550?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Brett Porter closed MNG-2550.
-----------------------------

         Assignee: Brett Porter
       Resolution: Not A Bug
    Fix Version/s:     (was: Reviewed Pending Version Assignment)

from what I can tell, this was a commons issue, not a Maven issue

> 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
>            Assignee: Brett Porter
>
> 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