【问题标题】:How to deploy a Scala/akka application on Tomcat?如何在 Tomcat 上部署 Scala/akka 应用程序?
【发布时间】:2013-02-13 23:08:58
【问题描述】:

我尝试在 Tomcat 7 上使用 akka 在 Scala 中部署一个简单的应用程序。

在第一个版本中,演员系统和主要演员是直接从 Scala 对象启动的。

在第二个版本中,我创建了一个初始化程序(扩展 ServletContextListener),以便在部署战争时启动参与者系统和参与者。

在这两种情况下,我都会得到一个 java.lang.LinkageError,如下所示:

java.lang.LinkageError: loader constraint violation: when resolving method "akka.actor.Props$.apply(Lscala/reflect/ClassManifest;)Lakka/actor/Props;" the class loader (instance of org/apache/catalina/loader/WebappClassLoader) of the current class, com/my-app/Transfert$, and the class loader (instance of org/apache/catalina/loader/StandardClassLoader) for resolved class, akka/actor/Props$, have different Class objects for the type scala/reflect/ClassManifest used in the signature
  com.my-app.Transfert$.<init>(Transfert.scala:14)
  com.my-app.Transfert$.<clinit>(Transfert.scala)
  com.my-app.Transfert.getState(Transfert.scala)
  org.apache.jsp.transfert_jsp._jspService(transfert_jsp.java:85)
  org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
  javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
  org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:433)
  org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:389)
  org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333)
  javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

我在 Google 上到处搜索,但没有找到一个简单的示例来说明如何在 Tomcat 7 上部署 Scala/akka 应用程序?

我知道 akka 1.3 中有一个 akka.http 包,但我想使用 akka 2.0(至少)。似乎 akka.http 已经消失,取而代之的是使用 play-mini。但我宁愿不使用 play-mini 或 play。

有什么建议吗?有什么阅读建议吗?还是??

【问题讨论】:

    标签: scala tomcat akka


    【解决方案1】:

    我们在 Jetty 8 中运行 Akka actor 2.1 - 应该不会有太大的不同。

    您似乎面临ClassLoader 问题(我假设您使用的是 java 6 并且没有二进制兼容性问题)。

    我可以建议您尝试从您的战争中删除 scala-library.2.10.0.jarakka-actor_2.10-2.1.0.jar 并将它们放入 tomcat 7 lib 文件夹吗?

    【讨论】:

    • 其实他们并不在战争中。 akka-actor-2.0.jar 和 scala-library-2.9.2.jar 在 Tomcat 的 lib 文件夹中。
    • 我应该尝试更新到最新版本的 Scala 和 Akka 吗?但由于这似乎是一个ClassLoader 问题,因此不应该解决它。
    • 可以尝试的事情:升级到 2.10(ClassManifest 已弃用),移动 webapp/lib 中的所有 scala jar 并将它们从 tomcat/lib 中删除(希望所有类将从WebappClassLoader 加载),使用setContextClassLoader 强制Thread.currentThread 上的classLoader 以便从StandardClassLoader 加载。如果您找到解决方案,请告诉我们。
    • 我会尽快升级到 2.10。但是我不明白我应该如何使用Thread.currentThreadsetContextClassLoader。好吧,类似Thread.currentThread.setContextClassLoader( ... ) 但带有什么参数?
    • 目前,我的升级有点受阻,因为配置库似乎不是一个好的库 (stackoverflow.com/questions/14893109/…)。有新东西我会告诉你的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 2017-02-27
    • 2011-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多