当两个jar在类路径中时,找不到包scala对象

时间:2015-10-26 15:21:58

标签: scala apache-spark jvm

我在运行我的火花应用程序时面临一个奇怪的问题。

方案

有两个包含相同包名称的jar(com.example.app)。一个是我的实际代码,另一个是非生产代码,用于运行集成测试。我在主代码下有一个包类,它包含主代码中scala类使用的类型。   我正在使用spark-job服务器创建一个上下文,然后首先上传测试jar,然后将main.jar上传到服务器。在测试jar中运行一个作业后,我正在尝试在main.jar中运行该作业,该作业失败,例外

scala.reflect.internal.MissingRequirementError: object com.example.app.CommonUtils.package not found.
        at scala.reflect.internal.MissingRequirementError$.signal(MissingRequirementError.scala:16) ~[scala-reflect-2.10.5.jar:na]
        at scala.reflect.internal.MissingRequirementError$.notFound(MissingRequirementError.scala:17) ~[scala-reflect-2.10.5.jar:na]
        at scala.reflect.internal.Mirrors$RootsBase.ensureModuleSymbol(Mirrors.scala:126) ~[scala-reflect-2.10.5.jar:na]
        at scala.reflect.internal.Mirrors$RootsBase.staticModule(Mirrors.scala:161) ~[scala-reflect-2.10.5.jar:na]
        at scala.reflect.internal.Mirrors$RootsBase.staticModule(Mirrors.scala:21) ~[scala-reflect-2.10.5.jar:na]

但是当我创建一个上下文并单独上传主jar并在主jar中运行它时它工作正常。

这意味着, 在火花工作目录中,当主罐和测试罐都存在时,作业失败,然后失败。 如果仅存在主罐,则通过它。

package.scala

src/test/scala/
`-- com
    `-- example
        `-- app
            |-- CommonUtils


    package object CommonUtils {
      type CompositeKey = (String, Int, Int)
      ...
      }

问题

  • jvm如何在scala中查找包对象?
  • 应该放置此包类?
  • 测试包的命名约定是什么?

1 个答案:

答案 0 :(得分:0)

一个包对象应该放在一个名为package.scala的文件中,并且包含它所在的包的名称。例如,在文件com / foo / bar / package.scala中:

package com.foo

package object bar {
  ...
}