2017-04-02 2 views
0

Ich habe einen Funken/scala Projekt mit dem Namen wie OmegaNicht in der Lage Konfigurationsdatei scala typsichere API

Ich habe eine conf-Datei in Omega/conf/omega.config

Ich benutze API von typsicher lesen lade die Konfigurationsdatei von conf/omega.config. Es funktionierte gut und ich konnte den jeweiligen Wert für jeden Schlüssel

lesen

Jetzt heute, zum ersten Mal habe ich einige Schlüssel-Wert-Paare in meiner omega.config-Datei hinzugefügt und versucht, sie von meinem scala abrufen Code. Es wirft

Exception in thread "main" com.typesafe.config.ConfigException$Missing: No configuration setting found for key 'job_name' 

Dieses Problem geschieht begann nach neuen Wert für den Schlüssel job_name in meiner omega.config Datei hinzufügen. Ich kann auch die neu hinzugefügten Schlüsselwerte nicht lesen, trotzdem kann ich alle alten Werte mit config lesen. getString-Methode

Ich baue meine Spark/Scala-Anwendung mit Maven.

Omega.config

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

Ich bin nicht fähig, die vor kurzem hinzugefügt Schlüssel "job_name", um allein Paket 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) 
    } 

} 

Könnte jemand mir helfen, was schief gelaufen ist?

+0

Beheben Sie Ihre Konfiguration direkt in einer Klasse? Zeigen Sie uns den Code, den Sie für die Arbeit mit typesafe config verwenden. A [MCVE] wenn du willst. –

+0

@Yuval: Der Code wurde auch hinzugefügt –

+0

Der Pfad, den Sie verwenden, ist relativ ... Vielleicht führen Sie Ihre App nicht von der gleichen Stelle aus wie zuvor? Führen Sie einen Test durch und versuchen Sie, einen absoluten Pfad anzugeben, oder versuchen Sie, wenn sich die Datei in Ihrem Klassenpfad befindet, diesen als Ressource anzugeben, anstatt eine neue Datei (Pfad) zu erstellen. – Cheloute

Antwort

0

können Sie versuchen, so etwas wie:

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 

}

Dateiname wird einige Dateipfad im Classpath. Wenn Sie diese Methode aktualisieren möchten, um eine externe Datei zu berücksichtigen, ändern Sie das Update mit val file: File = new File("absolute Path of he file")

+0

Dieses Projekt befindet sich in IntelliJ Workspace. Ich benutze mavne um den Build zu machen. Der Build nimmt nicht die neueste aktualisierte Conf-Datei. Es dauert die vorherige Version der Conf-Datei. –

+0

Ich kann dir nicht mit IntelliJ helfen, ich bin ein Eclipse-Benutzer ... Mit Eclipse kann es passieren, wenn du mit Projekten arbeitest, die du aus Eclipse gebaut hast (dazu gehört auch der Run as Maven Build von der Eclipse IDE). Ich nehme an, sowas kann mit IntelliJ passieren. Versuchen Sie, Ihre Builds aus $ {user} /. M2/repository/your-groupId/* zu löschen und führen Sie Ihren Test erneut aus. Es sollte Ihr Workspaces-Projekt anstelle einer installierten Version in mvn local repo berücksichtigen.Aber gut, es ist ein Eclipse-Tipp, ich weiß nicht, ob es mit IntelliJ funktioniert ... – Cheloute

0

Ich vermute, die Datei ist nicht auf dem Klassenpfad, nachdem Sie mit Maven erstellen.

Da Sie Maven verwenden, um ein Glas zu bauen, müssen Sie Ihre omega.config im Klassenpfad sein. Dies bedeutet, dass Sie es entweder standardmäßig in src/main/resources einfügen müssen oder Maven explizit anweisen, conf dem Standardressourcenklassenpfad hinzuzufügen.