我最近一直在用 JRuby 开发应用程序并且非常喜欢它,但是当我的项目包含外部 Java 库时,我在将我的项目打包成 JAR 文件时遇到了困难。如果项目不依赖于任何外部 Java 库 JAR 文件,我不会遇到任何问题。
下面是一个示例应用程序。./bin/my_proj
运行可执行文件时,此代码运行良好。但是,当我将它打包成 JAR 文件时,无法加载外部 Java 库,因为它在 CLASSPATH 中找不到。
当我解压缩应用程序的 JAR 文件时,我可以看到它包含了我的所有代码以及vendor
包含外部 Java 库的目录。所以,一切都在它应该在的地方。
lib/my_proj/application.rb
java_import 'com.somecompany.somejavalibrary.SomeJavaLibraryClass'
module MyProj
class Application < SomeJavaLibraryClass
# Some code implementing SomeJavaLibraryClass
end
end
lib/my_proj.rb
require 'pathname'
module MyProj
def root
Pathname.new(__FILE__).join('..', '..').expand_path
end
def start
setup_environment
Application.new
end
def setup_environment
@setup ||= false
unless @setup
@setup = true
require 'java'
$CLASSPATH << root.join('vendor').to_s # Setup Java CLASSPATH
$LOAD_PATH << root.join('lib').to_s # Setup Ruby LOAD_PATH
require 'some_java_library' # Load the external Java library from it's JAR
require 'my_proj/application'
end
end
extend self
end
bin/my_proj
#!/usr/bin/env ruby
$:.unshift File.expand_path( File.join('..', '..', 'lib'), __FILE__ )
require 'my_proj'
MyProj.start
配置/warble.rb
Warbler::Config.new do |config|
config.features = %w(gemjar compiled)
config.autodeploy_dir = 'pkg'
config.dirs = %w(assets bin config lib)
config.java_libs += FileList['vendor/*.jar']
end
供应商/some_java_library.jar
# This is the external Java library