2015-06-23 14 views
19

sto imparando Akka-servizi remoti e questo è come il mio progetto appareNessuna configurazione impostazione trovato per la chiave 'akka.version'

La struttura del progetto si presenta come

project/pom.xml 
project/mymodule/pom.xml 
project/mymodule/src/main/resources/application.conf 
project/mymodule/src/main/scala/com.harit.akkaio.remote.RemoteApp.scala 
project/mymodule/src/main/scala/com.harit.akkaio.remote.ProcessingActor.scala 

Quando eseguo il mio progetto su command-line , vedo

$ java -jar akkaio-remote/target/akka-remote-jar-with-dependencies.jar com.harit.akkaio.remote.RemoteApp 
Hello:com.harit.akkaio.remote.RemoteApp 
Exception in thread "main" com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'akka.version' 
    at com.typesafe.config.impl.SimpleConfig.findKey(SimpleConfig.java:124) 
    at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:145) 
    at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:151) 
    at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:159) 
    at com.typesafe.config.impl.SimpleConfig.find(SimpleConfig.java:164) 
    at com.typesafe.config.impl.SimpleConfig.getString(SimpleConfig.java:206) 
    at akka.actor.ActorSystem$Settings.<init>(ActorSystem.scala:169) 
    at akka.actor.ActorSystemImpl.<init>(ActorSystem.scala:505) 
    at akka.actor.ActorSystem$.apply(ActorSystem.scala:142) 
    at akka.actor.ActorSystem$.apply(ActorSystem.scala:119) 
    at com.harit.akkaio.remote.RemoteApp$.startProcessingActorSystem(RemoteApp.scala:16) 
    at com.harit.akkaio.remote.RemoteApp$.main(RemoteApp.scala:12) 
    at com.harit.akkaio.remote.RemoteApp.main(RemoteApp.scala) 

RemoteApp.scala

package com.harit.akkaio.remote 

import akka.actor.{ActorRef, ActorSystem, Props} 
import com.typesafe.config.ConfigFactory 

import scala.concurrent.duration._ 

object RemoteApp { 
    def main(args: Array[String]): Unit = { 
    println("Hello:" + args.head) 
     startProcessingActorSystem() 
    } 

    def startProcessingActorSystem() = { 
    val system = ActorSystem("ProcessingSystem", ConfigFactory.load()) 
    println("ProcessingActorSystem Started") 
    } 
} 

ProcessingActor.scala

package com.harit.akkaio.remote 

import akka.actor.{Actor, ActorLogging} 

case object Process 

case object Crash 

class ProcessingActor extends Actor with ActorLogging { 
    def receive = { 
    case Process => log.info("processing big things") 
    case Crash => log.info("crashing the system") 
     context.stop(self) 
    } 
} 

application.conf

akka { 
    remote.netty.tcp.port = 2552 
} 

mymodule.pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <parent> 
     <artifactId>akkaio</artifactId> 
     <groupId>com.harit</groupId> 
     <version>1.0-SNAPSHOT</version> 
    </parent> 
    <modelVersion>4.0.0</modelVersion> 

    <artifactId>akkaio-remote</artifactId> 

    <properties> 
     <akka-remote_2.11.version>2.3.11</akka-remote_2.11.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>com.typesafe.akka</groupId> 
      <artifactId>akka-remote_2.11</artifactId> 
      <version>${akka-remote_2.11.version}</version> 
     </dependency> 
    </dependencies> 

    <build> 
     <plugins> 
      <plugin> 
       <artifactId>maven-assembly-plugin</artifactId> 
       <configuration> 
        <finalName>akka-remote</finalName> 
        <archive> 
         <manifest> 
          <mainClass>com.harit.akkaio.remote.RemoteApp</mainClass> 
         </manifest> 
        </archive> 
        <descriptorRefs> 
         <descriptorRef>jar-with-dependencies</descriptorRef> 
        </descriptorRefs> 
       </configuration> 
       <executions> 
        <execution> 
         <id>make-assembly</id> <!-- this is used for inheritance merges --> 
         <phase>package</phase> <!-- bind to the packaging phase --> 
         <goals> 
          <goal>single</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
</project> 

pom.xml

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>com.harit</groupId> 
    <artifactId>akkaio</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <modules> 
     <module>akkaio-remote</module> 
    </modules> 

    <packaging>pom</packaging> 
    <inceptionYear>2015</inceptionYear> 
    <properties> 
     <scala.version>2.11.6</scala.version> 
     <junit.version>4.12</junit.version> 
     <scalatest_2.11.version>2.2.5</scalatest_2.11.version> 
     <akka-actor_2.11.version>2.3.11</akka-actor_2.11.version> 
     <akka-slf4j_2.11.version>2.3.11</akka-slf4j_2.11.version> 
     <akka-testkit_2.11.version>2.3.11</akka-testkit_2.11.version> 
     <mockito-all.version>1.10.19</mockito-all.version> 
     <maven-scala-plugin.scalaCompatVersion>2.11.6</maven-scala-plugin.scalaCompatVersion> 
     <scalatest-maven-plugin.version>1.0</scalatest-maven-plugin.version> 
    </properties> 

    <repositories> 
     <repository> 
      <id>scala-tools.org</id> 
      <name>Scala-Tools Maven2 Repository</name> 
      <url>http://scala-tools.org/repo-releases</url> 
     </repository> 
    </repositories> 

    <pluginRepositories> 
     <pluginRepository> 
      <id>scala-tools.org</id> 
      <name>Scala-Tools Maven2 Repository</name> 
      <url>http://scala-tools.org/repo-releases</url> 
     </pluginRepository> 
    </pluginRepositories> 

    <dependencies> 
     <dependency> 
      <groupId>org.scala-lang</groupId> 
      <artifactId>scala-library</artifactId> 
      <version>${scala.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>com.typesafe.akka</groupId> 
      <artifactId>akka-actor_2.11</artifactId> 
      <version>${akka-actor_2.11.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>com.typesafe.akka</groupId> 
      <artifactId>akka-slf4j_2.11</artifactId> 
      <version>${akka-slf4j_2.11.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.scalatest</groupId> 
      <artifactId>scalatest-maven-plugin</artifactId> 
      <version>${scalatest-maven-plugin.version}</version> 
      <scope>compile</scope> 
     </dependency> 
     <dependency> 
      <groupId>com.typesafe.akka</groupId> 
      <artifactId>akka-testkit_2.11</artifactId> 
      <version>${akka-testkit_2.11.version}</version> 
      <scope>test</scope> 
     </dependency> 
     <dependency> 
      <groupId>org.scalatest</groupId> 
      <artifactId>scalatest_2.11</artifactId> 
      <version>${scalatest_2.11.version}</version> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 

    <build> 
     <defaultGoal>clean install</defaultGoal> 
     <plugins> 
      <plugin> 
       <groupId>org.scala-tools</groupId> 
       <artifactId>maven-scala-plugin</artifactId> 
       <executions> 
        <execution> 
         <goals> 
          <goal>compile</goal> 
          <goal>testCompile</goal> 
         </goals> 
        </execution> 
       </executions> 
       <configuration> 
        <scalaCompatVersion>${maven-scala-plugin.scalaCompatVersion}</scalaCompatVersion> 
        <scalaVersion>${scala.version}</scalaVersion> 
        <scalaVersion>${scala.version}</scalaVersion> 
        <args> 
         <arg>-target:jvm-1.8</arg> 
        </args> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-surefire-plugin</artifactId> 
       <version>2.7</version> 
       <configuration> 
        <skipTests>true</skipTests> 
       </configuration> 
      </plugin> 
      <plugin> 
       <groupId>org.scalatest</groupId> 
       <artifactId>scalatest-maven-plugin</artifactId> 
       <version>1.0</version> 
       <configuration> 
        <reportsDirectory>${project.build.directory}/surefire-reports</reportsDirectory> 
        <junitxml>.</junitxml> 
        <filereports>WDF TestSuite.txt</filereports> 
       </configuration> 
       <executions> 
        <execution> 
         <id>test</id> 
         <goals> 
          <goal>test</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
    </build> 
    <reporting> 
     <plugins> 
      <plugin> 
       <groupId>org.scala-tools</groupId> 
       <artifactId>maven-scala-plugin</artifactId> 
       <configuration> 
        <scalaVersion>${scala.version}</scalaVersion> 
       </configuration> 
      </plugin> 
     </plugins> 
    </reporting> 
</project> 

Che cosa mi manca fuori? Grazie

risposta

22

Sembra che il problema sia bundling in un jar-with-dependencies, che causa problemi con Akka, come descritto nella documentation:

Attenzione

approccio di configurazione di Akka si basa molto sul concetto di ogni modulo/jar con il proprio file reference.conf, tutti verranno scoperti dalla configurazione e caricati. Sfortunatamente questo significa anche che se metti/unisci più jar nello stesso jar, devi unire anche tutti i reference.confs. Altrimenti tutte le impostazioni predefinite andranno perse e Akka non funzionerà.

Come suggerito sulla stessa pagina, è possibile utilizzare maven-shade-plugin per unire tutte le configurazioni di riferimento:

se si utilizza Maven per confezionare la vostra applicazione, si può anche fare uso di Shade Apache Maven Supporto plug-in per Resource Transformers per unire tutti i reference.confs sul classpath di build in uno solo.

Vedi anche: Akka: missing akka.version

+0

si deve aggiungere esplicitamente reference.conf al progetto? – Marin

23

avuto un problema simular:

com.typesafe.config.ConfigException$Missing: 
No configuration setting found for key 'akka.persistence.journal-plugin-fallback' 

risolto con l'aggiunta di un trasformatore aggiungendo:

<plugin> 
    <artifactId>maven-shade-plugin</artifactId> 
    <version>2.4.1</version> 
    <executions> 
    <execution> 
     <phase>package</phase> 
     <goals> 
     <goal>shade</goal> 
     </goals> 
     <configuration> 
     <transformers> 
      <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> 
      <resource>reference.conf</resource> 
      </transformer> 
     </transformers> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 
+1

grazie, il trasformatore ha funzionato anche per me. –

+4

Il tuo plugin mi da ancora 'Nessuna impostazione di configurazione trovata per la chiave 'akka.version'', così come il plugin nei documenti di akka. –

0

calcolata AppendingTransformer solo non ha risolto il problema per me. Se si sta provando a distribuire l'applicazione spark su EMR e si sta ancora affrontando questo problema, si prega di dare un'occhiata alla mia soluzione here. Spero che sia d'aiuto!