[ http://jira.codehaus.org/browse/MOJO-194?page=comments#action_56796 ] 

Nigel Magnay commented on MOJO-194:
-----------------------------------

My investigation (& hack-attack workaround) :

cobertura pom declares asm-2.1 as a dependency

in the mojo, when instrumentation has finished, it programatically adds 
cobertura-1.7 as a test dependency. This automatically adds asm-2.1 as a 
test-time dependency. So when it runs we have 2.1 and 1.5.3 = game over.

Hack solution:
Strip asm dependency from cobertura pom by hand
Add the following to InstrumentTask.java: (various import statements needed)

public String createClasspath()
        throws MojoExecutionException
    {

        StringBuffer cpBuffer = new StringBuffer();

        for ( Iterator it = getPluginClasspathList().iterator(); it.hasNext(); )
        {
            Artifact artifact = (Artifact) it.next();
                        System.out.println(artifact.getArtifactId());
            try
            {
                cpBuffer.append( File.pathSeparator ).append( 
artifact.getFile().getCanonicalPath() );
            }
            catch ( IOException e )
            {
                throw new MojoExecutionException( "Error while creating the 
canonical path for '" + artifact.getFile()
                    + "'.", e );
            }
        }
                 // Hackity hack
                cpBuffer.append( File.pathSeparator ).append( "C:\\Documents 
and Settings\\nigel.magnay\\.m2\\repository\\asm\\asm\\2.1\\asm-2.1.jar" );
        return cpBuffer.toString();
    }

Potential Better solution:
in CoberturaInstrumentMojo.java, there is 
addCoberturaDependenciesToTestClasspath() which does the adding.
I don't know if it is possible at this point to explicitly remove the asm- jar 
from resolution. I suspect it might not be - problem is, asm-* IS a runtime 
dependency for instrumentation, but not for testing... I don't know enough 
about the transitive dependency mechanism to know how easy this is to fix....





> Classloader problem when using cobertura instrumented classes in unit tests 
> that use Hibernate 3.1
> --------------------------------------------------------------------------------------------------
>
>          Key: MOJO-194
>          URL: http://jira.codehaus.org/browse/MOJO-194
>      Project: Mojo
>         Type: Bug

>   Components: sandbox
>  Environment: Windows XP Prof, SP2
>     Reporter: Ralf Quebbemann

>
>
> Classloader problem when using cobertura instrumented classes when running 
> unit tests using Hibernate 3.1.
> Hibernate specifies asm-1.5.3 in its pom which requires the file but 
> cobertura specifies asm-2.1 in its pom. 
> The problem seems to be that Hibernate cannot load asm-1.5.3 because 
> cobertura has already loaded the latest version, which is incompatible. 
> The problem is described on the Cobertura FAQ page and they recommend:
> "Cobertura does not need ASM in your classpath when running tests. If you're 
> seeing classpath conflicts, just make sure the asm jar that comes with 
> Cobertura is used only by Cobertura, and only when instrumenting." 
> Here is the stacktrace:
> ERROR [hibernate.proxy.BasicLazyInitializer.getProxyFactory()] CGLIB
> Enhancement failed: com.gargantus.tradingcode.domain.Market
> java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor
>         at
> net.sf.cglib.core.KeyFactory$Generator.generateClass(KeyFactory.java:165)
>         at
> net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
>         at
> net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
>         at
> net.sf.cglib.core.KeyFactory$Generator.create(KeyFactory.java:145)
>         at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:117)
>         at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:108)
>         at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:104)
>         at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69)
>         at
> org.hibernate.proxy.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.java:116)
>         at
> org.hibernate.proxy.CGLIBProxyFactory.postInstantiate(CGLIBProxyFactory.java:41)
>         at
> org.hibernate.tuple.PojoEntityTuplizer.buildProxyFactory(PojoEntityTuplizer.java:161)
>         at
> org.hibernate.tuple.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:131)
>         at
> org.hibernate.tuple.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:55)
>         at
> org.hibernate.tuple.TuplizerLookup.create(TuplizerLookup.java:64)
>         at
> org.hibernate.tuple.EntityMetamodel.<init>(EntityMetamodel.java:257)
>         at
> org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:412)
>         at
> org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:108)
>         at
> org.hibernate.persister.PersisterFactory.createClassPersister(PersisterFactory.java:55)
>         at
> org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:215)
>         at
> org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1154)
>         at
> com.gargantus.tradingcode.HibernateUtil.<init>(HibernateUtil.java:74)
>         at
> sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
>         at
> sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
>         at
> sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
>         at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
>         at
> org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:172)
>         at
> org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:75)
>         at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:670)
>         at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:329)
>         at
> org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:226)
>         at
> org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:147)
>         at
> org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:176)
>         at
> org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:105)
>         at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveConstructorArguments(AbstractAutowireCapableBeanFactory.java:706)
>         at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:611)
>         at
> org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:329)
>         at
> org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:226)
>         at
> org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:147)
>         at
> org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:275)
>         at
> org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:320)
>         at
> org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:87)
>         at
> org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:72)
>         at
> com.gargantus.tradingcode.SpringComponentFactoryAdaptor.setContext(SpringComponentFactoryAdaptor.java:55)
>         at
> com.gargantus.tradingcode.SpringComponentFactoryAdaptor.<init>(SpringComponentFactoryAdaptor.java:32)
>         at
> com.gargantus.tradingcode.ComponentFactory.reinitialise(ComponentFactory.java:156)
>         at
> com.gargantus.tradingcode.ComponentFactory.initFromCSV(ComponentFactory.java:121)
>         at
> com.gargantus.tradingcode.ComponentFactory.reinitialise(ComponentFactory.java:105)
>         at
> com.gargantus.tradingcode.ComponentFactory.initialise(ComponentFactory.java:84)
>         at
> com.gargantus.testing.util.DbUnitTransactionAwareTestCase.setUp(DbUnitTransactionAwareTestCase.java:125)
>         at junit.framework.TestCase.runBare(TestCase.java:125)
>         at junit.framework.TestResult$1.protect(TestResult.java:106)
>         at junit.framework.TestResult.runProtected(TestResult.java:124)
>         at junit.framework.TestResult.run(TestResult.java:109)
>         at junit.framework.TestCase.run(TestCase.java:118)
>         at junit.framework.TestSuite.runTest(TestSuite.java:208)
>         at junit.framework.TestSuite.run(TestSuite.java:203)
>         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.surefire.battery.JUnitBattery.executeJUnit(JUnitBattery.java:246)
>         at
> org.codehaus.surefire.battery.JUnitBattery.execute(JUnitBattery.java:220)
>         at org.codehaus.surefire.Surefire.executeBattery(Surefire.java:204)
>         at org.codehaus.surefire.Surefire.run(Surefire.java:153)
>         at org.codehaus.surefire.Surefire.run(Surefire.java:77)
>         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.surefire.SurefireBooter.run(SurefireBooter.java:104)
>         at
> org.apache.maven.test.SurefirePlugin.execute(SurefirePlugin.java:303)
>         at
> org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:432)
>         at
> org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:530)
>         at
> org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:472)
>         at
> org.apache.maven.lifecycle.DefaultLifecycleExecutor.forkProjectLifecycle(DefaultLifecycleExecutor.java:858)
>         at
> org.apache.maven.lifecycle.DefaultLifecycleExecutor.forkLifecycle(DefaultLifecycleExecutor.java:729)
>         at
> org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:501)
>         at
> org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeStandaloneGoal(DefaultLifecycleExecutor.java:485)
>         at
> org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:455)
>         at
> org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:303)
>         at
> org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:270)
>         at
> org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:139)
>         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:249) 

-- 
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