【问题标题】:Building OSGi Module with Scala using Eclipse PDE and Scala IDE使用 Eclipse PDE 和 Scala IDE 使用 Scala 构建 OSGi 模块
【发布时间】:2011-08-18 16:42:41
【问题描述】:

如何构建使用 Scala (2.9.1.RC3) 和 PDE (Eclipse Helios) 的 OSGi 包。我正在使用 Scala IDE (2.0.0-beta) 来构建项目并将其转换为 PDE 项目。 我的 MANIFEST.MF 是这样的:

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

项目构建没有错误,但启动包时出现此异常(使用 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.framework.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

还有代码:

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!");
  }
}

这个过程有什么问题?如何正确映射类Activator?

提前致谢

【问题讨论】:

  • 你的激活器类是否实现了java接口BundleActivator?激活器类引用的所有类型是否都在包中或导入的包中?
  • @bj-hargrave 是的。我也会发布代码。
  • 您的包似乎没有导入 Scala 标准库包。不幸的是,我不知道这些会是什么,但可能至少需要scala 包。看起来您正在使用 scala 集合,因此您需要导入 scala.collection,并且您可能还需要 scala.runtime

标签: eclipse scala osgi pde scala-ide


【解决方案1】:

请参阅 http://www.michel-kraemer.com/scala-projects-with-eclipse-pde-build-2 了解无需在 JAR 中导出 .scala 文件的方法。

【讨论】:

    【解决方案2】:

    我发现了这个愚蠢的问题。何时导出“使用工作区中编译的类文件”字段未标记。有效,但还有另一个问题,即 .scala 文件位于导出的 .jar 文件中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      • 2017-08-09
      • 1970-01-01
      • 2020-05-29
      相关资源
      最近更新 更多