nemo-91 / bpmtk

Other
9 stars 7 forks source link

Java headless mode in a container #1

Open iharsuvorau opened 2 years ago

iharsuvorau commented 2 years ago

Can we run SplitMiner without a display? At the moment it's impossible to execute it in Docker, having the java.awt.HeadlessException exception.

Picked up JAVA_TOOL_OPTIONS: -Djava.awt.headless=true
java.lang.ExceptionInInitializerError
    at com.fluxicon.slickerbox.components.SlickerButton.createBackgroundBuffer(SlickerButton.java:365)
    at com.fluxicon.slickerbox.components.SlickerButton.initialize(SlickerButton.java:174)
    at com.fluxicon.slickerbox.components.SlickerButton.<init>(SlickerButton.java:122)
    at com.fluxicon.slickerbox.factory.SlickerFactory.createButton(SlickerFactory.java:100)
    at org.processmining.framework.util.ui.scalableview.ScalableViewPanel.addButton(ScalableViewPanel.java:419)
    at org.processmining.models.jgraph.visualization.ProMJGraphPanel.<init>(ProMJGraphPanel.java:36)
    at org.processmining.models.jgraph.ProMJGraphVisualizer.visualizeGraph(ProMJGraphVisualizer.java:132)
    at org.processmining.models.jgraph.ProMJGraphVisualizer.visualizeGraph(ProMJGraphVisualizer.java:72)
    at org.processmining.plugins.bpmn.BpmnDefinitions$BpmnDefinitionsBuilder.fillGraphicsInfo(BpmnDefinitions.java:179)
    at org.processmining.plugins.bpmn.BpmnDefinitions$BpmnDefinitionsBuilder.buildFromDiagram(BpmnDefinitions.java:161)
    at org.processmining.plugins.bpmn.BpmnDefinitions$BpmnDefinitionsBuilder.<init>(BpmnDefinitions.java:81)
    at org.processmining.plugins.bpmn.plugins.BpmnExportPlugin.retrieveContent(BpmnExportPlugin.java:180)
    at org.processmining.plugins.bpmn.plugins.BpmnExportPlugin.export(BpmnExportPlugin.java:78)
    at au.edu.unimelb.services.ServiceProvider.SplitMinerService(ServiceProvider.java:532)
    at au.edu.unimelb.services.ServiceProvider.main(ServiceProvider.java:96)
Caused by: java.awt.HeadlessException
    at sun.java2d.HeadlessGraphicsEnvironment.getDefaultScreenDevice(HeadlessGraphicsEnvironment.java:77)
    at com.fluxicon.slickerbox.util.GraphicsUtilities.<clinit>(GraphicsUtilities.java:80)
    ... 15 more
Picked up JAVA_TOOL_OPTIONS: -Djava.awt.headless=true
java.lang.ExceptionInInitializerError
    at com.fluxicon.slickerbox.components.SlickerButton.createBackgroundBuffer(SlickerButton.java:365)
    at com.fluxicon.slickerbox.components.SlickerButton.initialize(SlickerButton.java:174)
    at com.fluxicon.slickerbox.components.SlickerButton.<init>(SlickerButton.java:122)
    at com.fluxicon.slickerbox.factory.SlickerFactory.createButton(SlickerFactory.java:100)
    at org.processmining.framework.util.ui.scalableview.ScalableViewPanel.addButton(ScalableViewPanel.java:419)
    at org.processmining.models.jgraph.visualization.ProMJGraphPanel.<init>(ProMJGraphPanel.java:36)
    at org.processmining.models.jgraph.ProMJGraphVisualizer.visualizeGraph(ProMJGraphVisualizer.java:132)
    at org.processmining.models.jgraph.ProMJGraphVisualizer.visualizeGraph(ProMJGraphVisualizer.java:72)
    at org.processmining.plugins.bpmn.BpmnDefinitions$BpmnDefinitionsBuilder.fillGraphicsInfo(BpmnDefinitions.java:179)
    at org.processmining.plugins.bpmn.BpmnDefinitions$BpmnDefinitionsBuilder.buildFromDiagram(BpmnDefinitions.java:161)
    at org.processmining.plugins.bpmn.BpmnDefinitions$BpmnDefinitionsBuilder.<init>(BpmnDefinitions.java:81)
    at org.processmining.plugins.bpmn.plugins.BpmnExportPlugin.retrieveContent(BpmnExportPlugin.java:180)
    at org.processmining.plugins.bpmn.plugins.BpmnExportPlugin.export(BpmnExportPlugin.java:78)
    at au.edu.unimelb.services.ServiceProvider.SplitMinerService(ServiceProvider.java:532)
    at au.edu.unimelb.services.ServiceProvider.main(ServiceProvider.java:96)
Caused by: java.awt.HeadlessException
    at sun.java2d.HeadlessGraphicsEnvironment.getDefaultScreenDevice(HeadlessGraphicsEnvironment.java:77)
    at com.fluxicon.slickerbox.util.GraphicsUtilities.<clinit>(GraphicsUtilities.java:80)
    ... 15 more
nemo-91 commented 2 years ago

hi,

Split miner itself does not need a display, though there are some external libraries that are used within Split Miner that may require it by design (although they do not really need a display). With some tweaks to the code, you may be able to remove the parts of the code that call classes in those libraries (mostly called for exporting the output file), this may require some time though.

iharsuvorau commented 2 years ago

Hello, @nemo-91,

Thank you for the feedback. I also managed to run it with a dummy X server. Xvfb does the trick.

A docker file with an appropriate Java version for Split Miner and with Xvfb:

FROM openjdk:8-jre-bullseye

RUN apt update
RUN apt install -y libxrender1 libxext6 libxtst6 xvfb x11-utils

ENV DISPLAY=:99

CMD /bin/bash

Xvfb doesn't run as a server, so it should be executed together with the X server dependent command:

$ Xvfb :99 &>/dev/null & disown; any-X-server-dependent-command