Запуск программы scala с помощью основной функции java tool/scala

У меня есть приложение scala с object, которое реализует черту def main(args:Array[String]): Unit. Я использую плагин sbtAssembly для создания толстой банки, и я могу запустить его из консоли, используя:

scala myjar.jar

Однако я хочу передать это коллегам, у которых не установлена ​​scala, а только jdk/jre. Итак, я попытался запустить это с помощью java, однако он терпит неудачу:

java -jar myjar.jar
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.NoClassDefFoundError: scala/collection/Seq
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
    at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
    at java.lang.Class.getMethod0(Class.java:3018)
    at java.lang.Class.getMethod(Class.java:1784)
    at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526)
Caused by: java.lang.ClassNotFoundException: scala.collection.Seq
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 7 more

Что мне нужно сделать, чтобы запустить его с помощью java? Это вообще возможно?

Как настраивается плагин сборки? Исключает ли он стандартную библиотеку Scala (что-то вроде github.com/sbt/sbt-assembly#исключение-скала-библиотека-баночки)? Можешь проверить, есть ли scala/collection/Seq.class в твоей жирной банке?

Alexey Romanov 09.04.2019 12:18

Идеально! Это действительно недостающая часть, она была установлена ​​на includeScala = false. После перехода на true я смог запустить его с помощью java -jar myjar.jar. Если вы добавите эту подсказку в качестве ответа, я могу принять ее.

user826955 09.04.2019 13:59
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
200
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы запустить банку, используя только java -jar без указания пути к классам, она должна включать все зависимости, включая стандартную библиотеку Scala (и из сообщения об ошибке мы видим, чего не хватает). По умолчанию sbt-assembly включает его, но его можно настроить исключить это, и это то, что делает ваша сборка. Просто удалите includeScala = false (или установите его на true).

Другие вопросы по теме