Maintenance release of the 3.0.x line, on GeoServer 3.0.2, GeoTools 35.2, GeoWebCache 2.0.2 and Spring Boot 4.1.1. Besides the upgrade, it fixes changes made on one pod that never reached the others, three gateway errors (among them the HTTP 500 on GML responses), and bugs in the REST API, the pgconfig backend and tile layer removal. It also adds GeoParquet and Arrow IPC output formats for WFS, mount points for extra jars and fonts, and log levels that can be changed from the web UI without a restart.
Upgrade notes
- The images no longer bundle the Oracle JDBC driver (
ojdbc17), which ships under Oracle's proprietary terms. Deployments that use Oracle provide it at runtime through the new/opt/additional_libsmount point. #930 - The images no longer ship a root-owned, pre-initialized data directory: the AOT training run initialized the default one instead of its temporary directory. Containers without a data directory volume start again under a non-root uid, named volumes are no longer seeded with training files, and the compose examples drop the init containers that fixed volume ownership. #925, #929
- The gateway sends its request id to the services in
X-Request-ID, so both log the same id for a request, and accepts an incoming id only from the proxies listed ingeoserver.gateway.request-id.trusted-proxies. #1043
GeoServer
- GeoServer 3.0.2, GeoTools 35.2 and GeoWebCache 2.0.2. Among the upstream fixes, the WMTS multidimensional operations now honor data security (GEOS-12206). See the GeoServer 3.0.2 release notes. #944, #960, #1028, #1035, #1040
- GeoServer is built as
3.0.2-CLOUDfrom thegscloud/3.0.2branch ofcamptocamp/geoserver: the 3.0.2 release plus GEOS-10561 and GEOS-11421, which are not merged upstream yet.
New features
- Two mount points, usable without rebuilding the images:
/opt/additional_libsfor jars added to the application classpath, such as JDBC drivers or GeoServer extensions not included in the images, and/opt/additional_fontsfor fonts registered with fontconfig and available to the JVM, for example for SLD labels. #922 - GeoParquet and Arrow IPC output formats for WFS GetFeature, auto-configured in the WFS and web UI services, each with its own switch under
geoserver.extension.tileverse.parquetry. #984, #933 - The logging profile of the global settings now applies, so administrators can change the log levels of running services from the web UI, for example to log the SQL of a WFS request, without restarting them. The profiles are defined in
geoserver_logging.ymlin the configuration repository. #1046, fixes #1033
Cluster consistency
- Users, groups and roles created or edited on one pod, for example through the web UI, now reach the other pods, including the REST API, without a restart. #977, fixes #702
- Changing the default style of a layer takes effect on pods that had already rendered it. #988, fixes #781
- Modifying a layer group with default styles no longer produces a bus event that the other pods drop. #990, fixes #986
- Deleting a layer deletes its tile layer, drops its cached tiles and evicts it from the other services. On the data directory backend the tile layer configuration was left behind. #1006, with regression coverage in #1012
Gateway
- WFS 1.x GML responses, WMS GML GetFeatureInfo and WPS raw feature collections no longer fail with HTTP 500. The gateway now relays a response whose Content-Type it cannot parse, such as
text/xml; subtype=gml/3.1.1, unchanged. #1021, fixes #1002 - Requests with a bare
=inside a query value, such as aCQL_FILTER, no longer fail with HTTP 500. #996, fixes #693 - Saving a web UI form no longer corrupts non-ASCII characters: the gateway double-encoded form posts that do not declare a charset. #998, fixes #981
REST API
- Requests on paths containing
/gwc, such asGET /rest/resource/gwc-gs.xml, no longer fail with aNullPointerException. #936, fixes #913 - POSTing a layer group without
<style>elements no longer fails with aNullPointerException. #983 - Updating the WFS settings no longer breaks the OGC API Features conformance configuration: the REST service lacked the XStream persister initializers for complex metadata map values. #965, fixes #872
pgconfig backend
- A layer referencing a style from another workspace keeps the style's own workspace. #994, by @jurgispods
- Loading nested layer groups no longer fails with
IllegalStateException: Recursive updatefrom the catalog cache. #999, by @jurgispods
Other fixes
- The web UI and REST services no longer crash at startup with a
NoClassDefFoundErroronlog4j-corewhen the Importer extension is enabled. #938, fixes #912, by @articque - The access denied page is served instead of an HTTP 500. #971
- Caches configured with their own weigher, quota or expiry keep that configuration when Spring's cache manager also registers them for the actuator endpoints. #1004
Dependencies
- Spring Boot 4.1.1 and Spring Cloud 2025.1.3, on the Spring Framework 7.0.9 and Spring Security 7.1.1 that GeoServer builds against. #953
- GeoServer ACL 3.0.3. #958
- cloud-dependencies-bom 1.1.0: AWS SDK 2.41.32 -> 2.54.16, Azure SDK BOM 1.3.3 -> 1.3.8 (azure-storage-blob 12.35.0), google-cloud-storage 2.67.0 -> 2.73.0. #1009
- tileverse 2.1.0 and tileverse-geoserver 3.0.2. #1051, #975
- amqp-client 5.35.0, Jackson 3.2.3, and flatbuffers-java pinned to 25.2.10 for dependency convergence. #955, #1032, #968
Build and testing
- GeoServer is built from a shallow submodule instead of GitHub Packages, and
make deps-syncmoves the submodule to the head of its branch. #927, #940 jakarta.servlet-apiis declared once, as provided, in the root pom. #963- Tests run on GeoServer Cloud's own catalog, the one the services use. #1023
- Acceptance tests updated to python-geoservercloud 0.8.14. #1016, #1020
- PMTiles auto-configuration test fixed after an upstream change, and SonarCloud issues addressed. #1026, #1001, #1047, #1049
Full Changelog: v3.0.1.1...v3.0.2