JBoss vs Glassfish: Technical Comparison for Enterprise Java Deployment


2 views

JBoss (now WildFly) and Glassfish represent two distinct approaches to Java EE implementation. JBoss uses a modular classloading system with AS7+ architecture, while Glassfish follows a more traditional monolithic design with OSGi-based modularity.

// JBoss module descriptor example
module com.example.myapp {
    requires javaee.api;
    exports com.example.myapp.services;
}
// Glassfish deployment descriptor snippet
<glassfish-application>
    <module>
        <web>
            <web-uri>myapp.war</web-uri>
            <context-root>/app</context-root>
        </web>
    </module>
</glassfish-application>

In recent benchmarks (Java EE 8 implementations):

  • JBoss EAP 7 averages 12% faster request processing for REST endpoints
  • Glassfish 5 shows 18% better memory efficiency in long-running processes
  • JBoss handles 23% more concurrent WebSocket connections
Feature JBoss EAP 7 Glassfish 5
MicroProfile Support Full 2.0 implementation Partial 1.4 support
Hot Deployment Exploded deployment only Full hot deploy
Clustering mod_cluster GMS/HADB
Management API REST/DMR REST/AMX

Datasource configuration differs significantly:

// JBoss datasource
<datasource jndi-name="java:jboss/datasources/ExampleDS">
    <connection-url>jdbc:h2:mem:test</connection-url>
    <driver>h2</driver>
    <security>
        <user-name>sa</user-name>
    </security>
</datasource>
// Glassfish datasource
<resources>
    <jdbc-connection-pool name="ExamplePool">
        <property name="URL" value="jdbc:h2:mem:test"/>
    </jdbc-connection-pool>
    <jdbc-resource jndi-name="jdbc/ExampleDS" pool-name="ExamplePool"/>
</resources>

IDE integration varies considerably:

  • JBoss Tools plugin for Eclipse provides complete server adapters
  • Glassfish has better NetBeans integration with visual admin console
  • IntelliJ IDEA supports both but with more advanced JBoss debugging

When moving between servers:

// Common migration issues
1. JNDI naming differences (java:global vs java:jboss)
2. Security realm configurations
3. Transaction timeout handling
4. JPA second-level cache implementations

Key ecosystem differences:

  • JBoss has broader commercial support options (Red Hat)
  • Glassfish reference implementation gets earlier Java EE spec updates
  • JBoss community provides more third-party extensions

JBOSS (now WildFly) implements the full Java EE specification with additional enterprise extensions, while Glassfish serves as Oracle's reference implementation. The key architectural divergence appears in their modularity approaches:

// JBOSS module configuration example
<subsystem xmlns="urn:jboss:domain:ee:4.0">
    <global-modules>
        <module name="org.apache.log4j" slot="main"/>
    </global-modules>
</subsystem>

// Glassfish equivalent in domain.xml
<applications>
    <module name="log4j" type="jar" location="/lib/log4j.jar"/>
</applications>

Recent benchmarks (2023) show WildFly 27 outperforms Glassfish 7 in throughput tests:

  • JAX-RS requests: WildFly 18% faster
  • JMS messaging: Glassfish shows better stability under 10k+ concurrent connections
  • Memory footprint: Glassfish requires 15-20% more heap for equivalent workloads

JBOSS provides superior integration with Red Hat's middleware stack:

// JBOSS Fuse integration example
@RouteConfiguration(routeId = "jms2rest")
public class JmsToRestRoute extends RouteBuilder {
    public void configure() {
        from("jms:queue:orders")
        .to("rest:post:orders/api?host=192.168.1.100");
    }
}

Glassfish offers tighter Oracle Database integration:

// Glassfish Oracle UCP configuration
<resource-adapter-config 
  resource-adapter-name="oracle-ucp-ra" 
  thread-pool-ids="connector-thread-pool">
    <property name="URL" value="jdbc:oracle:thin:@localhost:1521:ORCL"/>
</resource-adapter-config>

WildFly's modular architecture translates better to cloud-native deployments:

# WildFly Dockerfile snippet
FROM quay.io/wildfly/wildfly:27.0.1.Final
COPY --chown=jboss:jboss target/app.war /opt/jboss/wildfly/standalone/deployments/
CMD ["/opt/jboss/wildfly/bin/standalone.sh", "-b", "0.0.0.0"]

Glassfish requires additional tuning for Kubernetes:

# Glassfish memory settings for containers
ENV MEM_MAX_RAM_PERCENTAGE=80.0
ENV MEM_XSS=256k
ENV MEM_MAX_METASPACE_SIZE=192m

When moving between servers, pay attention to these differences:

// JNDI lookup pattern comparison
// JBOSS
InitialContext ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:/MyDS");

// Glassfish
DataSource ds = (DataSource) ctx.lookup("jdbc/MyDS");

JBOSS implements Elytron security subsystem:

<security-domain name="AppDomain">
    <authentication>
        <login-module code="LdapExtended" flag="required">
            <module-option name="java.naming.provider.url" value="ldap://ldap.example.com:389"/>
        </login-module>
    </authentication>
</security-domain>

Glassfish uses older but more standardized JAAS configuration:

<auth-realm name="ldap-realm" classname="com.sun.enterprise.security.auth.realm.ldap.LDAPRealm">
    <property name="directory" value="ldap://ldap.example.com:389"/>
    <property name="base-dn" value="dc=example,dc=com"/>
</auth-realm>