Somehow, I copied the wrong stack trace. The line manplan/merlin/component/impl/persistence/DefaultDAOFactoryBuilder
should be changed to manplan/merlin/component/impl/DefaultComponentManager. The stacktrace below is from my first attempt to get a deployment running in my embedded kernel and then testcase. Suffered from the same problem. After a few hours I decided to start from scratch and write another component. That's the ComponentManager. Cheers, Olaf > -----Original Message----- > From: Olaf Bergner [mailto:[EMAIL PROTECTED] > Sent: Tuesday, December 23, 2003 3:13 AM > To: Avalon framework users > Subject: [Merlin] TestCase derived from AbstractMerlinTestCase fails > unexpectedly > > > I have - yet again - a minimal deployment scenario (1 service interface, 1 > implementing component) I am struggling with. If I do a > > merlin -execute conf/component-manager.block > > (see below for more info) I get > > [INFO ] (kernel): installing: > file:/${user.dir}/conf/component-manager.block > [INFO ] (components.component-manager): Executing > [INFO ] (components.component-manager): Finished executing ... > [INFO ] (kernel): dissassembly phase > [INFO ] (kernel): disposal phase > > i.e. all goes smoothly. If, however, I deploy the block using a custom > testcase derived from AbstractMerlinTestCase with only > > final public void testAcquisition() throws Exception > { > final DAOFactoryBuilder builder = > (DAOFactoryBuilder) resolve(RES_PATH); > > assertNotNull( > "resolve(\"" + RES_PATH + "\") returned <null>.", > builder); > } > > added, I get an exception complaining that the xinfo file for the > component > to be deployed could not be found - that is TypeBuilder fails to > locate the > corresponding .xinfo file within deployment jar. Needless to say > that it is > definitely there, as merlin cli well notices. I took great care to ensure > that melin cli as well as my testcase do deploy the exact same block > containing the exact same info. The merlin.deployment entry in > merlin.properties points to > file:/${user.dir}/conf/component-manager.block, > the block merlin cli swallows without further ado. I manually copied the > generated jars to merlin cli's repository, opened them and verified that > they are exactly the same as those used by my testcase. > > According to the source in TypeBuilder.buildFromXMLDescriptor() > the problem > might be tracked back to classLoader.getResourceAsStream(classname.xinfo) > failing to load the existing xinfo file. But why should this happen? > classLoader is the classloader that loaded the class itself, it > should also > load the .xinfo file in the same package. Or is it a classloader issue? > > I wrote an embedded kernel that closely taking AbstractMerlinTestCase as a > blueprint, and it shows the exact same behaviour. Naturally, I > would be glad > if anybody could explain to me what's going on here and how I might fix my > kernel. > > Cheers, > > Olaf > > P.S.: One minor issue: the line > > final String message = > REZ.getString( "builder.missing-info.error", path ); > > in TypeBuilder.buildFromXMLDescriptor() should probably be changed to > > final String message = > REZ.getString( "builder.missing-info.error", classname ); > > Otherwise, as you will see below, the exception message is a little > misleading. > > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++ > ++++++++ > > Debug + Stacktrace: > > [DEBUG ] (components.classloader.scanner): scanning: > file:/C:/Dokumente und > Einstellungen/Otto > Berg/.maven/repository/manplan-merlin/jars/model-api-0.1.jar > [DEBUG ] (components.classloader.scanner): scanning: > file:/C:/Dokumente und > Einstellungen/Otto > Berg/.maven/repository/manplan-merlin/jars/model-spi-0.1.jar > [DEBUG ] (components.classloader.scanner): scanning: > file:/C:/Dokumente und > Einstellungen/Otto > Berg/.maven/repository/manplan-merlin/jars/model-impl-0.1.jar > [DEBUG ] (components.classloader.scanner): scanning: > file:/C:/Dokumente und > Einstellungen/Otto > Berg/.maven/repository/manplan-merlin/jars/persistence-api-0.1.jar > [DEBUG ] (components.classloader.scanner): scanning: > file:/C:/Dokumente und > Einstellungen/Otto > Berg/.maven/repository/manplan-merlin/jars/persistence-impl-0.1.jar > [DEBUG ] (components.classloader.scanner): scanning: > file:/C:/Dokumente und > Einstellungen/Otto > Berg/.maven/repository/manplan-merlin/jars/component-api-0.1.jar > [DEBUG ] (components.classloader.scanner): scanning: > file:/C:/Dokumente und > Einstellungen/Otto > Berg/.maven/repository/manplan-merlin/jars/component-impl-0.1.jar > ---- exception > report ---------------------------------------------------------- > Exception: org.apache.avalon.merlin.KernelException > Message: Install failure: > file:/C:/Projekte/OBergner/EclipseWorkspace/manplan-merlin/compone > nt/impl/co > nf/component-manager.block > ---- > cause > --------------------------------------------------------------------- > Exception: org.apache.avalon.composition.model.ModelException > Message: Could not create classloader. > ---- > cause > --------------------------------------------------------------------- > Exception: org.apache.avalon.composition.model.ModelException > Message: Unexpected error while scanning jar file: file:/C:/Dokumente und > Einstellungen/Otto > Berg/.maven/repository/manplan-merlin/jars/component-impl-0.1.jar > ---- > cause > --------------------------------------------------------------------- > Exception: java.lang.Exception > Message: Unable to locate resource from which to load info for component > implemented by class > "manplan/merlin/component/impl/persistence/DefaultDAOFactoryBuilde > r.xinfo". > ---- stack > trace --------------------------------------------------------------- > java.lang.Exception: Unable to locate resource from which to load info for > component implemented by class > "manplan/merlin/component/impl/persistence/DefaultDAOFactoryBuilde > r.xinfo". > org.apache.avalon.meta.info.builder.TypeBuilder.buildFromXMLDescri > ptor(TypeB > uilder.java:186) > org.apache.avalon.meta.info.builder.TypeBuilder.buildType(TypeBuil > der.java:1 > 04) > org.apache.avalon.composition.model.impl.Scanner.addType(Scanner.java:377) > org.apache.avalon.composition.model.impl.Scanner.scanJarFile(Scann > er.java:25 > 8) > org.apache.avalon.composition.model.impl.Scanner.scanJarFileURL(Sc > anner.java > :239) > org.apache.avalon.composition.model.impl.Scanner.scanURL(Scanner.java:197) > org.apache.avalon.composition.model.impl.Scanner.scan(Scanner.java:170) > org.apache.avalon.composition.model.impl.DefaultClassLoaderModel.< > init>(Defa > ultClassLoaderModel.java:235) > org.apache.avalon.composition.model.impl.DefaultClassLoaderModel.c > reateClass > LoaderModel(DefaultClassLoaderModel.java:129) > org.apache.avalon.composition.model.impl.DefaultContainmentModel.c > reateConta > inmentModel(DefaultContainmentModel.java:464) > org.apache.avalon.composition.model.impl.DefaultContainmentModel.c > reateConta > inmentModel(DefaultContainmentModel.java:427) > org.apache.avalon.composition.model.impl.DefaultContainmentModel.c > reateConta > inmentModel(DefaultContainmentModel.java:663) > org.apache.avalon.composition.model.impl.DefaultContainmentModel.a > ddContainm > entModel(DefaultContainmentModel.java:288) > org.apache.avalon.composition.model.impl.DefaultContainmentModel.a > ddModel(De > faultContainmentModel.java:282) > org.apache.avalon.merlin.impl.DefaultFactory.create(DefaultFactory > .java:488) > org.apache.avalon.merlin.unit.AbstractMerlinTestCase.setUp(Abstrac > tMerlinTes > tCase.java:198) > junit.framework.TestCase.runBare(TestCase.java:125) > junit.framework.TestResult$1.protect(TestResult.java:106) > junit.framework.TestResult.runProtected(TestResult.java:124) > junit.framework.TestResult.run(TestResult.java:109) > junit.framework.TestCase.run(TestCase.java:118) > junit.framework.TestSuite.runTest(TestSuite.java:208) > junit.framework.TestSuite.run(TestSuite.java:203) > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(Re > moteTestRu > nner.java:392) > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteT > estRunner. > java:276) > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(Remote > TestRunner > .java:167) > ------------------------------------------------------------------ > ---------- > ---- > > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++ > ++++ > > component-manager.block: > > <container name="components"> > > <services> > <service type="manplan.merlin.component.api.ComponentManager"> > <source>component-manager</source> > </service> > </services> > > <classloader> > <classpath> > <repository> > <resource id="manplan-merlin:model-api" version="0.1"/> > <resource id="manplan-merlin:model-spi" version="0.1"/> > <resource id="manplan-merlin:model-impl" version="0.1"/> > <resource id="manplan-merlin:persistence-api" version="0.1"/> > <resource id="manplan-merlin:persistence-impl" version="0.1"/> > <resource id="manplan-merlin:component-api" version="0.1"/> > <resource id="manplan-merlin:component-impl" version="0.1"/> > <resource id="log4j:log4j" version="1.2.8"/> > <resource id="hibernate:hibernate" version="2.1.1"/> > <resource id="commons-collections:commons-collections" > version="3.0-dev2"/> > <resource id="dom4j:dom4j" version="1.4"/> > </repository> > </classpath> > </classloader> > > <component name="component-manager" > class="manplan.merlin.component.impl.DefaultComponentManager" > activation="startup"> > </component> > > </container> > > ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > ++++++++++ > ++++++++ > > manplan/merlin/component/impl/DefaultComponentManager.xinfo (for what it's > worth): > > <?xml version="1.0" encoding="ISO-8859-1"?> > <!DOCTYPE type PUBLIC "-//AVALON/Type DTD Version 1.0//EN" > "http://avalon.apache.org/dtds/meta/type_1_1.dtd" > > > <type> > <info> > <name>component-manager</name> > <version>0.1.0</version> > <lifestyle>singleton</lifestyle> > </info> > <services> > <service type="manplan.merlin.component.api.ComponentManager"/> > </services> > </type> > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
