2017-10-15 53 views
0

我有一個小星火計劃使用Scala的,我希望它打包成一個可執行的脂肪罐子,在文件中設置的配置:src/main/resource/localconfig.properties,所以我在src/main/scala/com.let.App新的org.apache.hadoop.fs.Path(String pathString)一個實例:如何從jar中的屬性構造HDFS的路徑?

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

問題它可以在IDEA上運行,但在包裝在jar中運行時出現故障,並以java -jar myapp.jar運行,提示:文件找不到。

我解壓縮jar和屬性文件在根文件夾中:myapp,我也試過Path("resources/localconfig.properties"),它也不起作用。

如何在可執行jar中爲path設置正確的路徑?

這是Windows環境,我讀了它似乎與操作系統有關的Path()方法,但我仍然不知道如何使用構造函數。

+0

對象「fs.Path」與HDFS一起使用。在Windows環境下,HDFS和本地目錄是相同的。但在Hadoop環境中,它們是不同的。猜測,配置文件可以讀取爲簡單文件(而不是「fs.Path」)。或者配置文件可以放在HDFS上。 – pasha701

回答

0

引用Path(String pathString)

從字符串建立的路徑。路徑字符串是URI,但具有未轉義的元素和一些額外的規範化。

這意味着pathString(例如,在你的例子localconfig.properties)應該是可用的文件系統,這是顯然並非如此上。該文件位於jar文件中,因此您應該要求JVM爲您提供該文件。

這就是您應該使用Hadoop HDFS的Path(URI aUri)和Java的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: 

然而,我不知道是否構成Path這樣的支持與否。