Ich lerne Akka-Remoting und so sieht mein Projekt aus
Die Projektstruktur sieht so aus
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
Wenn ich mein Projekt auf command-line
starte, sehe ich
$ 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>
Was fehlt mir? __ Danke
Es scheint, dass Ihr Problem in einem jar-with-dependencies
gebündelt wird, was Probleme mit Akka verursacht, wie in der Dokumentation beschrieben :
Warnung
Der Konfigurationsansatz von Akka beruht in hohem Maße auf der Vorstellung, dass jedes Modul/Jar seine eigene reference.conf -Datei hat. Alle werden von der Konfiguration erkannt und geladen. Leider bedeutet dies auch, dass Sie alle reference.confs zusammenführen müssen, wenn Sie mehrere Jars in dasselbe Jar setzen/zusammenführen. Andernfalls gehen alle Standardeinstellungen verloren und Akka funktioniert nicht.
Wie auf derselben Seite vorgeschlagen, können Sie maven-shade-plugin
verwenden, um alle Referenzkonfigurationen zusammenzuführen:
Wenn Sie Maven verwenden, um Ihre Anwendung zu packen, können Sie auch die Unterstützung des Apache Maven Shade Plugin für Resource Transformers verwenden, um alle reference.confs des Build-Klassenpfads in eine zu mischen.
Siehe auch: Akka: fehlende akka.version
Hatte ein ähnliches Problem:
com.typesafe.config.ConfigException$Missing:
No configuration setting found for key 'akka.persistence.journal-plugin-fallback'
Behebung des Problems durch Hinzufügen eines anhängenden Transformators:
<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>
Das Hinzufügen von AppendingTransformer allein hat das Problem für mich nicht gelöst. Wenn Sie versuchen, Ihre Spark-Anwendung in EMR bereitzustellen und immer noch mit diesem Problem konfrontiert sind, werfen Sie einen Blick auf meine Lösung hier . Ich hoffe es hilft!
Ich habe dieses Plugin ausprobiert, es ist großartig, führt aber aufgrund einiger signierter Gläser zu einem weiteren Fehler. Hier ist der Fehler:
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" Java.lang.SecurityException: Invalid signature file digest for Manifest main attributes
Was ich vorschlagen würde, ist das Spring Boot Maven Plugin. Fügen Sie es einfach zu Ihrem Build hinzu und genießen Sie nahtlose, lauffähige Gläser. Dies ist ein guter Grund, warum ich Spring Framework liebe.
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
<configuration>
<classifier>final</classifier>
<mainClass>
com.main.PopularHashTags
</mainClass>
</configuration>
</execution>
</executions>
</plugin>
Hinweis: Sie benötigen keine Spring Boot-Anwendung, um dieses Plugin verwenden zu können. Verwenden Sie es einfach in jeder Anwendung und es wirkt wie ein Zauber.