如何在Heroku上部署JRuby Rails 3.1.x?

问题描述 投票:5回答:3

我希望能够将一个jruby rails 3.1 app部署到Heroku。

Heroku现在支持Java:http://blog.heroku.com/archives/2011/08/25/java/据说,应该可以部署JRuby rails应用程序。这里有一个关于普通java的教程:http://devcenter.heroku.com/articles/java和另一个:http://devcenter.heroku.com/articles/spring-mvc-hibernate

这是一个关于Heroku的JRuby Sinatra应用程序的教程:http://chris.chowie.net/2011/08/28/Sinatra-with-JRuby-on-Heroku/为了使这个工作,我在运行heroku时使用了非jruby ruby​​,因为如果rvm使用jruby,heroku会崩溃。

为了运行命令

mvn package

我不得不这样做:

bundle --gemfile=/home/justin/github/sinatra-jruby-heroku/Jemfile install temple
bundle --gemfile=/home/justin/github/sinatra-jruby-heroku/Jemfile update

我创建了应用程序:

heroku create jg1-sinatra --stack cedar

我将文件推送到heroku,但是当应用程序启动时,它崩溃了。 :(

有什么建议?我猜不会在Heroku有这方面的教程之前不久。

Heroku的日志文件:

2011-11-21T08:30:40+00:00 heroku[slugc]: Slug compilation started
2011-11-21T08:31:17+00:00 heroku[api]: Deploy 3bccec5 by [email protected]
2011-11-21T08:31:17+00:00 heroku[api]: Release v7 created by [email protected]
2011-11-21T08:31:18+00:00 heroku[web.1]: State changed from crashed to created
2011-11-21T08:31:18+00:00 heroku[slugc]: Slug compilation finished
2011-11-21T08:31:20+00:00 heroku[web.1]: Starting process with command `sh script/jruby -S trinidad -p 17687`
2011-11-21T08:31:20+00:00 app[web.1]: Classpath is: :/app/etc:/.m2/repository/org/jruby/jruby-complete/1.6.3/jruby-complete-1.6.3.jar
2011-11-21T08:31:20+00:00 app[web.1]: Exception in thread "main" java.lang.NoClassDefFoundError: org/jruby/Main
2011-11-21T08:31:20+00:00 app[web.1]: Caused by: java.lang.ClassNotFoundException: org.jruby.Main
2011-11-21T08:31:20+00:00 app[web.1]:   at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
2011-11-21T08:31:20+00:00 app[web.1]:   at java.security.AccessController.doPrivileged(Native Method)
2011-11-21T08:31:20+00:00 app[web.1]:   at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
2011-11-21T08:31:20+00:00 app[web.1]:   at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
2011-11-21T08:31:20+00:00 app[web.1]:   at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
2011-11-21T08:31:20+00:00 app[web.1]:   at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
2011-11-21T08:31:20+00:00 app[web.1]: Could not find the main class: org.jruby.Main. Program will exit.
2011-11-21T08:31:20+00:00 heroku[web.1]: Process exited
2011-11-21T08:31:21+00:00 heroku[web.1]: State changed from starting to crashed
heroku jruby jrubyonrails
3个回答
2
投票

你有这条线:

Classpath is: :/app/etc:/.m2/repository/org/jruby/jruby-complete/1.6.3/jruby-complete-1.6.3.jar

您在某处找到了您的语言环境存储库的接缝,而Cooku的Heroku没有它。我不太喜欢包装,但这个参考可能会出现在这里吗?

检查所有参考,看看包装选项可能是一个良好的开端......


4
投票

从Bundler 1.2开始,你现在可以在你的specify the Ruby implementation and version中使用Gemfile。关于这一点的好处是Heroku将了解这些设置并为您的环境准备您的Heroku应用程序。

以此Gemfile为例:

source "https://rubygems.org"

ruby "1.9.3"

gem "rails"
gem "puma"

这有什么好处,默认情况下,Celadon Cedar使用Ruby 1.9.2。但是,当您在ruby "1.9.3"中指定Gemfile时,它实际上将为您的Heroku环境编译Ruby 1.9.3。

现在,如果要在Heroku环境中添加不同的Ruby实现,可以这样做:

source "https://rubygems.org"

ruby "1.9.3", :engine => "jruby", :engine_version => "1.7.0.preview1"

gem "rails"
gem "puma"

现在,它将在部署时为您的Heroku应用程序在Ruby 1.9模式下安装和使用JRuby 1.7.0.preview1。它甚至还会在Heroku环境变量中定义正确的JVM选项。

最重要的是,它配备了官方的Heroku buildpack,所以没有必要切换到第三方buildpack来让Herub上的JRuby / JVM运行。虽然我尚未得到它的工作,这个should also work with Rubinius,但我相信它目前被窃听。不管怎样,或者我做错了。

在我看来,这是一个非常棒且可扩展的功能。只需定义您在Gemfile中使用的Ruby实现/版本/模式以及其他依赖项,Heroku将确保准备好环境。


0
投票

以前在Heroku上获取JRuby和其他不支持的运行时的hacks现在已经过时了,因为第三方buildpacks的可用性:

https://devcenter.heroku.com/articles/buildpacks https://github.com/jruby/heroku-buildpack-jruby

© www.soinside.com 2019 - 2024. All rights reserved.