[ http://jira.codehaus.org/browse/MNG-2550?page=comments#action_74458 ] 
            
Joost den Boer commented on MNG-2550:
-------------------------------------

ok, I overcame my doubts and tried it. And you're right, it works.
However, this only solves half of the problem. There still is the problem that 
when deserializing an object, the class cannot be found.
Any ideas how to solve this ?
Only this I can think of is that Maven must place the  dependend packages on 
the classpath.

> 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

        

Reply via email to