[ 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