akka - http 2.4.9抛出java.lang.NoClassDefFoundError: akka/acto



我试图建立一个简单的web服务与Akka-http。我按照这个指南:http://doc.akka.io/docs/akka/2.4.9/scala/http/low-level-server-side-api.html和一切工作正常,当我运行sbt运行。

当我执行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"
)

和Main对象:

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.addFunctionRef和https://github.com/sbt/sbt-assembly/issues/204但删除Akka-Actor在我的scala lib文件夹没有帮助。我还尝试在akka-http的相同版本中添加akka-actor作为依赖。

Sbt正在使用java原生应用程序打包来打包scala项目。因此,您不必使用任何程序集或创建一个胖罐。您可以尝试这样做:

项目根目录:

sbt universal:packageBin
运行:

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

添加到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
  • 检查程序是否编译
  • Then sbt assembly

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

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

相关内容

最新更新