eclipse - Scala akka - 无法从 Maven 构建的 jar-with-dependency 运行程序

标签 eclipse scala maven jar akka

我是 scala 和 akka 的新手。我尝试使用客户端和服务器设置简单的 akka 远程项目。我正在使用带有 Maven scala 插件的 Eclipse。如果我从 IDE 运行这个项目,一切都会正常。客户端能够连接到服务器。不幸的是,当我使用 maven-assemble-plugin 将项目构建为 jar-with-dependency 时,我无法从命令行运行它。我收到这样的错误:

F:\Projects\sag-project-scala\sag-scala\target>scala sag-scala-1.0-jar-with-dependencies.jar server com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'akka.loggers' 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.getList(SimpleConfig.java:212) at com.typesafe.config.impl.SimpleConfig.getHomogeneousUnwrappedList(SimpleConfig.java:271) at com.typesafe.config.impl.SimpleConfig.getStringList(SimpleConfig.java:329) at akka.actor.ActorSystem$Settings.(ActorSystem.scala:179) at akka.actor.ActorSystemImpl.(ActorSystem.scala:504) at akka.actor.ActorSystem$.apply(ActorSystem.scala:141) at akka.actor.ActorSystem$.apply(ActorSystem.scala:118) at com.sag.remote.ServerObject$.run(Server.scala:28) at com.sag.remote.ServerObject$.main(Server.scala:25) at com.sag.remote.ServerObject.main(Server.scala) at com.sag.main.ScalaRunner.main(ScalaRunner.java:23) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at scala.tools.nsc.util.ScalaClassLoader$$anonfun$run$1.apply(ScalaClassLoader.scala:71) at scala.tools.nsc.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:31) at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:139) at scala.tools.nsc.util.ScalaClassLoader$class.run(ScalaClassLoader.scala:71) at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:139) at scala.tools.nsc.CommonRunner$class.run(ObjectRunner.scala:28) at scala.tools.nsc.JarRunner$.run(MainGenericRunner.scala:16) at scala.tools.nsc.CommonRunner$class.runAndCatch(ObjectRunner.scala:35) at scala.tools.nsc.JarRunner$.runJar(MainGenericRunner.scala:28) at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:78) at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:96) at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:105) at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)

如果我理解 akka 文档,在自定义 *.conf 文件中,我将覆盖默认配置,并且 akka 在内部将这些文件解析为一个文件。 我很确定,我错过了一些非常小的东西,但经过两天的谷歌搜索后我放弃了。这就是为什么我向你寻求帮助。 似乎无法从 application.conf 找到正确的配置,但为什么从 IDE 一切都工作正常? 以下是用于构建我的示例的文件:

ScalaRunner.java

package com.sag.main;

import com.sag.remote.ClientObject;
import com.sag.remote.ServerObject;

/**
 * Runner class to simply run jar file from command line.
 * @author ddr
 *
 */
public class ScalaRunner {
    private static String SERVER_MODE = "server";
    private static String CLIENT_MODE = "client";
    public static void main(String[] args) {
        String mode = SERVER_MODE;
        if(args != null && args.length > 0){
            mode = args[0];
        }
        if(CLIENT_MODE.equals(mode)){
            ClientObject.main(args);
        }
        else if (SERVER_MODE.equals(mode)){
            ServerObject.main(args);
        }
    }
}

客户端.scala

package com.sag.remote

import akka.actor._
import akka.actor.ActorDSL._
import com.typesafe.config.ConfigFactory

class Client extends Actor {
  def receive = {
    case msg: String => println("joe received " + msg + " from " + sender)
    case _ => println("Received unknown msg ")
  }
}

object ClientObject  {
    def main(args: Array[String]): Unit = run()

  def run() = {
     println("STARTING CLIENT")
     implicit val client = ActorSystem("Client", ConfigFactory.load("client"))
     val server = client.actorFor("akka.tcp://server@127.0.0.1:6969/user/server")
     println("That 's remote server:" + server)
     server ! "Hello"
  }
}

服务器.scala

package com.sag.remote

import akka.actor.Actor
import akka.actor.ActorSystem
import akka.actor.Props
import com.typesafe.config.Config
import scala.concurrent.duration.Duration
import java.util.concurrent.TimeUnit
import akka.actor.Extension
import akka.actor.ExtensionIdProvider
import akka.actor.ExtensionId
import akka.actor.ExtendedActorSystem
import akka.actor.ActorSystem.Settings
import com.typesafe.config.ConfigFactory


class Server extends Actor {
  def receive = {
    case msg: String => println("joe received " + msg + " from " + sender)
    case _ => println("Received unknown msg ")
  }
}

object ServerObject { 
  def main(args: Array[String]): Unit = run()

  def run() = {
    val server = ActorSystem("server", ConfigFactory.load("server"))
    val serverActor = server.actorOf(Props[Server], name = "server")
    println(serverActor.path)
    println()
    println("Server ready")
  }
}

common.conf

include "application.conf"
akka{
    stdout-loglevel = "DEBUG"
    loglevel = "DEBUG"
    actor {
        provider = "akka.remote.RemoteActorRefProvider"
    }
    remote {
        enabled-transports = ["akka.remote.netty.tcp"]
        netty.tcp {
            hostname = "127.0.0.1"
        }
    }
}

客户端.conf

include "common"

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

服务器.conf

include "common"

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

pom.xml

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>sag-scala</groupId>
    <artifactId>sag-scala</artifactId>
    <version>1.0</version>
    <inceptionYear>2008</inceptionYear>
    <properties>
        <scala.version>2.10.1</scala.version>
    </properties>

    <repositories>
        <repository>
            <id>scala-tools.org</id>
            <name>Scala-Tools Maven2 Repository</name>
            <url>http://scala-tools.org/repo-releases</url>
        </repository>
        <repository>
            <id>akka-snapshots</id>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
            <url>http://repo.akka.io/snapshots/</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-remote_2.10</artifactId>
            <version>2.3.2</version>
        </dependency>
        <dependency>
            <groupId>com.typesafe.akka</groupId>
            <artifactId>akka-actor_2.10</artifactId>
            <version>2.3.2</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.4</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.specs</groupId>
            <artifactId>specs</artifactId>
            <version>1.2.5</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <sourceDirectory>src/main/scala</sourceDirectory>
        <testSourceDirectory>src/test/scala</testSourceDirectory>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-eclipse-plugin</artifactId>
                <configuration>
                    <downloadSources>true</downloadSources>
                    <buildcommands>
                        <buildcommand>ch.epfl.lamp.sdt.core.scalabuilder</buildcommand>
                    </buildcommands>
                    <additionalProjectnatures>
                        <projectnature>ch.epfl.lamp.sdt.core.scalanature</projectnature>
                    </additionalProjectnatures>
                    <classpathContainers>
                        <classpathContainer>org.eclipse.jdt.launching.JRE_CONTAINER</classpathContainer>
                        <classpathContainer>ch.epfl.lamp.sdt.launching.SCALA_CONTAINER</classpathContainer>
                    </classpathContainers>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.2-beta-5</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>com.sag.main.ScalaRunner</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>com.sag.main.ScalaRunner</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </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>

如果有任何帮助,我将不胜感激。 问候, 达里乌斯

最佳答案

这里是修改后的 pom.xml 解决了我的问题。也许这会对某人有所帮助。

pom.xml

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>sag-scala</groupId>
    <artifactId>sag-scala</artifactId>
    <version>1.0</version>
    <inceptionYear>2008</inceptionYear>
    <properties>
        <scala.version>2.10.1</scala.version>
    </properties>

    <repositories>
        <repository>
            <id>scala-tools.org</id>
            <name>Scala-Tools Maven2 Repository</name>
            <url>http://scala-tools.org/repo-releases</url>
        </repository>
        <repository>
            <id>akka-snapshots</id>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
            <url>http://repo.akka.io/snapshots/</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-remote_2.10</artifactId>
            <version>2.3.2</version>
        </dependency>
        <dependency>
            <groupId>com.typesafe.akka</groupId>
            <artifactId>akka-actor_2.10</artifactId>
            <version>2.3.2</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.4</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.specs</groupId>
            <artifactId>specs</artifactId>
            <version>1.2.5</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <sourceDirectory>src/main/scala</sourceDirectory>
        <testSourceDirectory>src/test/scala</testSourceDirectory>
        <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> <scalaVersion>${scala.version}</scalaVersion> 
                <args> <arg>-target:jvm-1.5</arg> </args> </configuration> </plugin -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-eclipse-plugin</artifactId>
                <configuration>
                    <downloadSources>true</downloadSources>
                    <buildcommands>
                        <buildcommand>ch.epfl.lamp.sdt.core.scalabuilder</buildcommand>
                    </buildcommands>
                    <additionalProjectnatures>
                        <projectnature>ch.epfl.lamp.sdt.core.scalanature</projectnature>
                    </additionalProjectnatures>
                    <classpathContainers>
                        <classpathContainer>org.eclipse.jdt.launching.JRE_CONTAINER</classpathContainer>
                        <classpathContainer>ch.epfl.lamp.sdt.launching.SCALA_CONTAINER</classpathContainer>
                    </classpathContainers>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <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>com.sag.main.ScalaRunner</Main-Class>
                            </manifestEntries>
                        </transformer>
                    </transformers>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <mainClass>com.sag.main.ScalaRunner</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </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>

关于eclipse - Scala akka - 无法从 Maven 构建的 jar-with-dependency 运行程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23898373/

相关文章:

java - Scala 阻塞图

python - RDD.sortByKey 在 python 中使用函数?

java - 在eclipse中运行maven项目的问题,不被识别为Java项目

android - 导入项目(Eclipse ADT,Gradle等)选项在Android Studio 2.3.2中不会退出

java - 如何在 Eclipse 中设置 JVM 启动参数?

eclipse中找不到java源代码

eclipse - 关于 Yeoman、Maven 和 Thymeleaf HTML 模板位置的询问

java - 从 Android HTC 相机拍照时出现空指针异常

eclipse - 斯卡拉/电梯 : Set up hotdeploy through Eclipse?

java - 无法从/到中央传输 Artifact org.apache.maven.plugins :maven-surefire-plugin:pom:2. 7.1 (http ://repo1. maven.org/maven2)