Как прочитать файл в Jar с помощью JRuby - PullRequest
6 голосов
/ 31 марта 2011

Я работаю над оболочкой Java для библиотеки, которую я создал в 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)

Я даже пытался сделать путь абсолютным (учитывая, что текстовый файл находится в корне, а исполняемый источник ruby ​​находится внутри 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)

Есть идеи о том, как я могу сделать эту работу?

Ответы [ 3 ]

5 голосов
/ 31 марта 2011

Как отметил Эрнест, это можно сделать в 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()
1 голос
/ 31 марта 2011

В Java вы читаете файлы из фляги, используя, например, Class.getResourceAsStream ().Я не знаю JRuby, но я подозреваю, что это то, что вам нужно сделать, вернуться к Java (как это работает) и получить InputStream от одного из вызовов getResource ().Запись jar не доступна как файл в Java, поэтому я не ожидаю, что она будет такой же доступной в JRuby.

0 голосов
/ 07 марта 2014

для меня

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

Следующий путь работал нормально от ruby ​​

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