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命令可正常启动应用
排查方向与解决建议
排查容器环境的Bundler执行逻辑
bundler/setup.rb调用exit通常是因为检测到环境不满足(如依赖缺失、路径权限问题)。本地正常但容器失败,重点检查:- Tomcat运行用户对WAR包内
WEB-INF目录的读写权限,确保Bundler能访问Gemfile及依赖 - 容器中JRuby的
Gem.path配置,当前日志显示Gem.path仅指向JRuby内置路径,需确认WAR包内的本地依赖路径是否被正确添加
- Tomcat运行用户对WAR包内
调整Bundler初始化方式
在应用的boot.rb中捕获SystemExit异常,避免进程直接终止,同时输出详细错误信息:begin require 'bundler/setup' rescue SystemExit => e puts "Bundler初始化失败: #{e.message}" # 手动加载依赖配置 Bundler.load.setup end检查JRuby-Rack配置
确认WEB-INF/web.xml或Tomcat context配置中的JRuby参数:- 补充
rackup或rackup_path,指定正确的启动脚本路径 - 确保
rails.env与本地运行环境一致,避免环境差异导致的依赖加载问题
- 补充
重新打包WAR包
使用官方工具(如warble)重新打包,确保:- 所有依赖Gems被正确包含到WAR包内
- Bundler的配置文件(Gemfile、Gemfile.lock)完整且路径正确
添加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
相关产品推荐
相关产品推荐

