Apache TomEE 10.3.0 Release Notes
We are excited to announce the release of Apache TomEE 10.3.0!
This release on the TomEE 10 / Jakarta EE 10 line focuses on security hardening. Alongside the fixes tracked in Jira, we
reviewed large parts of the code base and tightened the defaults of authentication, remote EJB, web services, passivation
and build tooling. TomEE 10.3.0 also removes several legacy modules (openejb-hessian, openejb-ssh,
openejb-common-cli and the standalone HTTP server of openejb-http), moves the Maven and Gradle plugins to current
build tool APIs, and upgrades Tomcat to 10.1.61 along with many other dependencies.
| Several of these changes are not backwards compatible. Please read the TomEE 10.3.0 Migration Guide before upgrading from TomEE 10.2.x or earlier. |
We extend our deepest gratitude to everyone who contributed to this release, especially our incredible volunteers who worked on TomEE 10 and on fixes in our upstream dependencies such as Tomcat, OWB, CXF, MyFaces, and more.
Your efforts made TomEE 10.3.0 possible!
Security Hardening
The following changes were made without dedicated Jira issues. Items marked (breaking) are covered in the migration guide.
MicroProfile JWT
-
The MP-JWT filter is only registered for applications using
@LoginConfig(authMethod = "MP-JWT"). Other authentication methods no longer trigger JWT processing (breaking). -
@RolesAllowedconstraints are resolved per resource class. Methods inherited by several resource classes no longer merge their roles, and an empty@RolesAllowed({})now denies all callers (breaking). -
The caller identity is restored when the filter chain throws, so it cannot leak into a later request on a pooled thread.
-
A negative
mp.jwt.verify.clock.skewnow fails the deployment instead of silently disabling the token expiry check (breaking).
Authentication and Identity Stores
-
The LDAP identity store escapes caller names in search filters and DNs, and no longer attempts a bind with an empty password (anonymous bind) (breaking).
-
SQLLoginModulerejects users with aNULLstored password.SQLLoginModuleandPropertiesLoginModulecompare passwords in constant time and report a single generic failure message (breaking). -
TomEEPbkdf2PasswordHashvalidates the algorithm and iteration count of stored hashes and rejects weak parameters (breaking). -
The Tomcat user identity store verifies passwords through the
CredentialHandlerof the matchingUserDatabaseRealm, so digested passwords intomcat-users.xmlwork as expected (breaking). -
A caller principal is no longer granted a role just because its name matches the role name (breaking).
-
Remember-me tokens are removed from the
RememberMeIdentityStoreon logout. -
OpenID Connect
stateandnoncevalues are generated withSecureRandom, andstateis compared in constant time. -
Using the
Static3DESpassword cipher logs a warning that it only obfuscates passwords.
Authorization
-
EJB method permissions (
@RolesAllowed,@DenyAll) are evaluated through the installed JACC policy on all JDKs again. TomEE 10.2.0 skipped this check on Java 21 and newer (breaking). -
Internal EJBs such as the Deployer always require the
tomee-adminoropenejb-adminrole, and TomEE no longer creates a defaulttomee/tomeeadmin user (breaking). -
Fixed a
StackOverflowErrorin the JACCPolicyConfigurationFactory.
Web Services, JAX-RS and Routing
-
Security constraints generated for JAX-WS endpoints protect all HTTP methods instead of only
GETandPOST(breaking). -
EJB web services packaged in a WAR now enforce the
auth-methodconfigured inopenejb-jar.xml(breaking). -
The WS-Security caller identity is cleared after each JAX-WS request, including on faults.
-
The default JAX-RS mapper for
EJBExceptionno longer returns the exception message to the client (breaking). -
RouterValvevalidates forward targets: it refusesWEB-INF/META-INFtargets and honors the webapp’s security constraints (breaking).
Remote EJB and Server Services
-
Remote lookups of DataSources over EJBd are disabled by default (breaking).
-
ejbdsclients verify that the server certificate matches the host name (breaking). -
Clients configured for a secure transport ignore failover locations and refuse redirects that downgrade to a plain transport (breaking).
-
only_fromis authoritative for server services: localhost is no longer admitted implicitly (breaking). -
The Derby network server honors its
bindsetting (default127.0.0.1) (breaking). -
Stop requests on the standalone admin port require a shared secret (breaking).
-
Primary keys of stateful and managed beans are random
UUIDvalues.
Filesystem and Passivation
-
Stateful and managed beans are passivated to a private, owner-only directory instead of the shared temp directory (breaking).
-
RAFPassivaterkeeps its file in a private temp directory and reads back the data it wrote correctly. -
Session ids that would resolve outside the passivation directory are rejected.
-
Internal temp directories are created atomically with owner-only permissions.
-
Archive extraction (WAR/EAR deployment, provisioning and
tomee-maven-plugin) rejects entries that escape the target directory. -
XML parsing of Maven metadata and
settings.xmlused formvn:provisioning disables DTDs and external entities.
Build Tooling and Packaging
-
tomee-maven-pluginwarns when it sends credentials over plain HTTP to a non-local host. -
The LiveReload connector of
tomee-embedded-maven-pluginbinds tolocalhostand checks the WebSocketOriginheader (breaking). -
The
quickSessionoption of the Maven, Gradle and embedded tooling defaults tofalse, so session ids are always generated withSecureRandom(breaking). -
The Debian packages keep the configuration read-only for the
apachetomeeservice group (breaking). -
The systemd service example in the documentation runs TomEE as a dedicated user.
-
Webapp jars skipped by the built-in scan exclusion list are now logged, so annotations that are silently ignored become visible.
-
The optional log4j 1.x API dependency (EOL log4j 1.2.17) is replaced by reload4j.
Bug
-
TOMEE-2044 threadPool-queue (in ServicePool) from ejbd-Service is never processed
-
TOMEE-3726 Queue is visible in JNDI Tree (java://id-resource)
-
TOMEE-4011 Multi-threaded Deployment of multiple war-files runs in TomEERuntimeException
-
TOMEE-4029 Use of JWKS forces kid to be present in JWTs
-
TOMEE-4240 The implementation for mail.mime.parameters.strict parameter is missing in jakarta/mail/internet/ParameterList.java class of geronimo-mail_2.1_spec-1.0.0-M1.jar in TomEE 9.1.0
-
TOMEE-4438 Disable releases for apache-snapshot repo
-
TOMEE-4547 MultipartMessage not build correctly with Jakarta.mail / Interferes with Geronimo-mail
-
TOMEE-4642 Deployment fails when a war lists a servlet or filter class it does not package
-
TOMEE-4651 TomEE does not register jakarta.tags.* TLD URIs, breaking all Jakarta Tags 3.0
-
TOMEE-4655 A failed CDI/EJB deployment leaks its deployment ID into later apps
-
TOMEE-4682 SecurityContext.authenticate() does not persist the session (bypasses HttpServletRequest.authenticate())
-
TOMEE-4699 ThreadContext constructor is not thread-safe, causing loss of submitted tasks.
-
TOMEE-4703 ApplicationThreadContextProvider stores a live ThreadContext reference instead of an immutable snapshot
-
TOMEE-4704 CUTask.invoke() does not safely propagate errors to ManagedTask
-
TOMEE-4708 OpenID definition EL expressions are evaluated on a shared ELProcessor and fail under concurrent requests (regression of TOMEE-4595)
-
TOMEE-4712 MDB endpoints are activated before the application’s other EJBs are started
-
TOMEE-4714 TomEEEmbeddedExtension (JUnit 5) can not start the container again after it was closed
-
TOMEE-4715 TomEE embedded application runner does not inject @Resource into the @Application descriptor
-
TOMEE-4716 MicroProfile Health endpoints are not deployed when the webapp declares a JAX-RS Application subclass
-
TOMEE-4728 MicroProfile Health endpoint runs the providers of a declared JAX-RS application
-
TOMEE-4729 MP-JWT security state is not restored for asynchronous requests
-
TOMEE-4730 MP-JWT ignores class-level security annotations of a resource superclass
-
TOMEE-4731 TxThreadContextRestorer fails with NPE when managed threads end after the container shut down
Improvement
-
TOMEE-1619 Add exception message to Alerts
-
TOMEE-4662 Speed up annotation processing during WAR deploy
-
TOMEE-4709 Track git revision in version info
-
TOMEE-4710 Don’t patch catalina.jar just to print TomEE Version
Task
-
TOMEE-4700 Drop openejb-hessian
-
TOMEE-4701 Drop openejb-ssh
-
TOMEE-4702 Drop openejb-common-cli
-
TOMEE-4705 Migrate the Maven plugins off the Maven 2 API
-
TOMEE-4706 Migrate the Gradle plugin to a current Gradle version
-
TOMEE-4707 Drop the standalone HTTP server from openejb-http
-
TOMEE-4733 Pin Surefire to 3.5.x in TCK modules
Documentation
-
TOMEE-4673 Remove "About the 'tomee' webapp" since Tomee drop-in webapp was removed in TOMEE-3724
Dependency upgrade
-
TOMEE-4687 actions/setup-java 6.0.0
-
TOMEE-4671 Apache ActiveMQ 6.2.8
-
TOMEE-4694 Apache ActiveMQ 6.2.10
-
TOMEE-4721 Apache ActiveMQ 6.3.3
-
TOMEE-4680 Apache CXF - CVE-2026-54225 in TomEE 10.2.0
-
TOMEE-4664 Apache Neethi 3.2.3
-
TOMEE-4724 Apache Neethi 3.2.4
-
TOMEE-4672 Bouncycastle 1.86
-
TOMEE-4669 commons-codec 1.23.0
-
TOMEE-4726 commons-lang3 3.21.0
-
TOMEE-4676 CXF 4.1.9
-
TOMEE-4663 Geronimo Mail 1.1.1
-
TOMEE-4696 Hibernate ORM 6.6.56.Final
-
TOMEE-4683 Jackson 2.22.2
-
TOMEE-4723 Jackson 2.22.4
-
TOMEE-4684 Johnzon 2.2.0
-
TOMEE-4719 Jose4j 0.9.7
-
TOMEE-4685 JUnit 6.1.3
-
TOMEE-4666 Mojarra 4.0.20
-
TOMEE-4695 Mojarra 4.0.28
-
TOMEE-4718 MyFaces 4.0.4
-
TOMEE-4698 Plexus Archiver 4.14.0
-
TOMEE-4722 SLF4J 2.0.20
-
TOMEE-4668 SmallRye Config 3.18.1
-
TOMEE-4686 SmallRye Config 3.18.2
-
TOMEE-4720 Snakeyaml 2.7
-
TOMEE-4677 Tomcat 10.1.61
-
TOMEE-4678 Upgrade micrometer-core jar
-
TOMEE-4725 WSS4J 4.0.2
-
TOMEE-4697 XBean 5.0.0