2011-03-31 35 views
6

我正在使用JRuby中創建的庫的Java包裝器,但無法讀取JAR中的文件。如何使用JRuby在Jar中讀取文件

我已打開JAR並且文件位於JAR的根文件夾中。

然而,當我嘗試運行:

File.read("myfile.txt") 

它引發以下錯誤:

C:\temp>java -jar c:\libraries\XmlCompare.jar 
file:/C:/libraries/XmlCompare.jar!/lib/xmlcompare/app.rb:19:in `initialize': 
No such file or directory - myfile.txt (Errno::ENOENT) 

我甚至曾試圖彌補因爲文本文件是在路徑絕對(根和正在執行是LIB/xmlcompare內側)紅寶石源,通過執行:

File.read("#{File.dirname(__FILE__)}/../../myfile.txt") 

但我得到:

C:\temp>java -jar c:\libraries\XmlCompare.jar 
file:/C:/libraries/XmlCompare.jar!/lib/xmlcompare/app.rb:19:in `initialize': 
No such file or directory - 
file:/C:/libraries/XmlCompare.jar!/lib/xmlcompare/../../myfile.txt 
(Errno::ENOENT) 

關於如何使這項工作的任何想法?

回答

5

歐內斯特指出,這可以在JRuby中做Java的方式:

require 'java' 
require 'XmlCompare.jar' 

f = java.lang.Object.new 
stream = f.java_class.resource_as_stream('/myfile.txt') 
br = java.io.BufferedReader.new(java.io.InputStreamReader.new(stream)) 
while (line = br.read_line()) 
    puts line 
end 
br.close() 
+0

如果這不起作用,請解壓縮jar並查看目錄structor.You可能需要將jar的名稱預先添加到'resource_as_stream'方法中。例如'... resource_as_stream('/ my_jar/myfile.txt')' – 2012-05-31 15:31:26

+1

'java.lang.Object.java_class.resource_as_string('/ myfile.txt')'應該以同樣的方式工作 – 2013-04-24 09:50:41

1

在Java中,您可以使用Class.getResourceAsStream()從jar中讀取文件。我不知道JRuby,但我懷疑這就是你將不得不做的事情,回到Java(然而這是有效的),並從getResource()調用中獲取InputStream。一個jar條目是而不是作爲Java中的File可訪問,所以我不希望它在JRuby中可以很容易訪問。

+0

感謝響應。但是,我不太確定是這樣。我認爲JRuby有一些神奇的方法來實現它,因此您如何使用充滿模板的Rails應用程序,並使用自包含的WAR將其部署到服務器。這是我需要了解的。 – kolrie 2011-03-31 02:53:21

0

對我來說

f = java.lang.Object.new 
stream = f.java_class.resource_as_stream('/myfile.txt') returned nil. 

下列方式從紅寶石工作得很好

stream = self.to_java.get_class.get_class_loader.get_resource_as_stream('myfile.txt') 
+0

'self.to_java。 get_class.get_class_loader'在jruby-9.0.5.0中返回'nil' – paul 2016-03-18 00:22:02

相關問題