Как развернуть проект Scala из Eclipse?

У меня есть проект Scala в Eclipse, который мне нужно упаковать, чтобы я мог развернуть его на сервере. Он основан на Jetty, но работает как отдельное приложение. Он содержит классы Scala, классы Java и ряд сторонних баннеров.

Я предположил, что в плагине Scala Eclipse будет какой-то вариант развертывания, но я нарисовал пробел.

Каков самый простой способ упаковать проект Scala в исполняемый файл, чтобы его можно было развернуть?

Любая помощь очень ценится. Приветствия.

Ответ 1

После большого количества проб и ошибок, это лучший метод, который я нашел для упаковки приложения Scala для распространения:

Сначала создайте класс Java как основную точку входа для приложения, как описано Gary Boon. Это позволяет запускать приложение из JAR с помощью команды java. Я обнаружил, что запуск класса Scala с помощью java-команды проблематичен, даже если у вас есть Scala libs в исходном пути:

import java.util.ArrayList;

import scala.tools.nsc.MainGenericRunner;


public class Main { 
    public static void main (String[] args) {
        ArrayList<String> argList = new ArrayList<String>();
        argList.add("fully.qualified.ClassName");
        for (String s : args) {
            argList.add(s);
        }
        MainGenericRunner.main(argList.toArray(new String[0]));
    }
}

Теперь вы можете использовать команду Eclipse Export Runnable JAR для упаковки всех ваших классов и библиотек в файл JAR. Установите основной класс JAR в точку входа Java. Вы также можете сохранить настройки вывода, созданные Eclipse, в качестве файла сборки ANT, чтобы вы могли вносить коррективы. Использование ANT для создания JAR с точкой входа Java дало наилучшие результаты. Вы также можете упаковать другие JAR-зависимости таким образом, что делает его намного проще при попытке запустить JAR на другом хосте. Как минимум вам понадобится библиотека Scala и инструменты Scala JAR.

<zipfileset excludes="META-INF/*.SF" src="${scala.lib.jar}"/>
<zipfileset excludes="META-INF/*.SF" src="${scala.tools.jar}"/>

Если вы используете встроенный Jetty, как и я, вы можете запустить сервер как процесс Daemon, используя следующую команду (source)

nohup java -jar MyJettyServer.jar < /dev/null >> server.log 2>> server_error.log &

Это запускает программу как фоновый процесс, который не зависит от текущего пользовательского сеанса, поэтому процесс будет продолжаться после выхода из системы хоста.

Ответ 2

Sbt поддерживает развертывание веб-приложений. Вы можете, конечно, использовать Ant, Maven или другие инструменты сборки для упаковки развертывания WAR для Jetty. Вы можете запустить sbt в качестве внешнего инструмента из eclipse.

Sbt, похоже, поддерживает конфигурацию JRebel. После запуска вы должны иметь возможность изменять ресурсы и классы из затмения без дополнительного этапа развертывания войны.

Ответ 3

Я делаю точно то же самое: создайте код на стороне сервера, который работает внутри простого приложения, которое включает Jetty. В настоящее время это в основном код Scala, он был Java. В любом случае я просто запускаю код Java из одного или нескольких файлов JAR.

В обоих случаях я использую Ant для развертывания. Мои проекты Scala иногда используют существующие Java-классы. Для этого я добавляю цель Ant, которая компилирует классы Java в JAR, который впоследствии используется как в моем плагине Eclipse Scala, так и в Ant целях сборки сборки.

Ответ 4

Простым решением является создание небольшого класса Java, который вызывает основной метод программы Scala. Затем можно использовать стандартный экспорт контейнера eclipse.

public class Main { 
    public static void main (String[] args) {
        MyScalaObjectWithMainMethod.main(args);
    }
}

Важно: Перед экспортом убедитесь, что scala -library.jar находится в пути сборки в качестве внешнего jar (а не как библиотека), чтобы он экспортироваться вместе с вашей банкой.

Я нашел это решение в качестве комментария Jesper Villadsen на странице страницы Гэри Бун (кто предлагает несколько сложный подход). Хотя у меня были проблемы с запуском решения Gary, это решение Jesper отлично работает для меня. Спасибо!

Ответ 5

Вы используете способность затмений создавать WAR файл, как и для Java. Или файл jar, как и для Java. Потому что во время выполнения это java. Больше не нужно магии.