【问题标题】:package scala object is not found when two jars are in class path当两个 jar 在类路径中时,找不到包 scala 对象
【发布时间】:2015-10-26 15:21:57
【问题描述】:

我在运行我的 spark 应用程序时遇到了一个奇怪的问题。

场景

有两个 jars 包含相同的包名 (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 中运行作业时,它工作正常。

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

package.scala

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


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

问题

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

【问题讨论】:

  • 错误是由于两个 jars 中存在一个类文件。一个是测试罐,另一个是主罐。当两个 jar 在一个上下文中使用并且主 jar 执行时,将拾取测试 jar 类文件并在测试 jar 中搜索包对象。

标签: scala apache-spark jvm


【解决方案1】:

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

package com.foo

package object bar {
  ...
}

【讨论】:

    猜你喜欢
    • 2014-04-01
    • 2018-07-31
    • 1970-01-01
    • 2012-04-22
    • 2022-01-05
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    相关资源
    最近更新 更多