diff --git a/java/org/apache/catalina/startup/Catalina.java b/java/org/apache/catalina/startup/Catalina.java
index ec1c8818baf0..3ab65ae2d776 100644
--- a/java/org/apache/catalina/startup/Catalina.java
+++ b/java/org/apache/catalina/startup/Catalina.java
@@ -597,8 +597,15 @@ private void addClusterRuleSet(Digester digester, String prefix) {
Constructor> constructor;
try {
clazz = Class.forName("org.apache.catalina.ha.ClusterRuleSet");
+ Class.forName("org.apache.catalina.tribes.Channel");
constructor = clazz.getConstructor(String.class);
RuleSet ruleSet = (RuleSet) constructor.newInstance(prefix);
+
+ String clusterPrefix = prefix.substring(0, prefix.length() - 1);
+ digester.addObjectCreate(clusterPrefix, null, "className");
+ digester.addSetProperties(clusterPrefix);
+ digester.addSetNext(clusterPrefix, "setCluster", "org.apache.catalina.Cluster");
+
digester.addRuleSet(ruleSet);
} catch (Exception e) {
if (!clusterUnavailabilityLogged) {
diff --git a/java/org/apache/catalina/startup/EngineRuleSet.java b/java/org/apache/catalina/startup/EngineRuleSet.java
index e4ef9d9488f0..166160f730c2 100644
--- a/java/org/apache/catalina/startup/EngineRuleSet.java
+++ b/java/org/apache/catalina/startup/EngineRuleSet.java
@@ -64,13 +64,6 @@ public void addRuleInstances(Digester digester) {
new LifecycleListenerRule("org.apache.catalina.startup.EngineConfig", "engineConfigClass"));
digester.addSetNext(prefix + "Engine", "setContainer", "org.apache.catalina.Engine");
- // Cluster configuration start
- digester.addObjectCreate(prefix + "Engine/Cluster", null, // MUST be specified in the element
- "className");
- digester.addSetProperties(prefix + "Engine/Cluster");
- digester.addSetNext(prefix + "Engine/Cluster", "setCluster", "org.apache.catalina.Cluster");
- // Cluster configuration end
-
digester.addObjectCreate(prefix + "Engine/Listener", null, // MUST be specified in the element
"className");
digester.addSetProperties(prefix + "Engine/Listener");
diff --git a/java/org/apache/catalina/startup/HostRuleSet.java b/java/org/apache/catalina/startup/HostRuleSet.java
index 6b21e49bbf4e..c11bce5f7706 100644
--- a/java/org/apache/catalina/startup/HostRuleSet.java
+++ b/java/org/apache/catalina/startup/HostRuleSet.java
@@ -67,13 +67,6 @@ public void addRuleInstances(Digester digester) {
digester.addCallMethod(prefix + "Host/Alias", "addAlias", 0);
- // Cluster configuration start
- digester.addObjectCreate(prefix + "Host/Cluster", null, // MUST be specified in the element
- "className");
- digester.addSetProperties(prefix + "Host/Cluster");
- digester.addSetNext(prefix + "Host/Cluster", "setCluster", "org.apache.catalina.Cluster");
- // Cluster configuration end
-
digester.addObjectCreate(prefix + "Host/Listener", null, // MUST be specified in the element
"className");
digester.addSetProperties(prefix + "Host/Listener");
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index aca96c0b7915..faa2121a925e 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -367,6 +367,14 @@
detailed error information (message, description, stack trace) is
suppressed from error responses. (dsoumis)
+
+ Avoid a NoClassDefFoundError at startup when
+ catalina-tribes.jar is removed but
+ catalina-ha.jar is present and the
+ Cluster element is enabled in
+ server.xml. Cluster digester rules are now fully
+ conditional on both JARs being available. (dsoumis)
+