2011-03-31 23 views
6

Estoy trabajando en un contenedor Java para una biblioteca que creé en JRuby y no puedo leer un archivo que está dentro del JAR.Cómo leer un archivo dentro de un Jar con JRuby

He abierto el JAR ya y el archivo está allí, ubicado en la carpeta raíz del JAR.

Sin embargo, cuando trato de ejecutar:

File.read("myfile.txt") 

que arroja el siguiente error:

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) 

Incluso he tratado de hacer la ruta absoluta (teniendo en cuenta que el archivo de texto se encuentra en el raíz y la fuente de ruby ​​que se está ejecutando está dentro de lib/xmlcompare), haciendo:

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

Pero entonces yo consiga:

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) 

¿Alguna idea de cómo puedo hacer esto?

Respuesta

5

Como Ernest señaló, esto se puede hacer en JRuby la manera de 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

Si esto no funciona, descomprima su jar y mire el directorio structor. Es posible que deba anteponer el nombre del jar al método 'resource_as_stream'. Por ejemplo '... resource_as_stream ('/ my_jar/myfile.txt')' –

+1

'java.lang.Object.java_class.resource_as_string ('/ myfile.txt')' debería funcionar igual –

1

En Java, lee archivos de un jar utilizando, por ejemplo, Class.getResourceAsStream(). No sé JRuby, pero sospecho que eso es lo que vas a tener que hacer, volver a Java (como sea que funcione) y obtener el InputStream de una de las llamadas a getResource(). Una entrada jar es no accesible como un archivo en Java, por lo que tampoco esperaría que fuera tan accesible en JRuby.

+0

Gracias por la respuesta. Sin embargo, no estoy tan seguro de que ese sea el caso. Creo que JRuby tiene algunas formas mágicas de hacerlo funcionar, por lo tanto, cómo puedes usar una aplicación de Rails que está llena de plantillas y desplegarla usando un WAR autónomo en un servidor. Eso es lo que necesito entender. – kolrie

0

Para mí

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

siguiente manera funcionó bien de rubí

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

'self.to_java. get_class.get_class_loader' devuelve 'nil' en jruby-9.0.5.0 – paul

Cuestiones relacionadas