Hi Reto! Mmhh.. interesting. Though did not follow your step myself did you look into the bundle that has been generated ? I mean, you can dump it (its an inputstream) to a file and have a look ? Guess its the only way to see whats really happening. Also look if a bundle looks clean (technically) when not adding anything. Or at least nothing you declared just at runtime. Speaking of that i might see the problem. Tinybundles takes a Class type in "addClass" but just for API brevity. It really resolves the fully qualified name and tried to find it on disk. The funny full qualified class name (ine6$object$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$HelloWorld.class) speaks for itself - but its not about aesthetics probably ;)
Can you load the (generated) bundle in your IDE (and use the aforementioned class) ? Toni On Fri, Jan 21, 2011 at 3:14 PM, Reto Bachmann-Gmuer < [email protected]> wrote: > Goal: create and install a bundle at runtime from the clerzza-console > > Starting point: Clerezza tdb launcher with additional TinyBundle and its > dependencies installed > > Welcome to the Apache Clerezza Console > Console is based on Scala version 2.8.1.final (OpenJDK 64-Bit Server VM, > Java 1.6.0_20). > Type in expressions to have them evaluated. > Hint: To execute a Felix-Shell command prepend ":f " > Type :help for more information. > zz>import org.ops4j.pax.swissbox.tinybundles.core.TinyBundles._ > import org.ops4j.pax.swissbox.tinybundles.core.TinyBundles._ > zz>val nb = newBundle() > nb: org.ops4j.pax.swissbox.tinybundles.core.TinyBundle = > org.ops4j.pax.swissbox.tinybundles.core.intern.TinyBundleImpl@61e14b67 > zz>class HelloWorld { def hello = println("hello") } > defined class HelloWorld > zz>nb.add(classOf[HelloWorld]) > res0: org.ops4j.pax.swissbox.tinybundles.core.TinyBundle = > org.ops4j.pax.swissbox.tinybundles.core.intern.TinyBundleImpl@61e14b67 > zz>nb.set("Some-Key", "some value") > res1: org.ops4j.pax.swissbox.tinybundles.core.TinyBundle = > org.ops4j.pax.swissbox.tinybundles.core.intern.TinyBundleImpl@61e14b67 > zz>import java.io._ > import java.io._ > zz>nb.add("test-file", new ByteArrayInputStream("some > test-data".getBytes("utf-8"))) > res2: org.ops4j.pax.swissbox.tinybundles.core.TinyBundle = > org.ops4j.pax.swissbox.tinybundles.core.intern.TinyBundleImpl@61e14b67 > zz>val in = nb.build(withBnd()) > in: java.io.InputStream = java.io.PipedInputStream@5906edd5 > zz>val myBundle = bundleContext.installBundle("myBundle", in) > myBundle: org.osgi.framework.Bundle = > BuildByTinyBundlestinybundles7983922728161488712UID [139] > zz>val entries = myBundle.findEntries("/", null, true) > entries: java.util.Enumeration[_] = > org.apache.felix.framework.EntryFilterEnumeration@3aa0d67c > zz>while (entries.hasMoreElements) { out println("Entry: > "+entries.nextElement) } > Entry: bundle://139.0:0/META-INF/ > Entry: bundle://139.0:0/META-INF/MANIFEST.MF > Entry: > bundle://139.0:0/line6$object$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$HelloWorld.class > zz>headers(myBundle) > Bnd-LastModified = 1295608733169 > Built-By = reto > Bundle-ManifestVersion = 2 > Bundle-Name = BuildByTinyBundlestinybundles7983922728161488712UID > Bundle-SymbolicName = BuildByTinyBundlestinybundles7983922728161488712UID > Bundle-Version = 0 > Created-By = 1.6.0_20 (Sun Microsystems Inc.) > Generated-By-Ops4j-Pax-From = > BuildByTinyBundlestinybundles7983922728161488712UID > Manifest-Version = 1.0 > Originally-Created-By = pax-swissbox-tinybundles-1.3.0 > Private-Package = . > Some-Key = some value > SwissboxTinybundlesVersion = pax-swissbox-tinybundles-1.3.0 > Tool = Bnd-0.0.313 > zz>myBundle.loadClass("line6$object$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$HelloWorld") > > java.lang.ClassFormatError: Truncated class file > at java.lang.ClassLoader.defineClass1(Native Method) > at java.lang.ClassLoader.defineClass(ClassLoader.java:634) > at > org.apache.felix.framework.ModuleImpl$ModuleClassLoader.findClass(ModuleImpl.java:1874) > at > org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:720) > at org.apache.felix.framework.ModuleImpl.access$300(ModuleImpl.java:73) > at > org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1735) > at java.lang.ClassLoader.loadClass(ClassLoader.java:266) > at > org.apache.felix.framework.ModuleImpl.getClassByDelegation(ModuleImpl.java:638) > at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1599) > at > org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:90...zz> > zz> > > > Well not the surprising that this class created in the shell creates > problems. A bit surpring that the resource "test-file" isn't in the list. > > Let's try compiling a class using the compiler service > zz>import org.apache.clerezza.scala.scripting.CompilerService > import org.apache.clerezza.scala.scripting.CompilerService > zz>val cs = $[CompilerService] > cs: org.apache.clerezza.scala.scripting.CompilerService = > org.apache.clerezza.scala.scripting.CompilerService@54075697 > zz>val source = """ package foo > | class Hello() { > | def say() { println("hello")} > | } > | """ > zz>val chars = source.toCharArray > chars: Array[Char] = > Array( , p, a, c, k, a, g, e, , f, o, o, > , c, l, a, s, s, , H, e, l, l, o, (, ), , {, > , d, e, f, , s, a, y, (, ), , {, , p, r, i, n, t, l, n, (, ", h, e, l, > l, o, ", ), , }, > , }, > ) > zz>val classes = cs.compile(List(chars)) > classes: List[Class[_]] = List(class foo.Hello) > zz>val tinyFoo = newBundle() > tinyFoo: org.ops4j.pax.swissbox.tinybundles.core.TinyBundle = > org.ops4j.pax.swissbox.tinybundles.core.intern.TinyBundleImpl@6ca68dbd > zz>val fooStream = tinyFoo.build(withBnd()) > fooStream: java.io.InputStream = java.io.PipedInputStream@fd855ae > zz>val fooBundle = bundleContext.installBundle("fooBundle", > fooStream) > fooBundle: org.osgi.framework.Bundle = > BuildByTinyBundlestinybundles3268593457443402016UID [145] > zz>headers(fooBundle) > Bnd-LastModified = 1295618427023 > Built-By = reto > Bundle-ManifestVersion = 2 > Bundle-Name = BuildByTinyBundlestinybundles3268593457443402016UID > Bundle-SymbolicName = BuildByTinyBundlestinybundles3268593457443402016UID > Bundle-Version = 0 > Created-By = 1.6.0_20 (Sun Microsystems Inc.) > Export-Package = foo > Generated-By-Ops4j-Pax-From = > BuildByTinyBundlestinybundles3268593457443402016UID > Import-Package = foo;resolution:=optional > Manifest-Version = 1.0 > Originally-Created-By = pax-swissbox-tinybundles-1.3.0 > SwissboxTinybundlesVersion = pax-swissbox-tinybundles-1.3.0 > Tool = Bnd-0.0.313 > > looking good so far, no reconnecting to the shell (ssh -p 8022 > admin@localhost) to have the new bundle in the classpath > > reto@trisa-laptop:~$ ssh -p 8022 admin@localhost > admin@localhost's password: > Welcome to the Apache Clerezza Console > Console is based on Scala version 2.8.1.final (OpenJDK 64-Bit Server VM, > Java 1.6.0_20). > Type in expressions to have them evaluated. > Hint: To execute a Felix-Shell command prepend ":f " > Type :help for more information. > zz>import foo.Hello > import foo.Hello > zz>val h = new Hello() > error: error while loading Hello, class file 'foo/Hello.class' is broken > (0) > <console>:13: error: foo.Hello does not have a constructor > val h = new Hello() > ^ > zz> > > > Well if you read till here, you might have a suggestion on what to try > next... > > Cheers, > Reto > > > > _______________________________________________ > general mailing list > [email protected] > http://lists.ops4j.org/mailman/listinfo/general > > -- *Toni Menzel - http://www.okidokiteam.com*
_______________________________________________ general mailing list [email protected] http://lists.ops4j.org/mailman/listinfo/general
