[ http://jira.codehaus.org/browse/MNG-2550?page=comments#action_74226 ] Joost den Boer commented on MNG-2550: -------------------------------------
I don't agree the log4j config causes the problem. - If I run the same application as the plugin does from the command line or in Eclipse this problem does not occur. Without a configuration file, Log4j shows a warning or info message that you should add a config file, but it still works. - Secondly, an NoClassDefFoundError is thrown to indicate the log4j Logger class could not be found. If this would be a configuration problem an application exception should be thrown and not a NoClassDefFoundError which is a RuntimeException. > 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