0

有一个Apache Spark Scala项目 ( runnerProject ),它使用同一个包 ( sourceProject ) 中的另一个项目。源项目的目的是获取正在运行的 Databricks 作业的名称和版本。

以下方法的问题在于,当runnerProject调用它时,它返回sourceProject 的详细信息,而不是runnerProject的名称和版本

sourceProject的方法:

class EnvironmentInfo(appName: String) {
 
override def getJobDetails(): (String, String) = {
    val classPackage = getClass.getPackage

    val jobName = classPackage.getImplementationTitle
    val jobVersion = classPackage.getImplementationVersion

    (jobName, jobVersion)
  }
 }

runnerProject 使用 sourceProject 作为一个包:

import com.sourceProject.environment.{EnvironmentInfo}

 class runnerProject {
  def start(
      environment: EnvironmentInfo
  ): Unit = {

// using the returned parameters of the environment

}

如何以getJobDetails()sourceProject中运行的方式解决此问题,以便也可以从其他项目调用它,而不仅仅是runnerProject。而且,它应该返回有关“调用者”工作的详细信息

先感谢您!:)

4

1 回答 1

1

尝试以下操作,它从堆栈跟踪中获取调用类名,并使用它来获取实际类,它是包。

class EnvironmentInfo(appName: String) {
 
override def getJobDetails(): (String, String) = {
    val callingClassName = Thread.currentThread.getStackTrace()(2).getClassName
    val classPackage = Class.forName(callingClassName).getPackage

    val jobName = classPackage.getImplementationTitle
    val jobVersion = classPackage.getImplementationVersion

    (jobName, jobVersion)
  }
 }

如果您直接调用它,它将起作用,如果您从 lambda 函数中调用它,它可能会给您错误的包。

于 2020-09-10T10:26:28.247 回答