将Sinatra app打包成一个JAR文件?

时间:2010-07-05 07:49:14

标签: ruby jruby sinatra

我有一个明显(愚蠢)的简单问题:

使用JRuby可以部署单个文件Sinatra应用程序吗?

我的意思是:我的Sinatra应用程序将所有需要的宝石展开到一些./vendor/lib目录中,我想将整个应用程序部署为单个jar文件,以便在部署机器上运行:

$ java jar my_app.jar

我唯一拥有的就是Java。

这可能吗?如果是这样,有一种简单的方法可以实现这一目标吗?

TIA

3 个答案:

答案 0 :(得分:4)

您可以尝试使用Warbler。从版本1.1开始,Warbler支持将war文件设置为“可执行文件”。有关详细信息,请参阅the documentation

基本上,安装warbler并尝试在Sinatra应用程序上运行它。如果你有一个config.ru,一切都应该工作。

$ jruby -S gem install warbler
$ jruby -S warble executable war
$ java -jar my_app.war

答案 1 :(得分:2)

实际上这很容易。假设您可以使用命令在某个目录下冻结所有内容来运行您的应用程序:

ruby myapp.rb

现在您需要将此脚本放在应用程序下的lib目录中,并编写一个将加载脚本的java包装器。执行此操作的示例代码:

package livesync;

import org.jruby.Ruby;
import org.jruby.RubyRuntimeAdapter;
import org.jruby.javasupport.JavaEmbedUtils;  
import java.util.ArrayList;

public class LiveSyncRunner {
    public static void main(String[] args) {
        String[] jrubyArgs = new String[3 + args.length]; 
        jrubyArgs[0] = "-e";
        jrubyArgs[1] = "require 'livesync/livesync_wrapper'";
        jrubyArgs[2] = "livesync";
        for (int i = 0; i < args.length; ++i) {
            jrubyArgs[i + 3] = args[i];
        }
        org.jruby.Main.main(jrubyArgs);
    }
}

如果上面我运行的脚本是在lib / livesync_wrapper.rb

现在您只需要一个正确的build.xml文件(放在根目录中) 我的build.xml:

<?xml version="1.0" encoding="UTF-8"?>

<project basedir="." default="dist" name="Juggernaut">
  <description>Combine Ruby and Java source with the jruby-complete jar</description>
  <target name="dist" description="Create the deliverable jar">
    <taskdef name="jarjar" 
             classname="com.tonicsystems.jarjar.JarJarTask" 
             classpath="vendor/jarjar-1.0rc7.jar"/>
    <mkdir dir="pkg"/>
    <jarjar destfile="pkg/livesync.jar">
      <manifest>
        <attribute name="Main-Class" value="livesync.LiveSyncRunner"/>
      </manifest>
      <fileset dir="classes"/>
      <zipfileset dir="vendor/gems" prefix="vendor/gems"/>
      <zipfileset src="vendor/jruby-complete-1.1.2.jar" />
    </jarjar>
  </target>
</project>

你可能需要改变的地方是:

  • 主要类的名称 - 这必须 你的java包装器的名字 (加载ruby脚本)
  • 添加/删除一些zipfilesets

您还需要在供应商目录中包含文件jruby-complete-1.1.2.jar和jarjar-1.0rc7.jar。你应该毫无问题地将它们谷歌出来。

执行此操作后,您只需转到根目录并运行ant。在此之后,您可以使用

运行脚本
java -jar pkg/livesync.jar args1 agrs2 ...

希望这有帮助!

答案 2 :(得分:0)

从jruby-complete jar文件开始;解压罐子。然后,您可以将宝石安装到爆炸的罐子里。

META-INF目录中的jruby.home是&#34;通常&#34; jruby安装位于。您可以在该目录中使用gem。

接下来,在jruby.home目录中,创建一个目录,让我们将其命名为app并将您的应用程序放入其中。

接下来,您需要创建一个脚本,以便在启动应用程序的bin目录中运行。

TEST 并确保一切正常。

然后将所有内容拉回来,创建一个app.jar等文件。

最后,要运行:

  java -jar app.jar -S YOUR_SCRIPT

- 或 -       清除清单并创建一个功能类似于脚本的java类。