Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我怎样才能给JRuby一个伪文件系统呢?_Java_Ruby_Jruby - Fatal编程技术网

Java 我怎样才能给JRuby一个伪文件系统呢?

Java 我怎样才能给JRuby一个伪文件系统呢?,java,ruby,jruby,Java,Ruby,Jruby,以前我试着去做,我已经成功了() 我现在把注意力转向这个问题 我已经将JRuby集成到我的Maven插件中,我可以很好地调用SASS编译器,所以现在最后一步(在从hack land到可维护代码的伟大重构之前)是伪造JRuby看到的路径 我的感觉是,我将无法重用我的Rhino技巧(在Rhino作用域中重新映射java.io.File类适配器),因为Ruby通常没有适配器层来纠正不同Ruby VM之间的差异 所以我的下一个想法是猴子补丁。。。但我不确定这项工作会有多大 使用JavaScript,我只

以前我试着去做,我已经成功了()

我现在把注意力转向这个问题

我已经将JRuby集成到我的Maven插件中,我可以很好地调用SASS编译器,所以现在最后一步(在从hack land到可维护代码的伟大重构之前)是伪造JRuby看到的路径

我的感觉是,我将无法重用我的Rhino技巧(在Rhino作用域中重新映射java.io.File类适配器),因为Ruby通常没有适配器层来纠正不同Ruby VM之间的差异

所以我的下一个想法是猴子补丁。。。但我不确定这项工作会有多大

使用JavaScript,我只需伪造
java.io.File
java.io.FileReader
java.io.FileWriter
java.io.FileInputStream
java.io.FileOutputStream


我需要多少钱才能在Ruby运行时运行monkey patch。。。或者我最好使用一个基于ASM的重写类加载器从JRuby本身下面拉地毯(在这里我冒着破坏合法文件使用以加载eg Gems的风险)

这是我关于SASS编译器的特定问题的答案,但不是对如何处理monkey patch JRuby以给它一个伪文件系统这一一般问题的答案

原来Sass有一个
Sass::Importer::Base
的概念,它是解析
.scss
.Sass
文件的基类。因此,我所需要做的就是创建我自己的实现,它将委托给我的虚拟文件系统,并配置传递给
Sass::Engine.new
的选项,以便使用我的导入器实现替换默认的基于文件系统的导入器

虽然我在试图编译它时遇到了一些问题,可能是因为它依赖于与我的测试经验形成对比的较少的支持,其中是独立的

更新 关于基于ASM的重写类加载器。这种方法的诀窍可能是使用AspectC在JRuby运行时中只修改那些类。换句话说,仅当类扩展RubyObject时才应用方面。这将保留JRuby加载ruby源代码的合法需求,同时为嵌入式VM提供假文件系统

关于Monkey补丁,为了确保Monkey补丁有效,Ruby的文件API提供的所有等效方法似乎都需要做大量的工作,特别是考虑到我们不知道SASS编译器将使用哪些API的确切范围


所以,我想完整的答案是:“你不想做猴子补丁或ASM重写,因为你想使用的库提供了一个很好的抽象,可以将虚拟文件系统提供给它”

Tcl已经有了一个虚拟文件系统多年了,所以对他们是如何实现的进行一些研究可能会有所帮助;谷歌:“tcl vfs”我已经有了一个虚拟文件系统(用于JavaScript),但我正在尝试将我没有编写的代码集成到该文件系统中。如果代码是用java编写的,我将使用
aspectc
截取对第三方代码jar中java文件处理的所有调用。这里的代码是用ruby编写的,因此需要一种不同的理解方法,只是试图从另一个角度来解决问题。我错过了你问题的JRuby方面。