From 16f076079e9bf0bbd1338d2c0030ef70ae192ca3 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Thu, 5 Mar 2026 19:02:47 +0100 Subject: [PATCH 1/2] jdk25 support fix --- cli-activemq-jmx/README.md | 12 +++++++ .../management/AbstractConnectionManager.java | 31 +++++++++++++++++-- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/cli-activemq-jmx/README.md b/cli-activemq-jmx/README.md index 66d60197..14c982e0 100644 --- a/cli-activemq-jmx/README.md +++ b/cli-activemq-jmx/README.md @@ -7,6 +7,18 @@ Introduction This is an utility that access Apache ActiveMQ, Apache Artemis and Red Hat A-MQ6 and A-MQ7 remotely. It can be used to manage queues and topics, destinations and obtain various information. +Java 17-25 Compatibility +---- + +This tool supports Java 17 through Java 25. The main change involves handling the deprecated `Subject.getSubject()` method +which was removed in Java 25. The JMX connection now uses `Subject.doAs()` for proper authentication context, ensuring +compatibility across Java 17-25. + +If you encounter authentication issues, ensure that: +- Your broker is properly configured for JMX authentication +- The credentials are correctly provided via `--username` and `--password` parameters +- The JMX URL is correct for your broker type + Building and Installing: with ActiveMQ and Artemis libraries ---- Note: Maven commands are always accompanied with 'pom.xml' file. If you do not execute mvn within directory where pom.xml resides, diff --git a/cli-activemq-jmx/src/main/java/com/redhat/amqx/management/AbstractConnectionManager.java b/cli-activemq-jmx/src/main/java/com/redhat/amqx/management/AbstractConnectionManager.java index 9e5bf7b2..ff5d4776 100644 --- a/cli-activemq-jmx/src/main/java/com/redhat/amqx/management/AbstractConnectionManager.java +++ b/cli-activemq-jmx/src/main/java/com/redhat/amqx/management/AbstractConnectionManager.java @@ -9,7 +9,9 @@ import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; +import javax.security.auth.Subject; import java.io.IOException; +import java.security.PrivilegedAction; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -40,7 +42,7 @@ public AbstractConnectionManager(String url, final Credentials credentials, Stri this.brokerName = brokerName; } - Map env = null; + Map env = null; if (credentials != null) { env = new HashMap<>(); @@ -49,9 +51,34 @@ public AbstractConnectionManager(String url, final Credentials credentials, Stri String[] creds = {username, password}; env.put(JMXConnector.CREDENTIALS, creds); + + // For Java 25+ compatibility: Create a Subject and use it for the connection + // This avoids the deprecated Subject.getSubject() call on the server side + Subject subject = new Subject(); + env.put(JMXConnector.SUBJECT_DELEGATION_ENABLED, "true"); } logger.debug("Connecting to '" + url + "'"); - JMXConnector jmxc = JMXConnectorFactory.connect(jmxServiceURL, env); + + // Connect with proper subject context for Java 25+ compatibility + final JMXServiceURL finalUrl = jmxServiceURL; + final Map finalEnv = env; + + JMXConnector jmxc; + if (credentials != null) { + // Create a Subject with credentials for Java 17-25 compatibility + // Using doAs() which works across Java 17-25 (deprecated but functional) + Subject subject = new Subject(); + jmxc = Subject.doAs(subject, (PrivilegedAction) () -> { + try { + return JMXConnectorFactory.connect(finalUrl, finalEnv); + } catch (IOException e) { + throw new RuntimeException("Failed to connect to JMX", e); + } + }); + } else { + jmxc = JMXConnectorFactory.connect(jmxServiceURL, env); + } + mBeanServerConnection = jmxc.getMBeanServerConnection(); this.resolver = initializeResolver(); } From a85f62e879f31eaccedaa9791c420cea538e2913 Mon Sep 17 00:00:00 2001 From: Petr Matousek Date: Thu, 5 Mar 2026 19:08:12 +0100 Subject: [PATCH 2/2] JDK25 support fixes --- .../redhat/amqx/management/AbstractConnectionManager.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/cli-activemq-jmx/src/main/java/com/redhat/amqx/management/AbstractConnectionManager.java b/cli-activemq-jmx/src/main/java/com/redhat/amqx/management/AbstractConnectionManager.java index ff5d4776..ee3b2f1e 100644 --- a/cli-activemq-jmx/src/main/java/com/redhat/amqx/management/AbstractConnectionManager.java +++ b/cli-activemq-jmx/src/main/java/com/redhat/amqx/management/AbstractConnectionManager.java @@ -51,11 +51,6 @@ public AbstractConnectionManager(String url, final Credentials credentials, Stri String[] creds = {username, password}; env.put(JMXConnector.CREDENTIALS, creds); - - // For Java 25+ compatibility: Create a Subject and use it for the connection - // This avoids the deprecated Subject.getSubject() call on the server side - Subject subject = new Subject(); - env.put(JMXConnector.SUBJECT_DELEGATION_ENABLED, "true"); } logger.debug("Connecting to '" + url + "'");