Skip to content

JavaFX

Creating a working JavaFX demo in the web

I did this working in my BasicDemo app.

I created my own Dockerfile and docker-compose.yml like the following

Dockerfile
FROM amazoncorretto:21
# Update yum and install dependencies
RUN yum update -y && yum install -y \
    pango \
    cairo \
    freetype \
    fontconfig && \
    yum clean all
# Set the working directory and configure the CMD
WORKDIR /jproserver
CMD ["sh", "-c", "cd /jproserver && ./bin/restart.sh"]

The installations are necessary to run the project in Docker.

Then the docker-compose.yml file:

docker-compose.yml
services:
  jpro-demo:
    container_name: jpro-demo
    build:
      context: .  # Directory where Dockerfile is located
      dockerfile: Dockerfile
    ports:
      - "7080:8080"
    volumes:
      - .:/jproserver
    restart: always

In my build.gradle I used an ssh plugin to deploy and run my application id 'org.hidetake.ssh' version '2.11.2'

I created two tasks cleanAll and deployHome to basically clean the build directory, down the docker app, and remove the persisted storage of the build. Then the deployHome moves the build zip, unzips it, then unpacks the parent folder.

plugins {
    id 'java'
    id 'application'
    id 'org.javamodularity.moduleplugin' version '1.8.12'
    id 'org.openjfx.javafxplugin' version '0.0.13'
    id 'org.beryx.jlink' version '2.25.0'
    id 'jpro-gradle-plugin'
    id 'org.hidetake.ssh' version '2.11.2'
}

/**
More Stuff...
*/

ssh.settings {
    knownHosts = file("${System.env.USERPROFILE}/.ssh/known_hosts")
//    knownHosts = allowAnyHosts
}

remotes {
    homeServer {
        host = home_ip // Replace with your instance IP
        user = home_user // Replace with your SSH username
        identity = file(home_pk) // Replace with the path to your private SSH key
    }
}

task cleanAll(dependsOn: 'clean') {
    doLast {
        ssh.run {
            session(remotes.homeServer) {
                // delete everything in the jpro folder
                execute 'docker compose -f /home/thomas/docker/jpro/docker-compose.yml down -v'
                execute 'rm -rf /home/thomas/docker/jpro/*'
            }
        }
    }
}

task deployHome(dependsOn: 'jproRelease') {
    doLast {
        ssh.run {
            session(remotes.homeServer) {
                put from: project.file("build/distributions/BasicDemo-jpro.zip"), into: '/home/thomas/docker/jpro/' // Replace with remote path
                // unzip the file on the remote server
                execute 'unzip /home/thomas/docker/jpro/BasicDemo-jpro.zip -d /home/thomas/docker/jpro/' // Replace with your actual service name

                // delete the zip file
                execute 'rm /home/thomas/docker/jpro/BasicDemo-jpro.zip'

                // Unpack and overwrite all the contents of the BasicDemo-jpro folder into the jpro folder
                execute 'cp -r /home/thomas/docker/jpro/BasicDemo-jpro/* /home/thomas/docker/jpro/' // Replace with your actual service name


                put from: project.file("Dockerfile"), into: '/home/thomas/docker/jpro/' // Replace with remote path
                put from: project.file("docker-compose.yml"), into: '/home/thomas/docker/jpro/' // Replace with remote path
                // Restart the service on the remote server
                execute 'docker compose -f /home/thomas/docker/jpro/docker-compose.yml up -d --build' // Replace with your actual service name
            }
        }
    }
}