You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tomcat9部署JRuby(9.4.8.0) WAR遇RackInitializationException报错求助

部署JRuby WAR到Tomcat时RackInitializationException问题排查

问题概述

在Tomcat 9.0.58.0中部署JRuby(9.4.8.0)WAR文件时,初始化阶段部署失败,触发RackInitializationException,错误根源是bundler/setup.rb文件中的exit调用终止了进程。

环境信息

  • JRuby版本:9.4.8.0
  • Tomcat版本:9.0.58.0
  • Bundler版本:2.3.26
  • Ruby版本:3.1.4
  • 错误核心:bundler/setup.rb初始化时调用exit终止进程,导致部署失败

已执行排查步骤

  • 验证Gemfile与Gemfile.lock的兼容性和完整性
  • 检查JRuby环境变量及配置
  • 确认WAR包已包含所有必要依赖

错误日志详情

01-Aug-2024 13:27:43.786 INFO [main] org.apache.catalina.core.ApplicationContext.log An exception happened during JRuby-Rack startup
exit
--- System
jruby 9.4.8.0 (3.1.4) 2024-07-02 4d41e55a67 Java HotSpot(TM) 64-Bit Server VM 21.0.3+7-LTS-152 on 21.0.3+7-LTS-152 +jit [x86_64-linux]
Time: 2024-08-01 13:27:43 -0400
Server: Apache Tomcat/9.0.58 (Ubuntu)
jruby.home: uri:classloader://META-INF/jruby.home

--- Context Init Parameters:
jruby.max.modifiable.runtimes= = 1
jruby.max.runtimes = 1
jruby.min.modifiable.runtimes= = 1
jruby.min.runtimes = 1
modifiable.booter= = rails
modifiable.ignored= = ["jndi", "booter"]
modifiable.jndi= = 
public.modifiable.root= = /
rails.env = production
rails.modifiable.env= = production

--- Backtrace
SystemExit: exit
              exit at org/jruby/RubyKernel.java:921
              exit at org/jruby/RubyKernel.java:880
            <main> at uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/bundler/setup.rb:17
           require at org/jruby/RubyKernel.java:1184
           require at uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/rubygems/core_ext/kernel_require.rb:85
            <main> at /var/lib/tomcat9/webapps/ROOT/WEB-INF/config/boot.class:3
              load at org/jruby/RubyKernel.java:1220
            <main> at /var/lib/tomcat9/webapps/ROOT/WEB-INF/config/boot.rb:1
           require at org/jruby/RubyKernel.java:1184
           require at uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/rubygems/core_ext/kernel_require.rb:85
  load_environment at uri:classloader:/jruby/rack/rails/environment3.rb:23
  load_environment at uri:classloader:/jruby/rack/rails_booter.rb:83
            <main> at <script>:1

--- RubyGems
Gem.dir: uri:classloader:/META-INF/jruby.home/lib/ruby/gems/shared
Gem.path:
uri:classloader:/META-INF/jruby.home/lib/ruby/gems/shared
Activated gems:
  jar-dependencies-0.4.1
  did_you_mean-1.6.1
  stringio-3.0.8-java
  bundler-2.3.26

--- Bundler
Bundler.bundle_path: uri:classloader:/META-INF/jruby.home/lib/ruby/gems/shared
Bundler.root: /var/lib/tomcat9/webapps/ROOT/WEB-INF
Gemfile: /var/lib/tomcat9/webapps/ROOT/WEB-INF/Gemfile
Settings:
  gemfile = /var/lib/tomcat9/webapps/ROOT/WEB-INF/Gemfile
  without = []

--- JRuby-Rack Config
compat_version = 
default_logger = org.jruby.rack.logging.StandardOutLogger@3badd5e0
equals = <error: >
err = org.apache.tomcat.util.log.SystemLogHandler@35ed8c1
filter_adds_html = true
filter_verifies_resource = false
ignore_environment = false
initial_memory_buffer_size = 
initial_runtimes = 1
jms_connection_factory = 
jms_jndi_properties = 
logger = org.jruby.rack.logging.ServletContextLogger@66fc5cc7
logger_class_name = servlet_context
logger_name = jruby.rack
maximum_memory_buffer_size = 
maximum_runtimes = 1
num_initializer_threads = 
out = org.apache.tomcat.util.log.SystemLogHandler@20879a29
rackup = 
rackup_path = 
rewindable = true
runtime_arguments = 
runtime_environment = 
runtime_timeout_seconds = 
serial_initialization = false
servlet_context = org.apache.catalina.core.ApplicationContextFacade@3ceadc4f
throw_init_exception = false

01-Aug-2024 13:27:43.786 SEVERE [main] org.apache.catalina.core.ApplicationContext.log ERROR: initialization failed
    org.jruby.rack.RackInitializationException: exit
    from org/jruby/RubyKernel.java:921:in `exit'
    from org/jruby/RubyKernel.java:880:in `exit'
    from uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/bundler/setup.rb:17:in `<main>'
    from org/jruby/RubyKernel.java:1184:in `require'
    from uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/rubygems/core_ext/kernel_require.rb:85:in `require'
    from /var/lib/tomcat9/webapps/ROOT/WEB-INF/config/boot.class:3:in `<main>'
    from org/jruby/RubyKernel.java:1220:in `load'
    from /var/lib/tomcat9/webapps/ROOT/WEB-INF/config/boot.rb:1:in `<main>'
    from org/jruby/RubyKernel.java:1184:in `require'
    from uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/rubygems/core_ext/kernel_require.rb:85:in `require'
    from uri:classloader:/jruby/rack/rails/environment3.rb:23:in `load_environment'
    from uri:classloader:/jruby/rack/rails_booter.rb:83:in `load_environment'
    from <script>:1:in `<main>'

        at org.jruby.rack.RackInitializationException.wrap(RackInitializationException.java:29)
        at org.jruby.rack.RackApplicationFactoryDecorator.init(RackApplicationFactoryDecorator.java:104)
        at org.jruby.rack.RackServletContextListener.contextInitialized(RackServletContextListener.java:50)
        at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4768)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5230)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:726)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:698)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:696)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1024)
        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1911)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
        at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
        at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:123)
        at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:825)
        at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:475)
        at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1618)
        at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:319)
        at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
        at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:423)
        at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:366)
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:946)
        at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:835)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1396)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1386)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
        at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
        at java.base/java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:145)
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:919)
        at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:263)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at org.apache.catalina.core.StandardService.startInternal(StandardService.java:432)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:927)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:772)
        at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
        at java.base/java.lang.reflect.Method.invoke(Method.java:580)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:345)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:480)
    Caused by: org.jruby.exceptions.SystemExit: (SystemExit) exit
        at org.jruby.RubyKernel.exit(org/jruby/RubyKernel.java:921)
        at org.jruby.RubyKernel.exit(org/jruby/RubyKernel.java:880)
        at RUBY.<main>(uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/bundler/setup.rb:17)
        at org.jruby.RubyKernel.require(org/jruby/RubyKernel.java:1184)
        at RUBY.require(uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/rubygems/core_ext/kernel_require.rb:85)
        at RUBY.<main>(/var/lib/tomcat9/webapps/ROOT/WEB-INF/config/boot.class:3)
        at org.jruby.RubyKernel.load(org/jruby/RubyKernel.java:1220)
        at RUBY.<main>(/var/lib/tomcat9/webapps/ROOT/WEB-INF/config/boot.rb:1)
        at org.jruby.RubyKernel.require(org/jruby/RubyKernel.java:1184)
        at RUBY.require(uri:classloader:/META-INF/jruby.home/lib/ruby/stdlib/rubygems/core_ext/kernel_require.rb:85)
        at RUBY.load_environment(uri:classloader:/jruby/rack/rails/environment3.rb:23)
        at RUBY.load_environment(uri:classloader:/jruby/rack/rails_booter.rb:83)
        at RUBY.<main>(<script>:1)

关键备注

  • 本地使用rails命令可正常启动应用

排查方向与解决建议

  1. 排查容器环境的Bundler执行逻辑
    bundler/setup.rb调用exit通常是因为检测到环境不满足(如依赖缺失、路径权限问题)。本地正常但容器失败,重点检查:

    • Tomcat运行用户对WAR包内WEB-INF目录的读写权限,确保Bundler能访问Gemfile及依赖
    • 容器中JRuby的Gem.path配置,当前日志显示Gem.path仅指向JRuby内置路径,需确认WAR包内的本地依赖路径是否被正确添加
  2. 调整Bundler初始化方式
    在应用的boot.rb中捕获SystemExit异常,避免进程直接终止,同时输出详细错误信息:

    begin
      require 'bundler/setup'
    rescue SystemExit => e
      puts "Bundler初始化失败: #{e.message}"
      # 手动加载依赖配置
      Bundler.load.setup
    end
    
  3. 检查JRuby-Rack配置
    确认WEB-INF/web.xml或Tomcat context配置中的JRuby参数:

    • 补充rackup或rackup_path,指定正确的启动脚本路径
    • 确保rails.env与本地运行环境一致,避免环境差异导致的依赖加载问题
  4. 重新打包WAR包
    使用官方工具(如warble)重新打包,确保:

    • 所有依赖Gems被正确包含到WAR包内
    • Bundler的配置文件(Gemfile、Gemfile.lock)完整且路径正确
  5. 添加Bundler调试输出
    修改boot.rb,在加载Bundler前添加调试代码,排查具体错误:

    ENV['BUNDLE_DEBUG'] = '1'
    require 'bundler'
    puts "Bundler根目录: #{Bundler.root}"
    puts "Gemfile路径: #{Bundler.default_gemfile}"
    puts "缺失的Gems: #{Bundler.missing_gems}"
    

内容的提问来源于stack exchange,提问作者taarz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 21:24:52