2017-04-02 40 views
0

我有一个名为欧米茄无法读取配置文件中使用类型安全的阶API

我有欧米茄/ conf目录内conf文件火花/斯卡拉项目/ omega.config

我使用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文件的密钥JOB_NAME增加新的价值后发生。 另外我无法读取新添加的键值,我仍然可以使用config读取所有旧值。 getString方法

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

Omega.config

input_path="/user/cloudera/data 
user_name="surender" 
job_name="SAMPLE" 

我无法访问最近添加的关键 “JOB_NAME” 独 包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) 
    } 

} 

能有人帮我出了什么问题?

+0

您是否直接将您的配置解析到类中?向我们展示您用于使用类型安全配置的代码。如果你愿意的话,[MCVE]。 –

+0

@Yuval:添加了代码 –

+0

您使用的路径是相对的......也许您没有像以前一样执行您的应用程序?进行测试并尝试指定绝对路径,或者如果文件位于类路径中,则尝试将其指定为资源而不是构建新的文件(路径)。 – Cheloute

回答

0

你可以尝试这样的:

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 

}

文件名是在classpath一些文件路径。如果你想更新这个方法来考虑一些外部文件,更改更新第四个val file: File = new File("absolute Path of he file")

+0

该项目位于IntelliJ工作区。我正在使用mavne来构建。该版本没有采用最新的更新conf文件。它采用以前版本的conf文件。 –

+0

我无法帮助您使用IntelliJ,我是一名eclipse用户...使用eclipse时,您可能会遇到您使用eclipse构建的项目(这包括eclipse IDE中的Run as Maven构建版)。我想这样的事情可能会发生在IntelliJ上。尝试从$ {user} /。m2/repository/your-groupId/*删除您的构建,然后重新运行测试。它应该考虑你的工作区项目,而不是任何安装的版本到mvn本地回购。但是,这是一个日食提示,我不知道它是否与intelliJ一起工作... – Cheloute

0

我猜这个文件是不是在你用Maven构建后的类路径。

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

相关问题