AOT编译jRuby混淆Rails代码

AOT compiling with jRuby to obfuscate Rails code

我们在 windows 服务器 2012 R2 中有一个 RoR 应用程序 运行,在客户端网络中使用 IIS、jruby 和 puma。生产应用程序运行良好!现在唯一的问题是,我们需要通过混淆以某种方式保护源代码。我最初的想法是我们可以将 .rb 文件编译成 .class 文件,这样 jruby 就可以消化这些文件而不是 .rb 文件。所以我用一个文件试了一下,看看能不能让它工作。我导航到 myapp/app/controllers 和...

jruby -S jrubyc application_controller.rb

在该目录中创建了一个已编译的 class 文件 application_controller.class。然后我尝试了这个 link 中提到的方法用于旧版本的 jRuby,看看它们是否有效 - https://github.com/jruby/jruby/wiki/RailsAOT

但其中 none 确实如此,要么给我一个未初始化的常量 ApplicationController,要么无法加载文件 application_controller。

我也试过这个 https://www.ruby-forum.com/topic/216572#939791 的说明,但鉴于我缺乏 java 知识,我很确定我没有正确。这是 application_controller.rb -

的最后状态
require 'java'
$CLASSPATH << 'lib'
java_import 'application_controller'

这给了我一个 'cannot import application_controller as application_controller' 我猜是因为 class 名称中的下划线。

本质上,我正在尝试让我的 rails 应用程序使用 .class 文件代替 .rb 文件。

更新: 所以我尝试使用 warbler 创建一个已编译的 war

jruby -S warble compiled war

然后我将 .war 提取到 tomcat 容器中以查看 .rb 文件的内容。他们看起来都像这样:

load __FILE__.sub(/.rb$/,'.class')

所以我试着把那个片段放在我的 application_controller.rb 运行 上 puma 上。我jruby -S rails server,得到如下错误-

use 'java_import' to load normal Java classes: application_controller

所以我将 application_controller.rb 更改为

require 'java'
$CLASSPATH << 'app/controllers'
java_import 'application_controller'

这给了我以下错误 -

cannot import class 'application_controller' as 'application_controller'

难道需要驼峰拼写?我也在使用 jRuby 9.0.0.0,我想我可以尝试回滚到 1.7 看看会发生什么

更新:成功了! 回滚到 jruby 1.7,application_controller.rb 上的 运行 jrubyc 并将 application_controller.rb 内容替换为

load __FILE__.sub(/.rb$/,'.class')

我的应用程序使用带 IIS 的 puma 加载得很好。

尝试 Warblercompiled 功能......它确实〜相同但创建一个虚拟 .rb 文件加载 .class 版本(从你的笔记或旧的 AOT wiki 中不清楚你是否明确地尝试过)

您应该查看生成的 .war 文件(它是一个 .zip)如何更新已编译的 .rb 文件...