From 0cf73f156a4fae442833fd9d6d4a09b5dbe89cac Mon Sep 17 00:00:00 2001 From: Mitch Gaffigan Date: Sat, 28 Mar 2026 17:13:45 -0500 Subject: [PATCH] Added client prerequisite check Signed-off-by: Mitch Gaffigan --- .../client/ui/ClientPrerequisites.java | 28 +++++++++++++++++++ .../com/mirth/connect/client/ui/Mirth.java | 20 +++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 client/src/com/mirth/connect/client/ui/ClientPrerequisites.java diff --git a/client/src/com/mirth/connect/client/ui/ClientPrerequisites.java b/client/src/com/mirth/connect/client/ui/ClientPrerequisites.java new file mode 100644 index 000000000..2af4ed38a --- /dev/null +++ b/client/src/com/mirth/connect/client/ui/ClientPrerequisites.java @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: MPL-2.0 +// SPDX-FileCopyrightText: Mitch Gaffigan + +package com.mirth.connect.client.ui; + +/** Utility class to check if the client prerequisites are met. */ +public class ClientPrerequisites { + + private ClientPrerequisites() { + } + + /** Checks if the client prerequisites are met. */ + public static String getMissing() { + // Can't meaningfully check for Java 17 since the entrypoint is compiled with + // class file version 61, which will fail to load on Java 8. + if (!hasJavaFx()) { + return "JavaFX"; + } + + return null; + } + + private static boolean hasJavaFx() { + // Use JPMS to check for JavaFX - the classes are on the classpath + // even in Java SE, but the module will not be present except in FX + return ModuleLayer.boot().findModule("javafx.graphics").isPresent(); + } +} \ No newline at end of file diff --git a/client/src/com/mirth/connect/client/ui/Mirth.java b/client/src/com/mirth/connect/client/ui/Mirth.java index eacb68331..807e11f59 100644 --- a/client/src/com/mirth/connect/client/ui/Mirth.java +++ b/client/src/com/mirth/connect/client/ui/Mirth.java @@ -13,6 +13,7 @@ import javax.imageio.ImageIO; import javax.swing.ImageIcon; import javax.swing.InputMap; +import javax.swing.JOptionPane; import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import javax.swing.ToolTipManager; @@ -253,6 +254,13 @@ public static void initUIManager() { * String[] */ public static void main(String[] args) { + var missingPrerequisite = ClientPrerequisites.getMissing(); + if (missingPrerequisite != null) { + showUnsupportedJreDialog(missingPrerequisite); + System.exit(1); + return; + } + CommandLineOptions opts = new CommandLineOptions(args); if (StringUtils.isNotBlank(opts.getProtocols())) { @@ -267,6 +275,18 @@ public static void main(String[] args) { start(opts.getServer(), opts.getVersion(), opts.getUsername(), opts.getPassword()); } + private static void showUnsupportedJreDialog(String missingPrerequisite) { + var message = String.format( + "%s Client requires %s%nPlease relaunch the client with a supported JRE.", + BrandingConstants.PRODUCT_NAME, missingPrerequisite); + + try { + JOptionPane.showMessageDialog(null, message, "Unsupported Java Runtime", JOptionPane.ERROR_MESSAGE); + } catch (Throwable t) { + System.err.println(message); + } + } + private static void start(final String server, final String version, final String username, final String password) { // disable the velocity logging Logger velocityLogger = LogManager.getLogger(RuntimeConstants.DEFAULT_RUNTIME_LOG_NAME);