Nano Hash - криптовалюты, майнинг, программирование

Добавьте JavaFX (из JDK8) в sbt (используя игровую среду)

Цель состоит в том, чтобы в отдельном приложении Play Framework (2.2) было открыто дополнительное окно состояния, содержащее некоторые элементы javafx (javafx-8).

Поскольку классы JavaFX теперь находятся в пути к классам среды выполнения по умолчанию для реализации Oracle Java 8 с использованием javafx. * в моих классах и компиляции с помощью sbt, должно быть все в порядке.

Однако sbt не может найти эти классы и завершает работу с

play.api.UnexpectedException: Unexpected exception[NoClassDefFoundError: javafx/application/Application]

при выполнении

..\path-to-play-framework-2.2\play project run

Лучшим способом решения этой проблемы является изменение файла build.sbt в каталоге проекта. Что я могу сделать, чтобы добавить отсутствующий путь (класса)?


Ответы:


1

К сожалению, JavaFX не так легко связывается со сборкой sbt. Вам нужно установить переменную среды JAVA_HOME и внести изменения в файл сборки.

Здесь У меня есть репозиторий, в котором это настроено. Важный момент, если вы используете сборку sbt, а не сборку scala, заключается в следующем:

unmanagedJars in Compile += Attributed.blank(
  file(System.getenv("JAVA_HOME") + "/jre/lib/jfxrt.jar")),

fork in run := true

Причина этого в том, что jfxrt.jar — это архив, содержащий среду выполнения JavaFX, и по умолчанию он не включен в путь к классам проекта sbt.

17.04.2014
  • Я предлагаю изменить путь к jfxrt.jar для JDK8. Он доступен в /jre/lib/ext. Есть ли еще способ избежать установки окружения JAVA_HOME? 17.04.2014
  • Извините, я не заметил, что вы используете JDK8. В любом случае концепция должна быть такой же, вам нужно найти файл jfxrt.jar. Окружение JAVA_HOME не является обязательным, но это, вероятно, наиболее часто используемый способ получить путь jre в системе. Вы можете попробовать другие подходы (например, скопировать файл jfxrt.jar в соответствующую папку в вашем проекте, указать путь jre по конфигурации или попытаться каким-то образом обнаружить его и т. д.), важно то, что sbt знает, где находится этот jar и что команда запуска разветвляется (поскольку в противном случае она не увидит изменения, которые вы вносите в путь к классам). 17.04.2014
  • Несмотря на то, что мне пришлось изменить этот код и добавить запасной вариант на случай, если JDK/JRE не будет найден, я отмечу это как ответ, потому что он дал мне правильное направление. 18.04.2014
  • @AldoStracquadanio, не могли бы вы объяснить этот ответ немного подробнее? Я не вижу никаких изменений, когда добавляю запись unmanagedJars, и она работает только с включенной вилкой. К сожалению, разветвление также ломает кучу вещей, таких как установка свойств в cli и отладчик от Intellij. 17.09.2015
  • @OwenNelson Я не уверен, я не делал никаких JavaFX в прошлом году, и у меня нет проекта, чтобы попробовать это (мой предыдущий ответ был основан на моем опыте работы с Java 7). Я где-то читал, что, начиная с Java 8, вам не нужно добавлять jar JavaFX в путь к классам, поскольку он использует механизм расширения, поэтому это может объяснить, почему вам не нужна запись unmanagedJars. Это не объясняет, почему вам нужен бит fork, извините за это. 17.09.2015
  • @AldoStracquadanio спасибо. После пары дней возни, похоже, это может быть локализовано для определенных версий обновления jdk. Добавление jar в unmanagedJars без вилки у меня работает на jdk 8u60, но не работает на 8u40. Однако переход на u60 имел свои особенности. Тем не менее, моя проблема была решена! 18.09.2015
  • Я на 8u51 и могу подтвердить, что у меня все та же проблема. Я обновлю до новейшей версии Java 8, чтобы увидеть, имеет ли это значение. 07.11.2015
  • У меня все работает после обновления до 8u65. Но это не сработало сразу после обновления. Я запускаю приложение из IntelliJ, поэтому мне нужно было убедиться, что у IDE есть доступ к System.env("JAVA_HOME"), которого изначально не было. В моем случае мне нужно было добавить эту переменную среды в /env/environment, чтобы она была доступна для IntelliJ. 07.11.2015

  • 2

    Другой способ - установить Classpath для sbt. Это можно сделать на машинах, которые не могут разрешить JavaFX.

    SBT_OPTS="-Xbootclasspath/p:/usr/share/java/openjfx/jre/lib/ext/jfxrt.jar"
    
    06.11.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..