无法使用scala类型安全API读取配置文件

无法使用scala类型安全API读取配置文件,scala,apache-spark,Scala,Apache Spark,我有一个名为Omega的spark/scala项目 我在Omega/conf/Omega.config中有一个conf文件 input_path="/user/cloudera/data user_name="surender" job_name="SAMPLE" 我使用typesafe中的API从conf/omega.config加载配置文件。 它工作正常,我能够读取每个键的相应值 今天,我第一次在omega.config文件中添加了更多的键值对,并尝试从scala代码中检索它们。它抛出

我有一个名为Omega的spark/scala项目

我在Omega/conf/Omega.config中有一个conf文件

input_path="/user/cloudera/data
user_name="surender"
job_name="SAMPLE"
我使用typesafe中的API从conf/omega.config加载配置文件。 它工作正常,我能够读取每个键的相应值

今天,我第一次在omega.config文件中添加了更多的键值对,并尝试从scala代码中检索它们。它抛出

 Exception in thread "main" com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'job_name'
在我的omega.config文件中为密钥作业名称添加新值后,此问题开始出现。 另外,我不能读取新添加的键值,我仍然可以使用config读取所有旧值。getString方法

我正在使用maven构建spark/scala应用程序

Omega.config

input_path="/user/cloudera/data
user_name="surender"
job_name="SAMPLE"
我无法单独访问最近添加的密钥“job_name” package com.pack1

import com.pack2.ApplicationUtil
object OmegaMain {

  val config_loc = "conf/omega.config"

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

   val config               = ApplicationUtil.loadConfig(config_loc)
   val jobName              = ApplicationUtil.getFromConfig(config,"job_name")
}
}


package com.pack2
import com.typesafe.config.{Config, ConfigFactory}


object ApplicationUtil {

 def loadConfig(filePath:String):Config={
  val config = ConfigFactory.parseFile(new File(filePath))

  config
 }

  def getFromConfig(config:Config,jobName:String):String={
    config.getString(jobName)
  }

}

谁能帮我看看哪里出了问题吗?

您可以尝试以下方法:

def loadConfig(filename: String, syntax: ConfigSyntax): Config = {
val in: InputStream = getClass.getResourceAsStream(filename)
if (in == null) return null
val file: File = File.createTempFile(String.valueOf(in.hashCode()), ".conf")
file.deleteOnExit()

val out: FileOutputStream = new FileOutputStream(file)
val buffer: Array[Byte] = new Array(1024)
var bytesRead: Int = in.read(buffer)
while (bytesRead != -1) { out.write(buffer, 0, bytesRead); bytesRead = in.read(buffer) }
out.close()

val conf: Config = ConfigFactory.parseFile(file, ConfigParseOptions.defaults().setSyntax(syntax).setAllowMissing(false).setOriginDescription("Merged with " + filename))
conf
}


filename是类路径中的某个文件路径。如果要将此方法更新为考虑某些外部文件,请使用
val file:file=new file(“文件的绝对路径”)

更改更新第四个方法,我猜在使用Maven构建之后,该文件不在类路径上


由于您使用Maven构建jar,因此需要将
omega.config
放在类路径中。这意味着您必须在默认情况下将其放入
src/main/resources
,或者显式地告诉Maven将
conf
添加到默认资源类路径中

您是否将配置直接解析为类?向我们展示使用typesafe配置的代码。A如果愿意的话。@Yuval:添加了代码,并且您使用的路径是相对的。。。也许你没有像以前一样在同一个地方执行你的应用程序?进行测试并尝试指定绝对路径,或者如果文件位于类路径中,则尝试将其指定为资源,而不是构建新文件(路径)。此项目位于IntelliJ Workspace中。我正在使用mavne进行构建。生成未采用最新更新的conf文件。它采用了以前版本的conf文件。我无法帮助您使用IntelliJ,我是eclipse用户。。。在eclipse中,当您处理从eclipse构建的项目时(包括从EclipseIDE运行为Maven构建),可能会发生这种情况。我想IntelliJ也会发生类似的事情。尝试从${user}/.m2/repository/your groupId/*中删除生成,然后重新运行测试。它应该考虑您的工作区项目,而不是任何安装到mvn本地repo的版本。但是,这是一个eclipse提示,我不知道它是否适用于intelliJ。。。