开发者

Building OSGi Module with Scala using Eclipse PDE and Scala IDE

How to build an OSGi bundle that use Scala (2.9.1.RC3) with PDE (Eclipse Helios). I'm using Scala IDE (2.0.0-beta) to build the project and converting this to PDE project. My MANIFEST.MF is like that:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: ScalaTest1
Bundle-SymbolicName: ScalaTest1
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: scalatest1.Activator
Import-Package: org.osgi.framework;version="1.3.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6

The project build without errors, but when start the bundle this exception appears (using Apache Felix 3.2.2):

org.osgi.framework.BundleException: Not found: scalatest1.Activator
        at org.apache.felix.framework.Felix.createBundleActivator(Felix.java:3812)
        at org.apache.felix.framework.Felix.activateBundle(Felix.java:1899)
        at org.apache.felix.framework.Felix.startBundle(Felix.java:1822)
        at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:927)
        at org.apache.felix.gogo.command.Basic.start(Basic.java:758)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.apache.felix.gogo.runtime.Reflective.method(Reflective.java:136)
        at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:82)
        at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:469)
        at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:395)
        at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
        at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:183)
        at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:120)
        at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:89)
        at org.apache.felix.gogo.shell.Console.run(Console.java:62)
        at org.apache.felix.gogo.shell.Shell.console(Shell.java:203)
        at org.apache.felix.gogo.shell.Shell.gosh(Shell.java:128)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.apache.felix.gogo.runtime.Reflective.method(Reflective.java:136)
        at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:82)
        at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:469)
        at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:395)
        at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
        at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:183)
        at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:120)
        at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:89)
        at org.apache.felix.gogo.shell.Activator.run(Activator.java:75)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: scalatest1.Activator not found by ScalaTest1 [27]
        at org.apache.felix.framework.ModuleImpl.findClassOrResourceByDelegation(ModuleImpl.java:812)
        at org.apache.felix.framewo开发者_如何学Gork.ModuleImpl.access$400(ModuleImpl.java:72)
        at org.apache.felix.framework.ModuleImpl$ModuleClassLoader.loadClass(ModuleImpl.java:1807)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at org.apache.felix.framework.ModuleImpl.getClassByDelegation(ModuleImpl.java:670)
        at org.apache.felix.framework.Felix.createBundleActivator(Felix.java:3808)
        ... 33 more

And the code:

package scalatest1

import org.osgi.framework._

class Activator extends BundleActivator {
  def start(context: BundleContext) {
    println("Hello, World!");

    val bundleNames = context.getBundles()
      .map(b => b.getSymbolicName())
      .filter(b => b != context.getBundle());
    println("Installed bundles: " + bundleNames.mkString(", "));
  }

  def stop(context: BundleContext) {
    println("Goodbye, World!");
  }
}

What is wrong with the process? How to map correctly the class Activator?

Thanks in advance


See http://www.michel-kraemer.com/scala-projects-with-eclipse-pde-build-2 for a way to do this without exporting .scala files in JAR.


I found the silly problem. When was exporting the field "Use class files compiled in the workspace" was unmarked. Works, but there is another problem, that the .scala files are in the .jar file exported.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜