Не найден параметр конфигурации для ключа 'akka.version'
Я изучаю акка-удаленное взаимодействие, и так выглядит мой проект.
Структура проекта выглядит так
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
Когда я запускаю свой проект на command-line
, Я вижу
$ 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>
Что я упускаю? Спасибо
7 ответов
Кажется, что ваша проблема заключается в jar-with-dependencies
, что вызывает проблемы с Akka, как описано в документации:
Предупреждение
Подход к настройке Akka в значительной степени основан на представлении о том, что каждый модуль /jar имеет свой собственный файл reference.conf, и все они будут обнаружены конфигурацией и загружены. К сожалению, это также означает, что если вы помещаете / объединяете несколько jar-файлов в один jar-файл, вам также необходимо объединить все reference.confs. В противном случае все значения по умолчанию будут потеряны, и Akka не будет работать.
Как предлагается на той же странице, вы можете использовать maven-shade-plugin
объединить все эталонные конфигурации:
Если вы используете Maven для упаковки своего приложения, вы также можете использовать поддержку плагина Apache Maven Shade для преобразователей ресурсов, чтобы объединить все reference.confs из пути к классу сборки в один.
Смотрите также: Akka: отсутствует akka.version
Была похожая проблема:
com.typesafe.config.ConfigException$Missing:
No configuration setting found for key 'akka.persistence.journal-plugin-fallback'
Решено с добавлением добавляемого трансформатора:
<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>
Таким образом, проблема возникает при создании толстой банки, но при неправильной обработке файла reference.conf.
Объяснение следует из ответа @Zoltan:
Похоже, ваша проблема связана с jar-with-dependencies, что вызывает проблемы с Akka, как описано в документации:
Предупреждение
Подход Akka к настройке в значительной степени основан на представлении о том, что каждый модуль /jar имеет свой собственный файл reference.conf, все они будут обнаружены конфигурацией и загружены. К сожалению, это также означает, что если вы поместите / объедините несколько банок в одну банку, вам также необходимо объединить все reference.confs. В противном случае все настройки по умолчанию будут потеряны, и Akka не будет работать.
У меня есть решение для пользователей SBT, для которого не требуется плагин.
В build.sbt добавьте case "reference.conf" => MergeStrategy.concat
в конфигурацию сборки вашего модуля.
lazy val module_name = (project in file("module_path"))
.settings(
name := "module_name",
commonSettings,
assemblyJarName in assembly := "module_name.jar",
test in assembly := {},
assemblyMergeStrategy in assembly := {
case PathList("META-INF", xs @ _*) => MergeStrategy.discard
#################### The line which needs to be added ###################
case "reference.conf" => MergeStrategy.concat
case _ => MergeStrategy.first
}
)
.dependsOn(other_modules, other_modules2)
Команда MergeStrategy.concat
буквально действует так же. При сборке всякий раз, когда он встречает reference.conf, он объединяет его вместо создания отдельного файла для каждого модуля akka (что является поведением по умолчанию).
Кто-нибудь имеет опыт работы с maven(pom.xml), пожалуйста! расширить этот ответ.
многие представленные ответы предлагают общее решение для настройки стратегии слияния для объединения файла конфигурации по умолчанию (он же reference.conf).
Это не обязательно будет работать для библиотек Akka, поскольку некоторые из конфигураций Akka включены в reference.conf из других файлов. Это включает в себя свойство akka.version, которое находится в файле version.conf.
####################################
# Akka Actor Reference Config File #
####################################
# This is the reference config file that contains all the default settings.
# Make your edits/overrides in your application.conf.
# Akka version, checked against the runtime version of Akka. Loaded from generated conf file.
include "version"
Таким образом, для библиотеки akka вам может потребоваться включить этот файл со стратегией слияния concat в дополнение к стратегии reference.conf, поскольку другие сторонние библиотеки могут делать что-то подобное.
assemblyMergeStrategy in assembly := {
case PathList("META-INF", "MANIFEST.MF") =>
val log = sLog.value
log.info("discarding MANIFEST.MF")
MergeStrategy.discard
case PathList("reference.conf") =>
val log = sLog.value
log.info("concatinating reference.conf")
MergeStrategy.concat
case PathList("version.conf") =>
val log = sLog.value
log.info("concatinating version.conf")
MergeStrategy.concat
case default =>
val log = sLog.value
log.debug(s"keeping last $default")
MergeStrategy.last
}
это обычная проблема с alpakka, так как файл version.conf в вашем uber jar должен быть объединен, чтобы содержать значения из обеих библиотек. Таким образом, файл version.conf в вашей банке uber должен выглядеть примерно так:
akka.version = "2.6.19"
akka.kafka.version = "2.0.7"
(мое решение использует scala/sbt и плагин для его сборки, но вы можете сделать что-то подобное для java/maven)
Добавьте следующие плагины:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<shadedArtifactAttached>true</shadedArtifactAttached>
<shadedClassifierName>allinone</shadedClassifierName>
<artifactSet>
<includes>
<include>*:*</include>
</includes>
</artifactSet>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>reference.conf</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Main-Class>akka.Main</Main-Class>
</manifestEntries>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
Ссылка здесь:akka—документы введите здесь описание ссылки
Одно только добавление AppendingTransformer не решило проблему для меня. Если вы пытаетесь развернуть свое искровое приложение на EMR и все еще сталкиваетесь с этой проблемой, пожалуйста, посмотрите мое решение здесь. Надеюсь, поможет!
Я попробовал этот плагин, это здорово, но приводит к другой ошибке из-за некоторых подписанных банок. Вот ошибка:
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
Я бы предложил вам использовать плагин Maven с пружинной загрузкой. Просто добавьте его в свою сборку и наслаждайтесь бесшовными работающими банками. Это одна из причин, почему я люблю Spring Framework.
<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>
Примечание: вам не нужно иметь приложение Spring Boot, чтобы использовать этот плагин. Просто используйте его в любом приложении, и это работает как шарм.