【问题标题】:Using jruby-openssl in Mule Studio在 Mule Studio 中使用 jruby-openssl
【发布时间】:2012-04-25 03:28:10
【问题描述】:

我需要在 Mule Studio 的 Ruby 中使用 openssl。 Mule Studio 预装了 JRuby。我相信您知道,JRuby 不包含 openssl。我下载了 jruby-openssl gem 并将这些文件包含在我的 Mule 项目中。我可以要求这些文件,除了 jopenssl.jar。实际上我可以要求它,但它似乎没有做任何事情。我看到以下错误:

uninitialized constant OpenSSL::Digest::OPENSSL_VERSION_NUMBER

这当然是指OpenSSL::OPENSSL_VERSION_NUMBER

只是为了好玩,我手动定义了它,但它不断发现越来越多的未初始化常量。我读过一些文章说使用 jruby-openssl 的唯一方法是解压缩并组合 jruby-complete.jar 和 jopenssl.jar。由于 Mule 使用的是自己的 JRuby 副本,所以这是不可行的,更不用说一个可笑的组合了。

请问,有人知道如何在 Mule Studio 中使用 jruby-openssl 吗? (仅供参考,我对 Mule 和 JRuby 都是新手,但我很快就学会了不喜欢这两者。)

附录

一些背景知识:我们需要使用 Mule 通过 FTPS 传输文件。由于不直接支持它,而且我们有一个现有的 Ruby 实现,我们决定将 Ruby 代码简单地移动到 Mule 中。但它需要openssl,这就是这个问题的开始。上面的require 'openssl' 行是触发错误的原因。

这里是相关的 Mule/Ruby 代码:

<scripting:transformer name="SetData" doc:name="Set Data">
    <scripting:script engine="jruby">
        <scripting:text><![CDATA[
          require 'socket'
          require 'openssl'
          require 'net/ftp'
          require 'implicit_ftps'
          ...
        ]]></scripting:text>
    </scripting:script>
</scripting:transformer>

根据您的建议,我重建了 Mule 环境库,替换为包含 jopenssl.jar 的新 JRuby 版本。但是,我现在在运行我的应用程序时收到以下错误。据我所知,除了jruby-complete.jar,其他都没有改变。

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/consolo/bin/MuleStudio/plugins/org.mule.tooling.server.3.2.1_1.0.0.201201200937/mule/boot/mule-module-logging-3.2.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/consolo/bin/MuleStudio/plugins/org.mule.tooling.server.3.2.1_1.0.0.201201200937/mule/boot/mule-module-logging-3.2.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

更新

遗憾的是,经过几天的努力,我的公司认为通过 Mule 支持 FTPS 是不值得的。

【问题讨论】:

  • 我想超越下面的回答,帮助您调查问题。请分享足够的 Mule 配置 / Ruby 代码来重现问题?
  • 谢谢。我在最初的问题中添加了更多信息。如果您需要更多信息,请告诉我。
  • mule-module-logging-3.2.1.jar 是否可能在项目构建路径中添加了两次?除了 SLF4J 警告之外,JRuby 代码现在可以工作了吗?
  • 我只看到 1。如果我删除它,错误会更改为 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory 并且它会死掉。
  • 在 SLF4J 警告下方,我刚刚注意到一个异常:Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory at at org.springframework.context.support.AbstractRefreshableApplicationContext.createBeanFactory(AbstractRefreshableApplicationContext.java:194) ... Caused by: java.lang.NullPointerException at org.springframework.beans.factory.support.DefaultListableBeanFactory.&lt;clinit&gt;(DefaultListableBeanFactory.java:104)。所以我还不能测试 Ruby 代码。

标签: ruby openssl jruby mule jsr223


【解决方案1】:

Mule 中的脚本语言支持是可插入的,并通过符合 JSR-223 的提供程序实现。 Mule CE 仅嵌入 Groovy,即您必须将 add JRuby 发送到 Mule,这将使您有机会选择实现目标所需的任何 JAR。

另一方面,Mule Studio 嵌入了额外的脚本提供程序,包括 JRuby。这很方便,但如果需要特定版本(这似乎是您的情况),可能会产生问题。

在 Studio 中,如果您打开 Mule Runtime 库,您会找到 jruby-engine-1.1-jdk14.jarjruby-complete-1.0.jar。不幸的是 Studio 不允许修改这个库,所以你最好的选择是创建一个新库,选择 /plugins/org.mule.tooling.server.3.2.1_1.0.0.201201200937/mule 下的所有 JAR,除了 jRuby 的(在 ./user 中),然后添加你真正需要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-18
    • 2013-01-11
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多