There is a project which was built with Rails 8 + SolidCache + SolidQueue. Recently I switched it to Rails 7.2 (jruby 10.0.2.0 (3.4.2) 2025-08-07 cba6031bd0 OpenJDK 64-Bit Server VM 21.0.9+15-LTS on 21.0.9+15-LTS +indy +jit [x86_64-linux] ).

Here is some my note.

  1. Modify Gemfile && bundle install

# gem "rails", "~> 8.1.1"
gem "rails", "~> 7.2.0"

# gem "pg"
gem "activerecord-jdbcpostgresql-adapter", "~> 72.0", :platform => :jruby

# gem "solid_queue"
# good_job is a background job library using postgresql.
gem "good_job", "~> 4.13.1"

gem "warbler", "~> 2.1.0"

  1. Replace C dependencies (if exist)

Replace C libraries(like “pg”) with java libraries. Put jars in lib/java

  1. Generate warble configuration
jruby -S warble config

config/warble.rb

Warbler::Config.new do |config|
  config.features = %w(runnable)
  config.dirs = %w(app config db lib log script vendor tmp)
  config.includes = FileList["config.ru", "Rakefile"]
  config.java_libs += FileList["lib/java/*.jar"]
  config.gems["rails"] = "7.2.3"
  config.jar_extension = "jar"
end

background job rake task: lib/tasks/good_job.rake

namespace :job do
  desc "start good_job"
  task start: :environment do
    $stdout.sync = true
    $stderr.sync = true

    stdout_logger = ActiveSupport::Logger.new(STDOUT)
    log_level = (ENV["RAILS_LOG_LEVEL"] || "INFO").upcase
    stdout_logger.level = ActiveSupport::Logger.const_get(log_level)
    stdout_logger.formatter = ActiveSupport::Logger::Formatter.new
    Rails.logger = stdout_logger
    ActiveRecord::Base.logger = stdout_logger
    GoodJob.logger = stdout_logger
    GoodJob::CLI.start([])
  end
end
  1. Pack
jruby -S warble
  1. Run

# migration
java -jar app.jar -S rails db:migrate

# web
java -jar app.jar -S rails s

# job
java -jar app.jar -S rake job:start