2016-01-21 1 views
2

J'essaie de faire une simple extension NetLogo basée sur akka. Cependant, chaque fois que je tente de charger l'extension dans NetLogo, je reçois l'erreur:Comment empaqueter un projet akka pour une extension netlogo?

Caused by: com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'akka.version' 

Ce qui signifie évidemment que certaines configuration est manquante. J'ai ensuite procédé à ajouter reference.conf à mon dossier de ressources mais sans succès.

La dernière chose que j'ai essayé a été d'utiliser le plugin sbt-assemblty, mais je continue d'avoir la même erreur. Donc, voici mon build.sbt:

name := "TestAkka" 

version := "1.0" 

scalaVersion := "2.11.7" 

scalaSource in Compile <<= baseDirectory(_/"src") 

scalacOptions ++= Seq("-deprecation", "-unchecked", "-Xfatal-warnings", 
    "-encoding", "us-ascii") 

libraryDependencies ++= Seq(
    "org.nlogo" % "NetLogo" % "5.3.0" from 
     "http://ccl.northwestern.edu/devel/NetLogo-5.3-17964bb.jar", 
    "asm" % "asm-all" % "3.3.1", 
    "org.picocontainer" % "picocontainer" % "2.13.6", 
    "com.typesafe" % "config" % "1.3.0", 
    "com.typesafe.akka" %% "akka-actor" % "2.4.1", 
    "com.typesafe.akka" %% "akka-remote" % "2.4.1" 
) 

artifactName := { (_, _, _) => "sample-scala.jar" } 

packageOptions := Seq(
    Package.ManifestAttributes(
     ("Extension-Name", "sample-scala"), 
     ("Class-Manager", "main.scala.akkatest.TestClassManager"), 
     ("NetLogo-Extension-API-Version", "5.3"))) 


packageBin in Compile <<= (packageBin in Compile, baseDirectory, streams) map { 
    (jar, base, s) => 

     IO.copyFile(jar, base/"sample-scala.jar") 

     Process("pack200 --modification-time=latest --effort=9 --strip-debug " + 
      "--no-keep-file-order --unknown-attribute=strip " + 
      "sample-scala.jar.pack.gz sample-scala.jar").!! 
     if(Process("git diff --quiet --exit-code HEAD").! == 0) { 
      Process("git archive -o sample-scala.zip --prefix=sample-scala/ HEAD").!! 
      IO.createDirectory(base/"sample-scala") 
      IO.copyFile(base/"sample-scala.jar", base/"sample-scala"/"sample-scala.jar") 
      IO.copyFile(base/"sample-scala.jar.pack.gz", base/"sample-scala"/"sample-scala.jar.pack.gz") 
      Process("zip sample-scala.zip sample-scala/sample-scala.jar sample-scala/sample-scala.jar.pack.gz").!! 
      IO.delete(base/"sample-scala") 
     } 
     else { 
      s.log.warn("working tree not clean; no zip archive made") 
      IO.delete(base/"sample-scala.zip") 
     } 
     jar 
} 

cleanFiles <++= baseDirectory { base => 
    Seq(base/"sample-scala.jar", 
     base/"sample-scala.jar.pack.gz", 
     base/"sample-scala.zip") } 

J'ai un projet/assembly.sbt avec le contenu:

addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.1") 

J'ai un assembly.sbt dans la racine avec le contenu:

import sbtassembly.AssemblyKeys._ 

baseAssemblySettings 

Dans mon code scala je:

val configString = ConfigFactory.parseString(
     """ 
      akka { 

      loglevel = "INFO" 
      actor { 

       provider = "akka.remote.RemoteActorRefProvider" 
      } 
      remote { 

       enabled-transports = ["akka.remote.netty.tcp"] 
       netty.tcp { 

       hostname = "127.0.0.1" 
       port = "9500" 
       } 

       log-sent-messages = on 
       log-received-messages = on 
      } 
      } 
     """.stripMargin) 

val config = ConfigFactory.load(configString) 

Le dossier resources contient un fichier application.conf que je n'utilise pas pour le moment. Greping la sortie de commande jar tf avec l'expression « référence », montre clairement que reference.conf est présent:

enter image description here

Comment puis-je le paquet de ce AKKA exemple pour une extension NetLogo?

Remarque: J'ai inclus akka-actor et akka-remote comme dépendances de bibliothèque. J'utilise Intellij et SBT 0.13.8 sur une plateforme OS X.

EDIT: Après avoir pris les conseils de Ayush, je reçois la sortie suivante de la commande ensemble SBT, mais la même exception est toujours présente:

enter image description here

Répondre

1

Je pense que le problème est que lors de l'utilisation sbt: assembly la stratégie de fusion par défaut exclut tous les fichiers reference.conf. C'est ce que j'ai trouvé dans la documentation.

If multiple files share the same relative path (e.g. a resource named application.conf in multiple dependency JARs), the default strategy is to verify that all candidates have the same contents and error out otherwise.

Pouvez-vous essayer d'ajouter un MergeStrategy comme suit

assemblyMergeStrategy in assembly := { 
    case PathList("reference.conf") => MergeStrategy.concat 
} 
+0

-vous préciser où exactement l'esprit que je dois ajouter que? Je reçois actuellement une exception quand je fais "sbt assembly" ... Je l'ai ajouté à assembly.sbt dans le répertoire racine du projet. – Marin

+0

cette ligne devrait aller dans le fichier build.sbt – ayush

+0

Je reçois une exception en disant: [info] Fusion de fichiers ... scala.MatchError: org/nlogo/forme/éditeur/EditorDialog $ 17.class (de la classe java.lang.String) – Marin