【问题标题】:Patterns to make JRuby On Rails applications suitable for both Rails and Java developers使 JRuby On Rails 应用程序适用于 Rails 和 Java 开发人员的模式
【发布时间】:2012-04-12 11:56:36
【问题描述】:

我的团队由 Rails 和 Java 开发人员组成,他们一起开发 JRuby On Rails 应用程序。 Rails 人更喜欢使用纯 Ruby 解释器来开发前端应用程序。 Java 人员将应用程序部署到 Tomcat 并将其与 Spring 和核心 Java 后端服务集成。

我们识别出哪个版本的 Ruby 正在执行该项目,以允许 Rails 研究员使用纯 Ruby 解释器来开发它。

比如我们调整数据库配置:

module MyWebApp
  class Application < Rails::Application
    def config.database_configuration
      config = super
      if defined? JRUBY_VERSION
        config["development"]["adapter"]="jdbcsqlite3"  
      end
      config
    end
  end
end

Gemfile 也是如此:

gem 'sqlite3'
if defined? JRUBY_VERSION
  gem 'jdbc-sqlite3'
  gem 'activerecord-jdbcsqlite3-adapter' 
end

我们还模拟了核心 Java 服务:

class DocumentServiceFactory
  def build
    if defined? JRUBY_VERSION
      spring_context :document_service
    else
      mock :document_service
    end
  end 
end

这个解决方案对我们有用,但我很好奇是否有任何通用模式(或插件、gem、库等)可以使 Rails 应用程序对 Ruby 和 JRuby 都友好?

【问题讨论】:

  • 你可以制作java和MRI gems,所以应该在gem级别处理imo。
  • 嗯...我不确定如何在 gem 级别更改数据库适配器。但是,是的,将所有 MRI/JRuby 切换逻辑委托给 gem 将是一个优雅的解决方案。我将对这种方法进行一些研究。感谢您的建议。

标签: java ruby-on-rails jruby


【解决方案1】:

这里有 3 件事需要回答:

  1. 暂时不需要更改 database.yml 适配器配置。 只需将其保留为 adapter: sqlite3 或 mysql 等并使用最近的 activerecord-jdbc-adapter 例如activerecord-jdbcsqlite3-适配器

  2. 这当然不是在 Gemfile 中处理 jruby 特定依赖项的正确方法。如果您使用 :platform 说明符会更好,这样 Gemfile.lock 是一致的,并且不需要在 ruby​​ 开关之间重新生成,例如:

    gem 'activerecord-jdbcsqlite3-adapter' :platform -&gt; :jruby

  3. 对于服务模拟,可能没有“更好”的方式,但由于您提到并非所有 ruby​​ist 都使用 jruby,所以我会考虑公开一个服务层,例如作为 REST/Web 服务,这样您就不必模拟引入的每个服务,并且即使使用 jruby 运行,rubyist 也不会遇到他们不理解的 java 问题(因为它们不适用于 spring 部分)。

除此之外,我对在 MRI 上开发/测试以及在生产中使用 JRuby 感到非常满意,对于您的 ruby​​ 人员来说,唯一真正的忙碌是了解他们编写“真正的”threadsafe! 代码(jruby 风格)和添加新宝石时要小心,以确保它们在两侧都有效或有一个 jruby 替代品......我几乎没有与在 MRI 上运行良好但在 JRuby 上出现问题的宝石不兼容(我记得可能有 3 个)。我当然推荐 CI(例如 Jenkins)使用 JRuby 运行您的测试,以便尽可能早发现这些。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-26
    • 2011-03-18
    • 2011-04-22
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多