Упаковать приложение Sinatra в один файл JAR? - PullRequest
3 голосов
/ 05 июля 2010

У меня явно (глупый) простой вопрос:

Можно ли с помощью JRuby развернуть однофайловое приложение Sinatra?

Я имею в виду: у меня есть приложение Sinatra со всеминеобходимые драгоценные камни были взорваны в какой-то каталог ./vendor/lib, и я хотел бы развернуть все приложение в виде одного файла JAR для запуска на компьютере развертывания:

$ java jar my_app.jar

, где единственное, что у меня есть, это Java.

Возможно ли это?И если так, есть простой способ сделать это?

TIA

Ответы [ 3 ]

4 голосов
/ 07 июля 2010

Вы можете попробовать использовать Warbler для этого. Начиная с версии 1.1, Warbler поддерживает создание военного файла "исполняемым". Подробнее см. в документации .

По сути, установите warbler и попробуйте запустить его в приложении Sinatra. Если у вас есть config.ru, все должно работать.

$ jruby -S gem install warbler
$ jruby -S warble executable war
$ java -jar my_app.war
2 голосов
/ 05 июля 2010

Это довольно легко на самом деле. Предположим, что вы можете запустить ваше приложение со всем замороженным в некотором каталоге с помощью команды:

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 / aliveync_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>

Вещи, которые вам, возможно, придется изменить здесь:

  • название Main-Class - это должно имя твоей Java-оболочки (загрузка скрипта ruby)
  • добавить / удалить некоторые zipfilesets

Вам также необходимо включить файлы jruby-complete-1.1.2.jar и jarjar-1.0rc7.jar в каталог поставщика. Вы должны погуглить их без проблем.

После этого вы просто идете в корневой каталог и запускаете ant. После этого вы можете запустить свой скрипт с

java -jar pkg/livesync.jar args1 agrs2 ...

Надеюсь, это поможет!

0 голосов
/ 17 сентября 2014

Начиная с jarby-полного файла jar; Разархивируйте банку. Затем вы можете установить свои драгоценные камни в взорванную банку.

jruby.home в каталоге META-INF - это место, где находится «обычная» установка jruby. Вы можете использовать драгоценный камень в этом каталоге.

Затем в каталоге jruby.home создайте каталог, назовем его app и поместим в него ваше приложение.

Затем вам нужно будет создать скрипт для запуска в каталоге bin, который запускает ваше приложение.

ТЕСТ и убедитесь, что все работает.

Затем архивируйте все обратно, создавая файл, такой как app.jar.

Наконец, запустить:

  java -jar app.jar -S YOUR_SCRIPT

-или- разберитесь с манифестом и создайте Java-класс, который функционально похож на скрипт.

...