【问题标题】:How to read a file within a Jar with JRuby如何使用 JRuby 读取 Jar 中的文件
【发布时间】:2011-03-31 02:45:25
【问题描述】:

我正在为我在 JRuby 中创建的库开发 Java 包装器,但我无法读取 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)

有什么想法可以让我完成这项工作吗?

【问题讨论】:

    标签: jar filesystems jruby


    【解决方案1】:

    正如 Ernest 指出的,这可以通过 Java 方式在 JRuby 中完成:

    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()
    

    【讨论】:

    • 如果这不起作用,解压缩你的 jar 并查看目录结构。你可能需要将 jar 的名称添加到 resource_as_stream 方法。例如...resource_as_stream('/my_jar/myfile.txt')
    • java.lang.Object.java_class.resource_as_string('/myfile.txt') 应该以同样的方式工作
    【解决方案2】:

    在 Java 中,您可以使用 Class.getResourceAsStream() 从 jar 中读取文件。我不了解 JRuby,但我怀疑这就是您将要做的,回退到 Java(但它有效)并从 getResource() 调用之一获取 InputStream。 jar 条目在 Java 中可作为文件访问,所以我也不希望它在 JRuby 中如此可访问。

    【讨论】:

    • 感谢您的回复。但是,我不太确定情况是否如此。我认为 JRuby 有一些神奇的方法可以让它工作,因此你可以如何使用一个充满模板的 Rails 应用程序,并使用一个自包含的 WAR 将它部署到服务器上。这就是我需要理解的。
    【解决方案3】:

    对我来说

    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')
    

    【讨论】:

    • self.to_java.get_class.get_class_loader 在 jruby-9.0.5.0 中返回 nil
    猜你喜欢
    • 2012-02-03
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 2011-10-27
    • 2011-04-18
    相关资源
    最近更新 更多