【问题标题】:How to deploy a Ruby class in a Java web project如何在 Java Web 项目中部署 Ruby 类
【发布时间】:2012-06-01 20:50:05
【问题描述】:

我正在尝试在 JRuby 和 Java 应用程序之间创建一个混合体,以便可以一次迁移单个组件。我现在要做的非常简单,这里是 Ruby 类: 需要'java'

java_package 'eu.netprophecy.test'

class RubyViewModel
  java_signature 'String getGreeting()'
  def getGreeting
    puts "Hello, ZK, from Ruby!"
  end
end

我希望能够在 ZK 项目中使用此视图模型:

<?page title="Hello, Ruby!" contentType="text/html;charset=UTF-8"?>
<zk>
<window title="Hello Ruby!!" border="normal" width="200px"     apply="org.zkoss.bind.BindComposer"
    viewModel="@id('vm') @init('eu.netprophecy.test.RubyViewModel')">

<label value="@load(vm.greeting)"/>

</window>
</zk>

我尝试使用marbler 创建一个 jar,但它会将带有 java 字节码的 .class 文件放在一个项目名称在前面的目录中,从而弄乱了预期的包结构(在这种情况下,我得到了 EJB/eu/ netprophecy/test/RubyViewModel,这意味着我无法在 Java 代码中使用生成的 Java 类)。

有谁知道这是否可能,是否有更好的方法,或者我是否必须手动创建 jar?

【问题讨论】:

    标签: jar jruby zk warbler


    【解决方案1】:

    您需要使用become_java! 从您的 ruby​​ 类生成一个 java 类,这是完全可能的(即使没有预编译),只需确保在呈现视图之前执行 ruby​​ 脚本(或编译我不是确定你使用的是什么)。

    class RubyViewModel
      java_signature 'String getGreeting()'
      def getGreeting
        puts "Hello, ZK, from Ruby!"
      end
    end
    
    require 'jruby/core_ext'
    RubyViewModel.become_java! # returns a java.lang.Class
    

    您可以使用以下方法检查方法是否存在(java 方式):

    RubyViewModel.java_class.getDeclaredMethods.map { |method| method.to_s }
    

    【讨论】:

    • 我已经有了 java 字节码,问题是把它打包成在非 JRuby 战争中可用的方式...
    • 对不起,您应该完善您的问题,因为我不清楚,您提到:“我无法在 Java 代码中使用该类”我认为您的评论是在这一点上有点“复杂”来回答你正在寻找的东西。如何启动嵌入式 jruby 容器,正确设置它以从打包脚本的任何位置加载脚本,然后生成字节码,确保 Web 应用程序的类加载器看到生成的类?
    • 我还提到我用 warbler 创建了一个 jar:“我尝试用 marbler 创建一个 jar,但它把类放在前面有项目名称的目录中,弄乱了预期的包结构”但我会尽力澄清。
    • 听起来你可以使用 jrubyc --javac 预编译 *.rb 文件(我猜莺可以为你做到这一点)。
    • 我这样做了 - 问题是我必须手动创建 JAR 的唯一方法(使用 jar cvf ...)还是有其他方法:warbler 只创建显然属于的可执行 jar没有用在 web 项目中...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2020-11-09
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 2020-06-30
    • 1970-01-01
    相关资源
    最近更新 更多