【问题标题】:Akka-Http 2.4.9 throws java.lang.NoClassDefFoundError: akka/actor/ActorRefFactory exceptionAkka-Http 2.4.9 抛出 java.lang.NoClassDefFoundError: akka/actor/ActorRefFactory 异常
【发布时间】:2017-01-11 14:35:36
【问题描述】:

我正在尝试使用 Akka-http 构建一个简单的 Web 服务。我遵循了这个指南:http://doc.akka.io/docs/akka/2.4.9/scala/http/low-level-server-side-api.html,当我运行 sbt run 时,一切正常。

当我执行 java -jar PROJECT.jar 它返回:

Exception in thread "main" java.lang.NoClassDefFoundError: akka/actor/ActorRefFactory
    at WebServer.main(WebServer.scala)
Caused by: java.lang.ClassNotFoundException: akka.actor.ActorRefFactory
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 1 more

我的 build.sbt:

name := "APPNAME"

version := "0.0.1"

scalaVersion := "2.11.8"

artifactName := { (sv: ScalaVersion, module: ModuleID, artifact: Artifact) =>
    artifact.name + "-" + module.revision + "." + artifact.extension
}

libraryDependencies ++= Seq(
    "com.typesafe.akka" %% "akka-http-core" % "2.4.9"
)

还有我的主要对象:

import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.model.HttpMethods._
import akka.http.scaladsl.model._
import akka.stream.ActorMaterializer
import scala.io.StdIn

object WebServer {
    def main(args: Array[String]) {

        implicit val system = ActorSystem("APPNAME")
        implicit val materializer = ActorMaterializer()
        implicit val executionContext = system.dispatcher

        val requestHandler: HttpRequest => HttpResponse = {

            case HttpRequest(GET, Uri.Path("/"), _, _, _) => {

                HttpResponse(entity = HttpEntity(
                    ContentTypes.`text/html(UTF-8)`,
                    "<html><body>Hello world!</body></html>")
                )

            }

            case HttpRequest(GET, Uri.Path("/crash"), _, _, _) => {
                sys.error("BOOM!")
            }

            case r: HttpRequest => {
                r.discardEntityBytes() // important to drain incoming HTTP Entity stream
                HttpResponse(404, entity = "Unknown resource!")
            }

        }

        val bindingFuture = Http().bindAndHandleSync(requestHandler, "localhost", 8080)
        println(s"Server online at http://localhost:8080/\nPress RETURN to stop...")
        StdIn.readLine() // let it run until user presses return
        bindingFuture
            .flatMap(_.unbind()) // trigger unbinding from the port
            .onComplete(_ => system.terminate()) // and shutdown when done

    }
}

我已经找到了java.lang.NoSuchMethodError: akka.actor.ActorCell.addFunctionRefhttps://github.com/sbt/sbt-assembly/issues/204,但是在我的 scala lib 文件夹中删除 Akka-Actor 并没有帮助。我还尝试在与 akka-http 相同的版本中添加 akka-actor 作为依赖项。

【问题讨论】:

  • 您是否尝试过使用程序集插件然后运行sbt assembly?这将生成一个 jar 文件,其中包含可以使用 java -jar PROJECT.jar 运行的所有需要​​的依赖项

标签: scala sbt akka-http


【解决方案1】:

Sbt 正在使用 java 原生应用打包来打包 scala 项目。所以你不必使用 sbt 程序集或创建一个 fat jar。 您可以尝试以下方法:

在项目根目录中:

sbt universal:packageBin

运行:

 ./target/universal/stage/bin/[project name]

【讨论】:

    【解决方案2】:

    添加到project/plugins.sbt:

    resolvers += Resolver.url("bintray-sbt-plugins", url("https://dl.bintray.com/eed3si9n/sbt-plugins/"))(Resolver.ivyStylePatterns)
    
    addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.5")
    
    • 输入sbt compile检查你的程序是否编译
    • 然后sbt assembly

    最后通过键入scala target/scala-2.12/YOUR_FILE.assembly-0.1.jar 运行您的.jar 文件,其中scala-2.12 是您的scala 版本。

    【讨论】:

      【解决方案3】:

      我在play 版本2.8.8play-sbt-plugin 2.8.2 上遇到了这个异常。当我将play-sbt-plugin 更新为2.8.8 时,异常消失了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 2020-05-31
        • 2011-09-04
        • 1970-01-01
        • 2019-12-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多