Невозможно открыть ДИСПЛЕЙ с помощью JavaFX на сервере Ubuntu ⇐ JAVA
-
Anonymous
Невозможно открыть ДИСПЛЕЙ с помощью JavaFX на сервере Ubuntu
У меня есть простое приложение, которое генерирует PNG-диаграмму на основе JavaFX. Приложение не запускается на компьютере без дисплея, за следующим исключением: мне не нужно визуализировать или отображать содержимое на консоли, нужно просто создать изображение.
"main" java.lang.UnsupportedOperationException: невозможно открыть ДИСПЛЕЙ по адресу com.sun.glass.ui.gtk.GtkApplication.(GtkApplication.java:68) на com.sun.glass.ui.gtk.GtkPlatformFactory.createApplication(GtkPlatformFactory.java:41) на com.sun.glass.ui.Application.run(Application.java:146) на com.sun.javafx.tk.quantum.QuantumToolkit.startup(QuantumToolkit.java:257) на com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:211) в javafx.embed.swing.JFXPanel.initFx(JFXPanel.java:215) в javafx.embed.swing.JFXPanel.(JFXPanel.java:230) Я пытаюсь запустить это на экземпляре AWS. Есть ли способ преодолеть эту проблему? Ниже приведен пример моего кода.
import javafx.application.Platform; импортировать javafx.collections.FXCollections; импортировать javafx.collections.ObservableList; импортировать javafx.embed.swing.JFXPanel; импортировать javafx.embed.swing.SwingFXUtils; импортировать javafx.scene.Scene; импортировать javafx.scene.chart.PieChart; импортировать javafx.scene.image.WritableImage; импортировать javafx.stage.Stage; импортировать java.io.File; импортировать java.io.IOException; импортировать java.nio.file.Paths; импортировать javax.imageio.ImageIO; тест публичного класса { public static void main(String[] args) { СтрокаchartGenLocation = "/Users/tmp"; новый JFXPanel(); ObservableList pieChartData = FXCollections.observableArrayList( новый PieChart.Data("Ошибка", 10), new PieChart.Data("Пропущено", 20)); окончательная круговая диаграмма = новая круговая диаграмма (pieChartData); диаграмма.setAnimated(ложь); Platform.runLater(() -> { Этап этап = новый этап(); Сцена сцены = новая сцена(диаграмма, 500, 500); stage.setScene(сцена); WritableImage img = новый WritableImage (500, 500); сцена.снимок(изображение); Файл файл = новый файл(Paths.get(chartGenLocation, "a.png").toString()); пытаться { ImageIO.write(SwingFXUtils.fromFXImage(img, null), "png", файл); } catch (IOException e) { //logger.error("Произошла ошибка при записи изображения графика } }); } } Я видел несколько ответов SO, в которых в основном говорилось о монокле и testfx, здесь я не могу добавлять внешние зависимости. Поэтому добавление testfx не вариант. Я также пробовал следующее с xvbf, что приводило к зависанию системы:
Xvfb :95 -screen 0 1024x768x16 &> xvfb.log & экспорт DISPLAY=:95.0 При выполнении я вижу следующий вывод, и система зависает.
(process:13112): Gtk-WARNING **: локаль не поддерживается библиотекой C. Использование резервной локали «C». Предупреждение Fontconfig: игнорирование UTF-8: недопустимый тег региона Обновить
Последовательность выполнения
Xvfb :92 -screen 0 1024x768x16 &> xvfb.log & экспорт DISPLAY=:92.0 В xvbf.log ошибок нет, кажется, запускается правильно.
Тест Java Я вижу следующее в консоли
(process:13356): Gtk-WARNING **: локаль не поддерживается библиотекой C. Использование резервной локали «C». Предупреждение Fontconfig: игнорирование UTF-8: недопустимый тег региона Я не вижу никаких журналов в xvbf.log, после приведенного выше журнала выполнение не продолжается. Мое изображение не создается.
Обновление 2
Я хотел бы знать, есть ли способ обойти эту проверку, поскольку мне действительно не нужна визуализация дисплея.
У меня есть простое приложение, которое генерирует PNG-диаграмму на основе JavaFX. Приложение не запускается на компьютере без дисплея, за следующим исключением: мне не нужно визуализировать или отображать содержимое на консоли, нужно просто создать изображение.
"main" java.lang.UnsupportedOperationException: невозможно открыть ДИСПЛЕЙ по адресу com.sun.glass.ui.gtk.GtkApplication.(GtkApplication.java:68) на com.sun.glass.ui.gtk.GtkPlatformFactory.createApplication(GtkPlatformFactory.java:41) на com.sun.glass.ui.Application.run(Application.java:146) на com.sun.javafx.tk.quantum.QuantumToolkit.startup(QuantumToolkit.java:257) на com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:211) в javafx.embed.swing.JFXPanel.initFx(JFXPanel.java:215) в javafx.embed.swing.JFXPanel.(JFXPanel.java:230) Я пытаюсь запустить это на экземпляре AWS. Есть ли способ преодолеть эту проблему? Ниже приведен пример моего кода.
import javafx.application.Platform; импортировать javafx.collections.FXCollections; импортировать javafx.collections.ObservableList; импортировать javafx.embed.swing.JFXPanel; импортировать javafx.embed.swing.SwingFXUtils; импортировать javafx.scene.Scene; импортировать javafx.scene.chart.PieChart; импортировать javafx.scene.image.WritableImage; импортировать javafx.stage.Stage; импортировать java.io.File; импортировать java.io.IOException; импортировать java.nio.file.Paths; импортировать javax.imageio.ImageIO; тест публичного класса { public static void main(String[] args) { СтрокаchartGenLocation = "/Users/tmp"; новый JFXPanel(); ObservableList pieChartData = FXCollections.observableArrayList( новый PieChart.Data("Ошибка", 10), new PieChart.Data("Пропущено", 20)); окончательная круговая диаграмма = новая круговая диаграмма (pieChartData); диаграмма.setAnimated(ложь); Platform.runLater(() -> { Этап этап = новый этап(); Сцена сцены = новая сцена(диаграмма, 500, 500); stage.setScene(сцена); WritableImage img = новый WritableImage (500, 500); сцена.снимок(изображение); Файл файл = новый файл(Paths.get(chartGenLocation, "a.png").toString()); пытаться { ImageIO.write(SwingFXUtils.fromFXImage(img, null), "png", файл); } catch (IOException e) { //logger.error("Произошла ошибка при записи изображения графика } }); } } Я видел несколько ответов SO, в которых в основном говорилось о монокле и testfx, здесь я не могу добавлять внешние зависимости. Поэтому добавление testfx не вариант. Я также пробовал следующее с xvbf, что приводило к зависанию системы:
Xvfb :95 -screen 0 1024x768x16 &> xvfb.log & экспорт DISPLAY=:95.0 При выполнении я вижу следующий вывод, и система зависает.
(process:13112): Gtk-WARNING **: локаль не поддерживается библиотекой C. Использование резервной локали «C». Предупреждение Fontconfig: игнорирование UTF-8: недопустимый тег региона Обновить
Последовательность выполнения
Xvfb :92 -screen 0 1024x768x16 &> xvfb.log & экспорт DISPLAY=:92.0 В xvbf.log ошибок нет, кажется, запускается правильно.
Тест Java Я вижу следующее в консоли
(process:13356): Gtk-WARNING **: локаль не поддерживается библиотекой C. Использование резервной локали «C». Предупреждение Fontconfig: игнорирование UTF-8: недопустимый тег региона Я не вижу никаких журналов в xvbf.log, после приведенного выше журнала выполнение не продолжается. Мое изображение не создается.
Обновление 2
Я хотел бы знать, есть ли способ обойти эту проверку, поскольку мне действительно не нужна визуализация дисплея.
Мобильная версия