Akka-Http 2.4.9引发java.lang.NoClassDefFoundError:akka / actor / ActorRefFactory异常 [英] Akka-Http 2.4.9 throws java.lang.NoClassDefFoundError: akka/actor/ActorRefFactory exception

查看:335
本文介绍了Akka-Http 2.4.9引发java.lang.NoClassDefFoundError:akka / actor / ActorRefFactory异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

 线程主中的异常java.lang.NoClassDefFoundError:Web服务器.main(WebServer.scala)上的akka​​ / actor / ActorRefFactory 

原因:java.lang.ClassNotFoundException:akka.actor.ActorRefFactory
在java.net.URLClassLoader.findClass(URLClassLoader.java:381)
在java.lang.ClassLoader.loadClass(ClassLoader.java:424)
在sun.misc.Launcher $ AppClassLoader.loadClass (Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
...还有1个

我的build.sbt:

  name:= APPNAME 

版本:= 0.0.1

标度aVersion:= 2.11.8

artifactName:= {(SV:ScalaVersion,模块:ModuleID,工件:Artifact)=>
artifact.name +- + module.revision +。 + artifact.extension
}

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

我的主要对象:

 导入akka.actor.ActorSystem 
导入akka.http.scaladsl.Http
导入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]){

隐式val系统= ActorSystem( APPNAME)
隐式val实现器= ActorMaterializer()
隐式val executeContext = 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()//重要的是要耗尽传入的HTTP实体流
HttpResponse(404,entity =未知资源!)
}

}

val bindingFuture = Http()。bindAndHandleSync(requestHandler, localhost,8080)
println(s服务器在线,位于http:// localhost:8080 / \n按RETURN停止。 ..)
StdIn.readLine()//让它运行直到用户按下返回键
bindingFuture
.flatMap(_。unbind())//触发从端口$ b $解除绑定b .onComplete(_ => system.terminate())//并在完成后关闭

}
}

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

解决方案

Sbt使用Java本机应用程序打包用于打包scala项目。因此,您不必使用sbt程序集或创建胖子。
您可以尝试以下方法:



在项目根目录中:

  sbt Universal:packageBin 

运行:

  ./target/universal/stage/bin/ [项目名称] 


I am trying to build a simple web service with Akka-http. I followed this guide: http://doc.akka.io/docs/akka/2.4.9/scala/http/low-level-server-side-api.html and everything works fine, when I run sbt run.

When I execute java -jar PROJECT.jar it returns:

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

My 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"
)

And my Main object:

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

    }
}

I already found java.lang.NoSuchMethodError: akka.actor.ActorCell.addFunctionRef and https://github.com/sbt/sbt-assembly/issues/204 but deleting the Akka-Actor in my scala lib folder hasn't helped. I also tried Adding akka-actor as dependency in the same version as akka-http.

解决方案

Sbt is using java native app packging for packing scala projects. So you don't have to use sbt assembly or create a fat jar. You can try something along these lines:

In project root:

sbt universal:packageBin

run:

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

这篇关于Akka-Http 2.4.9引发java.lang.NoClassDefFoundError:akka / actor / ActorRefFactory异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆