我正在考虑JRuby on Rails和我的产品的原始Ruby on Rails有什么区别?
它在开发活动,部署,原始或可伸缩性之间的支持方面有何不同?
我看过很多文章.他们说JRuby和Ruby一样功能.这是否意味着我们可以将Ruby gems用于JRuby,使用scaffold和像Ruby这样的ActiveRecord,我们也可以像Java一样部署产品?
我在RVM中安装了JRuby 1.7.2,创建了一个gemset,执行了bundle install.现在,我运行这个:
第1学期:
[lzap@lzapx my_app]$ bundle exec jruby --ng-serv
NGServer started on all interfaces, port 2113.
Run Code Online (Sandbox Code Playgroud)
第2学期:
[lzap@lzapx my_app]$ JRUBY_OPTS="--1.9 --ng" bundle exec rails s
Run Code Online (Sandbox Code Playgroud)
问题是没有任何反应,双方都没有打印任何东西,它只是永远挂起.Top没有显示任何java/jruby进程正常工作.
如果我尝试在没有-ng的情况下启动应用程序,它可以正常工作.有什么问题?捆绑?
当然禁用防火墙.
从刚刚启动的会话中考虑以下irb片段:
irb:01> baz # => NameError, baz is not defined
irb:02> baz || baz = 0 # => NameError, baz is not defined
irb:03> baz # => nil
Run Code Online (Sandbox Code Playgroud)
baz是一个未定义的变量,试图评估它产生了一个NameError.然而,不知何故,在这个操作之后,baz被定义了,并且具有值nil.看起来,即使没有人(明确地)要求它,也将值nil赋给变量baz.是否存在潜在的语言原因,为什么这种行为是可取的?
解释此行为和其他类似混淆构造的规则是什么,例如:
irb:04> true if foo # => NameError
irb:05> foo # => NameError; name still undefined
irb:06> foo = (true if foo) # => nil
irb:07> foo # => nil; name defined as nil
irb:08> true || i = 0 …Run Code Online (Sandbox Code Playgroud) 我有一个Rails应用程序,其中少量操作需要大量的计算时间.我没有考虑将这些操作作为后台任务进行管理的复杂性,而是发现我可以将处理拆分为多个线程,并且通过将JRuby与多核服务器一起使用,我可以确保所有线程在合理的时间内完成.(客户已表示非常有兴趣在后台保持此方法与运行任务.)
问题是写入Rails记录器在这些线程中不起作用.日志文件中没有显示任何内容.我找到了一些对这个问题的引用但没有解决方案.我不介意在我的代码中插入puts以帮助调试,但是stdout似乎被glassfish gem app服务器吃掉了.
有没有人成功完成Rails ruby线程内的日志记录,而不是每次都创建一个新日志?
我试图在ruby中编写一些代码(使用jruby),用jrubyc编译成java字节码,并部署到远程机器上,它将在JVM上运行(没有可用的ruby).
只要我乐意坚持标准的jruby库,一切都很好.正如在jruby网站上所解释的,我只是将jruby-complete.jar库复制到远程机器并在运行时将其包含在类路径中.我解雇我编译的脚本,它的工作原理:很酷!
当我需要一些其他库(通常是rubygems)来运行我的脚本时,问题就开始了.
我知道很酷的东西,比如rawr,我成功测试了 - 把你所需要的东西放在一个包中.然而,这不是我正在寻找的解决方案:我将有许多小脚本独立运行,我不希望它们中的每一个都增长到至少10 MB只是因为我疯狂地在每个中包含jruby-complete.jar他们.
我想要的是为我需要使用的每个库编译一个.jar,将它们全部放在远程机器上的公共文件夹中,并在运行我编译的jruby脚本时在运行时将它们包含在类路径中JVM.
这就是说,我试着按照这里的说明进行操作:http: //blog.nicksieger.com/articles/2009/01/10/jruby-1-1-6-gems-in-a-jar
我尝试了完全显示的例子在那里,有"慢性"宝石.一步一步走:
编写两行测试脚本,将其保存为testt.rb:
需要'慢性'
Chronic.parse('明天')
编译:jrubyc testt.rb
我收到以下错误:
异常在线程"主要"文件:/Users/ave2/NetBeansProjects/jrubywatir/lib/jruby-complete.jar /METAINF/jruby.home/lib/ruby/site_ruby/shared/builtin/core_ext/symbol.rb:1:在`const_missing'中:
来自testt.rb的未初始化常量Chronic(NameError):2
...内部jruby堆栈
从Module.const_missing(testt.rb:2)中
脱离(未知).(未知)(:1)
我真的不明白我做错了什么,我完全坚持这个.我是Ruby中的菜鸟,更习惯Python:不要错过转换异教徒的机会!:-) 谢谢.
我是一名前C++程序员,他最近发现了(并且贬低了)Python.我花了一些时间才能合理地熟练使用Python,但是我遇到了一些令人不安的现实,可能导致我把它作为我选择的语言,至少目前是这样.我写这篇文章是希望那里的人可以通过说服我在python宇宙的范围内轻易绕过我的担忧来说服我.
我在寻找一种灵活的语言时选择了python,这使我能够在各种平台上快速构建端到端的工作系统.其中包括:
- Web服务
- 移动应用程序
- 用于PC的跨平台客户端应用程序
开发速度在当前优先于执行速度.但是,为了在不需要重大写入或架构更改的情况下提高性能,我认为必须能够轻松地与Java进行交互.这样,我可以使用Java在应用程序扩展时优化特定组件,而不会丢弃任何代码.
据我所知,我对具有大型开发人员基础的企业级,平台无关,快速语言的要求意味着它必须是Java.由于各自的限制,.NET或C++不会削减它.对于大多数移动平台而言,Java显然也是最重要的.
不幸的是,悲惨的是,似乎没有一种好方法可以满足所有这些要求.
Jython原则上似乎是我正在寻找的东西,除了它似乎几乎死了,没有人在很大程度上发展,支持或使用它.而且Jython似乎与Java库结合得太多,因为你不能使用它的许多CPython标准库,这对你最终编写的代码有重大影响.
我能看到的唯一其他选项是使用包装在编组类中的JPype,虽然看起来很痛苦但可能会起作用,我想知道从长远来看它是否值得.
另一方面,我正在寻找的所有东西似乎都可以通过使用JRuby获得,这似乎更好地支持.事实上,我认为这是我最好的选择.我很难过,因为我非常喜欢Python的一切,包括语法.在可读性方面,Ruby中的perl式构造只是向后退了一步,但最终在Ruby中也可以获得python的大多数好处.
所以我问你 - 我在这里错过了什么?我所说的大部分内容都是基于我所阅读的内容,所以对当前版本的总结是准确的,或者是否有一些神奇的解决方案可以解决这些问题并让我轻松地留在这里我快乐的蟒蛇的地方?
谢谢你的帮助!
GS.
在运行与JRuby中的临时文件交互的某些代码的单元测试时,我有时会得到以下结果:
Exception: java.lang.ThreadDeath thrown from the UncaughtExceptionHandler in thread "Thread-6395"
Run Code Online (Sandbox Code Playgroud)
它似乎没有引起任何问题,但是发生了什么,我怎样才能确定它发生的位置?我尝试打开-d,但这并没有给我一个例外的堆栈跟踪.
我已经解决了这个问题,但它可以帮助那些遇到这个问题的人.过去,Stackoverflow在看似模糊和神秘的IT问题上为我节省了无数个小时.
以下是在Windows上将WAR文件部署到Tomcat时出现的错误.WAR文件是使用JRuby和Warbler在Mac上构建的.
SEVERE: Exception fixing docBase for context [/XYZ] java.io.IOException:
The filename, directory name, or volume label syntax is incorrect
Run Code Online (Sandbox Code Playgroud)
根据其他人的说法,WAR文件已损坏,不应通过任何Zip工具打开.此情况并非如此.
相反,经过几个小时的调查后发现我在Warbler路径中有一个文件名为管道"|"的文件 字符.此文件名未故意分配虽然这在Mac上很好,Windows不喜欢它.
解决方案:使用"|"删除文件 在文件名中,WAR文件成功部署!
在JRuby 9000中调试的最佳方法是什么?Pry和Byebug都是MRI依赖性的.我发现的所有JRuby信息似乎只适用于9k之前的版本,并且不能用于我的JRuby 9k设置.