2016-09-03 149 views
4

我想用Akka-http构建一个简单的Web服务。我遵循这个指南:http://doc.akka.io/docs/akka/2.4.9/scala/http/low-level-server-side-api.html和一切工作正常,当我运行sbt运行。Akka-Http 2.4.9抛出java.lang.NoClassDefFoundError:akka/actor/ActorRefFactory异常

当我执行Java的罐子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作为依赖项。

+2

你试过用汇编插件,然后运行'SBT assembly'?这将生成一个jar文件,其中包含所有需要的依赖项,可以使用'java -jar PROJECT.jar'运行 –

回答

1

Sbt使用java原生应用程序打包来打包scala项目。所以你不必使用sbt程序集或创建一个胖罐子。 您可以尝试沿着这些路线的东西:

在项目根:

sbt universal:packageBin 

运行:

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

添加到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版本。