2017-10-15 11 views
0

J'ai un petit programme utiliser Scala et je veux l'emballer dans une graisse jar exécutable, les configurations définies dans le fichier étincelle: src/main/resource/localconfig.properties, donc je nouvelle une instance de org.apache.hadoop.fs.Path(String pathString) dans src/main/scala/com.let.App:Comment construire le chemin de HDFS à partir de propriétés en pot?

val Path = new Path("localconfig.properties") 

le problème est il peut fonctionner sur IDEA mais a échoué lorsque le paquet dans le jar et exécuté avec java -jar myapp.jar, invite: fichier introuvable.

J'extraire le fichier jar et le fichier de propriétés se trouve dans le dossier racine: myapp, j'ai aussi essayé Path("resources/localconfig.properties") et cela ne fonctionne pas aussi.

comment est-ce que je peux placer le bon chemin pour le chemin dans un pot exécutable?

C'est l'environnement de Windows, j'ai lu la méthode Path() il semble se rapporter au système d'exploitation mais encore je n'ai aucune idée comment utiliser le constructeur.

+0

L'objet "fs.Path" est travaillé avec HDFS. Sur Windows env, HDFS et le répertoire local sont les mêmes. Mais sur Hadoop env ils sont différents. Devinez, le fichier de configuration peut être lu comme un simple fichier (pas "fs.Path"). Ou fichier de configuration peut être mis sur HDFS. – pasha701

Répondre

0

mentionnant Path(String pathString):

construire un chemin à partir d'une chaîne. Les chaînes de chemins sont des URI, mais avec des éléments non échappés et une normalisation supplémentaire.

Cela signifie que le pathString (par exemple localconfig.properties dans votre exemple) devrait être disponible sur le système de fichiers qui est clairement pas le cas. Le fichier se trouve dans le fichier jar, vous devriez donc demander à JVM de vous donner le fichier.

C'est là, vous devez utiliser Hadoop HDFS et de Path(URI aUri) méthode Java de ClassLoader.getResource.

$ jar cvf /tmp/hello.jar hello.xml 

$ jar -tf /tmp/hello.jar 
META-INF/ 
META-INF/MANIFEST.MF 
hello.xml 

// start spark-shell with the jar on the CLASSPATH 
// that should be exactly your case where your jar is on CLASSPATH 
// with the file you want to use to construct Path inside 

$ ./bin/spark-shell --jars /tmp/hello.jar 

scala> this.getClass.getResource("/hello.xml") 
res0: java.net.URL = jar:file:/tmp/hello.jar!/hello.xml 

// Convert URL to URI that Path supports 
scala> this.getClass.getResource("/hello.xml").toURI 
res1: java.net.URI = jar:file:/tmp/hello.jar!/hello.xml 

scala> import org.apache.hadoop.fs.Path 
import org.apache.hadoop.fs.Path 

scala> new Path(this.getClass.getResource("/hello.xml").toURI) 
res3: org.apache.hadoop.fs.Path = jar: 

Je ne sais cependant pas si la construction Path comme celui-ci est pris en charge ou non.