2016-09-03 25 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例外

私はPROJECT.jar -jar javaのを実行すると、それが返されます。

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-actorをakka-httpと同じバージョンに依存として追加しようとしました。

+2

あなたは 'のsbt assembly'を実行し、アセンブリのプラグインを使用して試してみましたがありますか?これは 'java -jar PROJECT.jar'で実行可能なすべての依存関係を持つjarファイルを生成します –

答えて

1

Sbtは、スカラプロジェクトをパックするためのJavaネイティブアプリパックを使用しています。したがって、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-2.12があなたであるscala target/scala-2.12/YOUR_FILE.assembly-0.1.jarを入力して、あなたの.jarファイルを実行しますスカラー版。

関連する問題