问题描述
有一个 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 。并且,它应该返回有关“呼叫者”作业的详细信息。
提前谢谢! :)
解决方法
尝试以下操作,它从堆栈跟踪中获取调用类的名称,并使用它来获取实际的类及其包。
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函数中调用它,则可能会给您错误的包。