Torquebox LoadError - 没有要加载的文件 - torquebox / Service_registry

时间:2015-07-12 04:30:07

标签: ssl jboss jrubyonrails torquebox

已安装的torquebox-server gem。

$torquebox run没问题。程序在Apache代理Torquebox上运行正常,通过:80和SSL AJP:8009。

在这里它击中了粉丝: ' sudo service torquebox start'使用UpStart可以很好地处理一个例外。浏览器中没有错误。只是一个空白的白页。我正在使用chruby。这是扭矩箱日志:

  

无法要求文件:torquebox / service_registry:   org.jruby.exceptions.RaiseException:(LoadError)没有要加载的此类文件    - org.jruby.RubyKernel.require中的torquebox / service_registry(org / jruby / RubyKernel.java:1071)   [jruby.jar:] at   RUBY.require(/home/klyde/.rubies/jruby-1.7.19/lib/ruby/shared/rubygems/core_ext/kernel_require.rb:54)   在RUBY。(根)(:1)

当然,上面的目录和文件存在,正如torquebox自己的日志所示。

看起来

torquebox run执行得很好,因为jruby-1.7.19(与jruby-1.7.19上的Torquebox' sv 3.1.2运行时相同),宝石和程序都在我的下面Ubuntu用户' klyde'。但是这个命令仅用于开发/测试。作为一项服务运行时,Torquebox正在侧重于扭矩箱'用户,拥有自己的bashrc。是的,Torquebox需要自己的用户!因此,在两个用户klyde和torquebox下,bashrc包含相同的内容:

export TORQUEBOX_HOME=/home/klyde/.gem/jruby/1.9.3/gems/torquebox-server-3.1.2-java
export TORQUEBOX_HOME_RAKE_SUPPORT=/home/klyde/.gem/jruby/1.9.3/gems/torquebox-rake-support-3.1.2
export TORQUEBOX_SERVER=/home/klyde/.gem/jruby/1.9.3/gems/torquebox-server-3.1.2-java
export JBOSS_HOME=$TORQUEBOX_SERVER/jboss
export JRUBY_HOME=/home/klyde/.rubies/jruby-1.7.19
export PATH=$JRUBY_HOME/bin:$PATH

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export PATH=$PATH:$JAVA_HOME/bin

我已经读过Torquebox通过它自己的jruby运行时版本预测路径等,而不是chruby(或rvm,rbenv)可能做的事情。本着这种精神,我已经将扭矩盒用户添加到克莱德组。我已经在我的klyde .gem目录中提高了对几个文件的权限,提供了快速而又脏的方法。我甚至尝试过chown -R torquebox:torquebox /home/klyde/.rubies。那里没有运气)

问题:我必须重新安装所有程序,包括程序,在torquebox用户下,好像那样可行,无论如何?或者是否有更优雅(理智)的方法?

1 个答案:

答案 0 :(得分:0)

解决方案:

解决。我会回答我自己的问题。我记得这是一堆提示。

事情的核心似乎是宝石路径的问题。 See this comment. And this.而Ruby经理通常喜欢将红宝石中的宝石分开,例如。 〜/ .gem~ / .rubies,当你看看Torquebox随附的本地JRuby时,你会发现Torquebox在JRuby自己的子文件夹中收集了宝石:

/opt/torquebox/torquebox-3.1.2/jruby/lib/ruby/gems/shared/gems /

作为证明,您将看到Torquebox二进制下载包含gem套件'torquebox-server'。

我曾经使用过chruby并且跑了:

$ jruby -S gem install torquebox-server

和RVM一样,使用'torquebox run'工作得很好。但是为了利用类似生产的命令 - 'sudo service torquebox start' - 我发现有必要下载二进制文件并安装在/ opt下,以便按照'upstart'的说明进行操作。

Warbler为JBoss准备一个.war文件。但是,包装JBoss的Torquebox提供了自己的代码,旨在取代.war的需求。但是,'torquebox run'或'sudo service torquebox start'都称为捆绑器。那么如何通过捆绑器放置宝石似乎很重要。将gems复制/粘贴到本机JRuby(/opt/torquebox/torquebox-3.1.2/jruby ...)可能不起作用(正如我发现的那样)。

假设您(明智地)希望在〜/下使用您自己的JRuby,并且在设置环境变量后(如我所示),那么从终端开始,您将希望看到如下内容:

$ jruby -S gem env
RubyGems Environment:
- RUBYGEMS VERSION: 2.4.5
- RUBY VERSION: 1.9.3 (2015-01-29 patchlevel 551) [java]
- INSTALLATION DIRECTORY: /home/klyde/.rubies/jruby-1.7.19/lib/ruby/gems/shared
- RUBY EXECUTABLE: /home/klyde/.rubies/jruby-1.7.19/bin/jruby
- EXECUTABLE DIRECTORY: /home/klyde/.rubies/jruby-1.7.19/bin
- SPEC CACHE DIRECTORY: /home/klyde/.gem/specs
- SYSTEM CONFIGURATION DIRECTORY: /home/klyde/.rubies/jruby-1.7.19/etc

- GEM PATHS:
- /home/klyde/.rubies/jruby-1.7.19/lib/ruby/gems/shared

注意.rubies,不是.gem。

如果启用了RVM或rbenv或chruby,它将尝试控制GEM_HOME。必须禁用此功能。一个建议,请查看/etc/profile.d /

从任何目录中,GEM_HOME应该为空,或者至少指向JRuby子文件夹中的路径。

作为测试:

$ echo $GEM_HOME
(here we can have a blank line)

在〜/ .gemrc

install: --no-ri --no-rdoc
update:  --no-ri --no-rdoc 

gemhome: /home/klyde/.rubies/jruby-1.7.19/lib/ruby/gems/shared
gempath: /home/klyde/.rubies/jruby-1.7.19/lib/ruby/gems/shared

虽然上述手动编辑可行,但多么不文明!)特别是在开发中,使用管理器切换每个程序的红宝石很方便。为了获得两全其美,我将以chruby为例。

ruby​​ / jruby中宝石的自然目录实际上在它自己的子文件夹中。这是GEM_ROOT。并且GEM_ROOT保持不变。 chruby根据它在GEM_ROOT中找到的内容改变或人为创建GEM_HOME和GEM_PATH。然后它继续在〜/ .gem下归档宝石。观察:

$ echo $GEM_ROOT    
/home/klyde/.rubies/ruby-2.2.2/lib/ruby/gems/2.2.0

$ echo $GEM_HOME
/home/klyde/.gem/ruby/2.2.2

$ echo $GEM_PATH
/home/klyde/.gem/ruby/2.2.2:/home/clyde/.rubies/ruby-2.2.2/lib/ruby/gems/2.2.0

对于jruby ......

$ echo $GEM_ROOT    
/home/klyde/.rubies/jruby-1.7.19/lib/ruby/gems/shared

$ echo $GEM_HOME
/home/klyde/.gem/jruby/1.9.3

$ echo $GEM_PATH
/home/klyde/.gem/jruby/1.9.3:/home/clyde/.rubies/jruby-1.7.19/lib/ruby/gems/shared

要在chruby中覆盖它:

/usr/local/share/chruby/chruby.sh

function chruby_use()
{
    ....
    if (( $UID != 0 )); then
        # export GEM_HOME="$HOME/.gem/$RUBY_ENGINE/$RUBY_VERSION"
        # export GEM_PATH="$GEM_HOME${GEM_ROOT:+:$GEM_ROOT}${GEM_PATH:+:$GEM_PATH}"
        # export PATH="$GEM_HOME/bin${GEM_ROOT:+:$GEM_ROOT/bin}:$PATH"

        export GEM_HOME="$GEM_ROOT"
        export GEM_PATH="$GEM_ROOT"
        export PATH=$GEM_HOME/bin:$PATH
        export PATH=$GEM_PATH/bin:$PATH
    fi
}

每个ruby / jruby都成为它自己的宝石。如果你不反对,那么chruby中的这个快速编辑将解决Torquebox严格引用宝石的问题。你仍然可以像往常一样在程序之间使用经理。重新编辑chruby.sh,您可以将管理器返回到其默认行为。就这么简单!)

知道这个涉及GEM_ROOT的小技巧,也许可以在RVM和rbenv中应用相同的补救措施。

  1. 安装Ruby和JRuby:我使用chruby或'ruby-install',并在〜/下安装rubies。使用其中任何一种,红宝石/ jrubies进入〜/ .rubies。

  2. 安装Torquebox二进制文件:在Ubuntu 14.04上,我严格遵循Torquebox手册21.1.2 Torquebox安装。

  3. Env vars:如果使用上述GEM_ROOT技巧,可能会忽略RUBY_HOME和JRUBY_HOME。

  4. /etc/profile.d/torquebox.sh:

    export TORQUEBOX_HOME=/opt/torquebox/current
    export JBOSS_HOME=$TORQUEBOX_HOME/jboss
    export JRUBY_HOME=/home/klyde/jruby-1.7.19
    PATH=$JBOSS_HOME/bin:$JRUBY_HOME/bin:$PATH
    

    我也编辑了...... 的/ etc /简档

    export TORQUEBOX_HOME=/opt/torquebox/current
    export JBOSS_HOME=$TORQUEBOX_HOME/jboss
    export JRUBY_HOME=/home/klyde/jruby-1.7.19
    
    PATH=$JBOSS_HOME/bin:$JRUBY_HOME/bin:$PATH
    export RUBY_HOME=/home/klyde/ruby-2.2.2
    
    export PATH=$RUBY_HOME/bin:$PATH
    export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
    export PATH=$PATH:$JAVA_HOME/bin
    
    1. Sym链接或移动torquebox.conf的副本:

      /opt/torquebox/torquebox-3.1.2/share/init/torquebox.conf

      成:

      /etc/init/torquebox.conf

    2. 然后编辑一行。 JBoss需要一个明确的开启按钮,standalone.sh:

      /opt/torquebox/current/jboss/bin/standalone.sh >> /var/log/torquebox/torquebox.log 2>&1
      
      1. 使用rake upstart启用'sudo service torquebox start',Torquebox手册18.4服务器控制。

      2. 如果使用nokogiri:

      3. 我用1.6.1取代了nokogiri 1.6.6.2。对许多人来说,这种变化是必要的。谷歌更多信息。它出现在宝石列表中,如1.6.1-java,以及我的Gemfile(gem'nokogiri','1.6.1-java')。您可能必须删除(删除)Gemfile.lock的内容,以及直接编辑它 - nokogiri(1.6.1-java)。 '$ jruby -S bundle'在直接编辑后不会覆盖Gemfile.lock,“捆绑安装或更新”也是如此:

        $jruby -S gem install nokogiri 1.6.1
        

        此网站通常使用SSL。为了那些好奇,对我来说,我应该忘记,这是我的Apache代理Torquebox的样子:

        /etc/apache2/sites-available/example.conf:

        <VirtualHost example.com:80>
            ServerAdmin webmaster@localhost
            ServerName example.com
            Redirect / https://example.com
        </VirtualHost>
        

        /etc/apache2/sites-available/example-ssl.conf:

        <IfModule mod_ssl.c>
            <VirtualHost _default_:443>
        
                SSLEngine on
                SSLCertificateFile   /etc/apache2/ssl/certs/16746xxxxxbbac.crt
                SSLCertificateChainFile /etc/apache2/ssl/certs/sf_bundle-g2-g1.crt
                SSLCertificateKeyFile /etc/apache2/ssl/private/ks.key
        
                ServerAdmin webmaster@localhost
                ServerName example.com
                ServerAlias example.com
                DocumentRoot /home/klyde/ror/exampleprog/public
        
                ProxyRequests Off
                ProxyPreserveHost On
                ProxyPassReverseCookiePath / /
                ProxyPass /errors/ !
                ProxyPass / ajp://localhost:8009/
                ProxyPassReverse / ajp://localhost:8009/
        
                <Proxy *>
                    AddDefaultCharset off
                    Require all granted
                    Order allow,deny
                    Allow from all
                </Proxy>
        
                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined
        
                BrowserMatch ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
                SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
        
            </VirtualHost>
        </IfModule>
        

        /opt/torquebox/torquebox-3.1.2/jboss/standalone/configuration

        <subsystem xmlns='urn:jboss:domain:web:1.4' default-virtual-server='default-host' native='false'>
            <connector name='http' protocol='HTTP/1.1' scheme='http' socket-binding='http'/>
            <connector name="ajp" protocol="AJP/1.3" scheme="http" socket-binding='ajp' />
            <virtual-server name='default-host'>
                <alias name='localhost'/>
                <alias name='example.com'/>
            </virtual-server>
        </subsystem>
        

        必要时修复权限。以用户'扭矩盒'运行可以克服一些首先碰到的问题。