Skip to content

Add method-based doWithSpring(BeanBuilder) plugin lifecycle hook#15939

Merged
jdaugherty merged 3 commits into
apache:8.0.xfrom
codeconsole:feat/plugin-dowithspring-method
Jul 9, 2026
Merged

Add method-based doWithSpring(BeanBuilder) plugin lifecycle hook#15939
jdaugherty merged 3 commits into
apache:8.0.xfrom
codeconsole:feat/plugin-dowithspring-method

Conversation

@codeconsole

@codeconsole codeconsole commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Summary

Adds a method-based doWithSpring(BeanBuilder) hook to the grails.plugins.Plugin base class, as an alternative to the closure-returning doWithSpring(). This is the plugin analog of the method-based TagLib syntax added in #15465, applied to plugin Spring configuration.

Instead of returning a closure whose delegate the container wires up at runtime, a plugin can register beans directly against the supplied builder:

class I18nGrailsPlugin extends Plugin {

    def version = "0.1"

    @Override
    void doWithSpring(BeanBuilder beans) {
        beans.messageSource(ReloadableResourceBundleMessageSource) {
            basename = "WEB-INF/grails-app/i18n/messages"
        }
        beans.localeResolver(CookieLocaleResolver)
    }
}

Scope

The hook is on the grails.plugins.Plugin base class and is dispatched by DefaultGrailsPlugin for plugin descriptors. It is intentionally not added to the GrailsApplicationLifeCycle interface: that interface is map-coerced in the testing support (GrailsApplicationBuilder builds [doWithSpring: {…}] as GrailsApplicationLifeCycle), and Groovy's map-to-interface proxies do not honour Java default methods, so an interface-level hook would break every unit test that builds an application context. This applies to plugin descriptors (Plugin subclasses), not to the application class or arbitrary GrailsApplicationLifeCycle implementors.

Backwards compatibility

Fully preserved. The new hook is a no-op on Plugin, so existing plugins are unaffected. DefaultGrailsPlugin invokes both hooks for a Plugin descriptor, so a plugin may override doWithSpring(), doWithSpring(BeanBuilder), or both. The legacy closure-returning form and the legacy def doWithSpring = { } closure-property form on non-Plugin descriptors remain fully supported.

Defining both forms

A plugin must define at most one of doWithSpring() or doWithSpring(BeanBuilder). Both forms are explicit overrides and are alternatives, so defining both throws a PluginException and fails plugin load rather than silently combining or preferring one — surfacing what is almost always an incomplete migration between the two forms. (This deliberately differs from the auto-detected TagLib case in #15465, where method-tags are convention-discovered; see the discussion thread.)

Tests

PluginDoWithSpringMethodSpec covers: the Plugin no-op default, direct method-form registration against a BeanBuilder, the DefaultGrailsPlugin dispatch for the method form / both hooks / legacy closure form, and the warning emitted (and not emitted) depending on whether both forms are defined.

./gradlew clean aggregateViolations reports no Checkstyle / CodeNarc / PMD / SpotBugs violations.

Docs

Documents the new hook and the both-forms behavior in the plugin runtime-configuration guide (grails-doc).

@codecov

codecov Bot commented Jul 8, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 83.33333% with 2 lines in your changes missing coverage. Please review.
✅ Project coverage is 49.3797%. Comparing base (b5e583a) to head (13bc85c).
⚠️ Report is 4 commits behind head on 8.0.x.

Files with missing lines Patch % Lines
...groovy/org/grails/plugins/DefaultGrailsPlugin.java 81.8182% 2 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@                Coverage Diff                 @@
##                8.0.x     #15939        +/-   ##
==================================================
- Coverage     49.3909%   49.3797%   -0.0112%     
- Complexity      16808      16811         +3     
==================================================
  Files            1993       1993                
  Lines           93495      93504         +9     
  Branches        16360      16362         +2     
==================================================
- Hits            46178      46172         -6     
- Misses          40180      40197        +17     
+ Partials         7137       7135         -2     
Files with missing lines Coverage Δ
...-core/src/main/groovy/grails/plugins/Plugin.groovy 60.0000% <100.0000%> (+2.1053%) ⬆️
...groovy/org/grails/plugins/DefaultGrailsPlugin.java 48.6154% <81.8182%> (+0.6658%) ⬆️

... and 3 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@codeconsole codeconsole force-pushed the feat/plugin-dowithspring-method branch from 8b95c4c to 21a937d Compare July 8, 2026 18:08
@borinquenkid borinquenkid self-requested a review July 8, 2026 22:49
@bito-code-review

Copy link
Copy Markdown

It is recommended to throw an error if both forms are defined to prevent ambiguous configuration. Documenting the closure form as legacy and issuing a deprecation warning is a standard practice to guide users toward the preferred approach while maintaining backward compatibility.

@borinquenkid

Copy link
Copy Markdown
Member

(Analysis assisted by Claude Code — I reviewed and am posting the findings below, but flagging the tooling for transparency.)

Nice feature — the method-based doWithSpring(BeanBuilder) hook and its dispatch through DefaultGrailsPlugin are correctly implemented and well tested for Plugin-based plugin descriptors.

However, the PR description claims broader coverage than the diff actually delivers, and I think that gap is worth closing (or the description narrowing) before merge.

The hook isn't wired into GrailsApplicationLifeCycle at all

The description says the new hook is "added as a default no-op on GrailsApplicationLifeCycle" and "overridden as a no-op on ... GrailsApplicationLifeCycleAdapter", and that both dispatch sites — DefaultGrailsPlugin and GrailsApplicationPostProcessor — invoke both hooks. Checking the diff against 21a937de06c (this PR's head):

  • GrailsApplicationLifeCycle.groovy is untouched — the interface still only declares Closure doWithSpring():
    interface GrailsApplicationLifeCycle {
    /**
    * Sub classes should override to provide implementations
    *
    * @return A closure that defines beans to be registered by Spring
    */
    Closure doWithSpring()
  • GrailsApplicationLifeCycleAdapter.groovy is untouched — same, only the closure-returning override:
  • GrailsApplicationPostProcessor.groovy still only calls the closure form:
    if (lifeCycle) {
        def withSpring = lifeCycle.doWithSpring()
        if (withSpring) {
            def bb = new BeanBuilder(null, springConfig, application.classLoader)
            bb.beans(withSpring)
        }
    }
    if (lifeCycle) {
    def withSpring = lifeCycle.doWithSpring()
    if (withSpring) {
    def bb = new BeanBuilder(null, springConfig, application.classLoader)
    bb.beans(withSpring)
  • The new method exists only on Plugin, and (correctly, given the above) carries no @Override — it isn't implementing anything from the interface:
    @Override
    Closure doWithSpring() { null }
    /**
    * Registers Spring beans directly against the supplied {@link BeanBuilder}. This is the statically-compilable
    * alternative to {@link #doWithSpring()}: instead of returning a closure whose delegate the container wires up,
    * an implementation registers beans against the builder passed as an argument. Subclasses should override.
    *
    * Both hooks are honoured, so a subclass may override this method, {@link #doWithSpring()}, or both.
    *
    * @param beans The {@link BeanBuilder} to register beans against
    */
    void doWithSpring(BeanBuilder beans) {

Why this matters in practice

GrailsApplicationPostProcessor's lifeCycle field is typed GrailsApplicationLifeCycle, and a standard Grails app's Application class reaches it via GrailsAutoConfiguration implements GrailsApplicationClassGrailsApplicationClass implements GrailsApplicationLifeCycle (not Plugin):

So as written, only actual grails.plugins.Plugin subclasses dispatched through DefaultGrailsPlugin (i.e. plugin descriptors) can use the new hook. An app's own Application class — or any other GrailsApplicationLifeCycle implementor that isn't a Plugin — has no doWithSpring(BeanBuilder) method to override, and nothing would call it if it did.

Test coverage mirrors the gap

Every fixture class in PluginDoWithSpringMethodSpec extends Plugin (MethodHookPlugin, NoOpPlugin, MethodHookGrailsPlugin, BothHooksGrailsPlugin, LegacyClosureGrailsPlugin). Nothing exercises GrailsApplicationLifeCycleAdapter or GrailsApplicationPostProcessor, which is consistent with the interface/adapter/post-processor never actually being touched:
https://github.com/apache/grails-core/blob/21a937de06ccd318036e1d7cb1b0370c243225dd/grails-core/src/test/groovy/grails/plugins/PluginDoWithSpringMethodSpec.groovy

Suggestion

Either:

  1. Add doWithSpring(BeanBuilder) as a default no-op on GrailsApplicationLifeCycle, override it on GrailsApplicationLifeCycleAdapter, and dispatch it from GrailsApplicationPostProcessor alongside the closure form (with a test covering that path) — so the feature actually matches the description, or
  2. Narrow the PR description/docs to state this hook applies to plugin descriptors specifically (via Plugin/DefaultGrailsPlugin), not to the general GrailsApplicationLifeCycle contract or the application class.

@codeconsole codeconsole force-pushed the feat/plugin-dowithspring-method branch from 21a937d to 1a1b9e8 Compare July 9, 2026 02:24
Introduce a statically-compilable alternative to the closure-returning
doWithSpring() hook on the Plugin base class. Plugins can now register
beans by overriding doWithSpring(BeanBuilder) and calling the builder
directly, instead of returning a closure whose delegate the container
wires up at runtime.

The new hook is a no-op on the Plugin base class, and DefaultGrailsPlugin
dispatches it for Plugin descriptors. A plugin may override either
doWithSpring() or doWithSpring(BeanBuilder), but not both: the two forms
are alternatives, so defining both throws a PluginException and fails
plugin load rather than silently combining or preferring one. The legacy
closure-returning form and the legacy closure-property form on non-Plugin
descriptors remain fully supported.

The hook is intentionally scoped to the Plugin class and is NOT added to
the GrailsApplicationLifeCycle interface: that interface is map-coerced in
the testing support (GrailsApplicationBuilder builds
`[doWithSpring: {...}] as GrailsApplicationLifeCycle`), and Groovy's
map-to-interface proxies do not honour Java default methods, so an
interface-level hook would break every unit test that builds an
application context.

Adds PluginDoWithSpringMethodSpec covering the Plugin no-op, direct
method-form registration, the DefaultGrailsPlugin dispatch for the method
form and the legacy closure form, and the PluginException raised when both
forms are defined. Documents the new hook in the plugin runtime-
configuration guide.
@codeconsole codeconsole force-pushed the feat/plugin-dowithspring-method branch from 1a1b9e8 to 029aa5e Compare July 9, 2026 15:26
@codeconsole

Copy link
Copy Markdown
Contributor Author

Thanks — you're right, the description had drifted ahead of the diff. I took your option 2 and narrowed both the description and the scope: the hook lives on grails.plugins.Plugin and is dispatched by DefaultGrailsPlugin for plugin descriptors only. I've updated the PR description to match.

For the record on why not option 1 (wire it into GrailsApplicationLifeCycle): an earlier revision of this PR did exactly that — a default method on the interface, an override on GrailsApplicationLifeCycleAdapter, and dispatch from GrailsApplicationPostProcessor. It broke CI across every module that builds an app context in a unit test. The testing support map-coerces the interface:

// GrailsApplicationBuilder
super([doWithSpring: { -> doWithSpringClosure }] as GrailsApplicationLifeCycle, ...)

and Groovy's map-to-interface proxies don't honour Java default methods, so lifeCycle.doWithSpring(bb) threw MissingMethodException for the whole GrailsUnitTest path. So the interface-level version isn't a small follow-up — it needs the testing support reworked off map coercion first. Scoping to Plugin keeps this PR focused and safe; extending it to the application class can be a separate change.

Separately, per @jdaugherty's review, defining both hook forms is now a hard error (PluginException) rather than running both.

@borinquenkid borinquenkid left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Documentation fixed

@jdaugherty jdaugherty merged commit 30979e7 into apache:8.0.x Jul 9, 2026
30 of 51 checks passed
@testlens-app

testlens-app Bot commented Jul 9, 2026

Copy link
Copy Markdown

🚨 TestLens detected 1 failed test 🚨

Here is what you can do:

  1. Inspect the test failures carefully.
  2. If you are convinced that some of the tests are flaky, you can mute them below.
  3. Finally, trigger a rerun by checking the rerun checkbox.

Test Summary

CI / Functional Tests (Java 21, indy=true) > :grails-test-examples-app1:integrationTest

Test Runs Flakiness
ErrorsFunctionalSpec > Test Interceptor.afterView() has access to the exception if thrown 0% 🟢

🏷️ Commit: 13bc85c
▶️ Tests: 2320 executed
🟡 Checks: 30/54 completed

Test Failures

ErrorsFunctionalSpec > Test Interceptor.afterView() has access to the exception if thrown (:grails-test-examples-app1:integrationTest in CI / Functional Tests (Java 21, indy=true))
Condition not satisfied:

System.properties[ErrorsControllerInterceptor.PROPERTY] == 'Oops!'
|      |         ||                           |         |
|      |         ||                           |         false
|      |         ||                           exceptionMessage
|      |         |class functionaltests.ErrorsControllerInterceptor
|      |         null
|      [geb.build.reportsDir:/home/runner/work/grails-core/grails-core/grails-test-examples/app1/build/geb-reports, java.specification.version:21, is.grails.integration.test:true, sun.jnu.encoding:UTF-8, org.gradle.test.worker:355, java.class.path:/home/runner/.gradle/caches/9.6.0/workerMain/gradle-worker.jar:/home/runner/work/grails-core/grails-core/grails-test-examples/app1/build/classes/groovy/integrationTest:/home/runner/work/grails-core/grails-core/grails-test-examples/app1/build/classes/groovy/main:/home/runner/work/grails-core/grails-core/grails-test-examples/app1/build/resources/main:/home/runner/work/grails-core/grails-core/grails-test-examples/app1/build/classes/groovy/test:/home/runner/work/grails-core/grails-core/grails-test-examples/plugins/loadfirst/build/libs/grails-test-examples-plugins-loadfirst-0.1-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-test-examples/plugins/loadsecond/build/libs/grails-test-examples-plugins-loadsecond-0.1-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-test-examples/plugins/loadafter/build/libs/grails-test-examples-plugins-loadafter-0.1-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-dependencies/starter-web/build/libs/grails-dependencies-starter-web-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-gsp/grails-sitemesh3/build/libs/grails-sitemesh3-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-data-hibernate5/grails-plugin/build/libs/grails-data-hibernate5-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-cache/build/libs/grails-cache-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-scaffolding/build/libs/grails-scaffolding-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-geb/build/libs/grails-geb-8.0.0-SNAPSHOT-test-fixtures.jar:/home/runner/work/grails-core/grails-core/grails-geb/build/libs/grails-geb-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-testing-support-http-client/build/libs/grails-testing-support-http-client-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-fields/build/libs/grails-fields-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-testing-support-web/build/libs/grails-testing-support-web-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-testing-support-datamapping/build/libs/grails-testing-support-datamapping-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-spring-security/plugin/build/libs/grails-spring-security-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-async/plugin/build/libs/grails-async-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-gsp/plugin/build/libs/grails-gsp-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-testing-support-core/build/libs/grails-testing-support-core-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-codecs/build/libs/grails-codecs-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-console/build/libs/grails-console-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-interceptors/build/libs/grails-interceptors-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-rest-transforms/build/libs/grails-rest-transforms-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-url-mappings/build/libs/grails-url-mappings-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-controllers/build/libs/grails-controllers-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-test-core/build/libs/grails-test-core-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-converters/build/libs/grails-converters-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-databinding/build/libs/grails-databinding-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-domain-class/build/libs/grails-domain-class-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-web-boot/build/libs/grails-web-boot-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-gsp/grails-web-gsp-taglib/build/libs/grails-web-gsp-taglib-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-gsp/grails-web-jsp/build/libs/grails-web-jsp-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-mimetypes/build/libs/grails-mimetypes-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-validation/build/libs/grails-validation-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-i18n/build/libs/grails-i18n-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-web-core/build/libs/grails-web-core-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-gsp/grails-web-gsp/build/libs/grails-web-gsp-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-web-mvc/build/libs/grails-web-mvc-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-gsp/grails-web-taglib/build/libs/grails-web-taglib-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-web-url-mappings/build/libs/grails-web-url-mappings-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-web-databinding/build/libs/grails-web-databinding-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-web-common/build/libs/grails-web-common-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-gsp/core/build/libs/grails-gsp-core-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-gsp/grails-taglib/build/libs/grails-taglib-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-encoder/build/libs/grails-encoder-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-logging/build/libs/grails-logging-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-services/build/libs/grails-services-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-datamapping-support/build/libs/grails-datamapping-support-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-datasource/build/libs/grails-datasource-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-core/build/libs/grails-core-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-events/plugin/build/libs/grails-events-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-datastore-web/build/libs/grails-datastore-web-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-data-hibernate5/core/build/libs/grails-data-hibernate5-core-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-datamapping-core-test/build/libs/grails-datamapping-core-test-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-data-simple/build/libs/grails-data-simple-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-datamapping-core/build/libs/grails-datamapping-core-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-datamapping-validation/build/libs/grails-datamapping-validation-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-events/transforms/build/libs/grails-events-transforms-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-datastore-core/build/libs/grails-datastore-core-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-async/core/build/libs/grails-async-core-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-events/core/build/libs/grails-events-core-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-codecs-core/build/libs/grails-codecs-core-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-databinding-core/build/libs/grails-databinding-core-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-common/build/libs/grails-common-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-spring/build/libs/grails-spring-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-bootstrap/build/libs/grails-bootstrap-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-data-hibernate5/spring-orm/build/libs/grails-data-hibernate5-spring-orm-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-spring-security/compat/build/libs/grails-spring-security-compat-8.0.0-SNAPSHOT.jar:/home/runner/work/grails-core/grails-core/grails-gradle/model/build/libs/grails-gradle-model-8.0.0-SNAPSHOT.jar:/home/runner/.gradle/caches/modules-2/files-2.1/cloud.wondrify/asset-pipeline-gradle/5.2.0-M1/ac8d7fdd406613d9dc5b1f863eb0d7bbbda69215/asset-pipeline-gradle-5.2.0-M1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/com.h2database/h2/2.4.240/686180ad33981ad943fdc0ab381e619b2c2fdfe5/h2-2.4.240.jar:/home/runner/.gradle/caches/modules-2/files-2.1/cloud.wondrify/asset-pipeline-grails/5.2.0-M1/249bdafe5d589764f04a6347e37ff17452fd277e/asset-pipeline-grails-5.2.0-M1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.tomcat/tomcat-jdbc/11.0.22/c96634a0f838dcd70986325a91f00545a5b6b762/tomcat-jdbc-11.0.22.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.webjars.npm/jquery/3.7.1/abca7c4ab5c6ff5f533f5d7dbc646661c36c8b6b/jquery-3.7.1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/app.testlens/junit-platform-instrumentation/1.9.2/7be86237c7ea0a7834e0e899e887d039ab6dcad/junit-platform-instrumentation-1.9.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/cloud.wondrify/asset-pipeline-core/5.2.0-M1/ccdb59f4a04fd09db34d95794a0e00c4283d1417/asset-pipeline-core-5.2.0-M1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/com.google.javascript/closure-compiler-unshaded/v20260302/5a91c7cb776c07a9e5283403569ae8e04560150e/closure-compiler-unshaded-v20260302.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.ant/ant-junit/1.10.17/a139759a515accfaf008d8f34ab8f5ebf23a0f8d/ant-junit-1.10.17.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.ant/ant/1.10.17/fa8a13422ac460563171d10a37c3f28340a953f6/ant-1.10.17.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-text/1.15.0/9899093aa40f0199d6c39b131b8f087cdb37e399/commons-text-1.15.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.fusesource.jansi/jansi/2.4.2/ba7387c31622c6650b83edba1bbb115f1fe462ba/jansi-2.4.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.groovy.geb/geb-spock/8.0.1/40510fb07bc19bf7dfd1f219152c0ee87c497de1/geb-spock-8.0.1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.groovy/groovy-json/5.0.7/9e752dee94a1e7ca92dc135f1be9ed6fc31d91b/groovy-json-5.0.7.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.groovy.geb/geb-core/8.0.1/8ef83c8cb85f10f639cf5633b96c14949bf94ea9/geb-core-8.0.1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.groovy.geb/geb-ast/8.0.1/1aba132ea67e3beda4d599f6a8824d7daa6c9f9f/geb-ast-8.0.1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.groovy.geb/geb-waiting/8.0.1/715c1bef3c6263f3919659668afc2c2a8fd93b4a/geb-waiting-8.0.1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.groovy.geb/geb-implicit-assertions/8.0.1/30d830b88096a36a06f286fb2f091fbe72f3563f/geb-implicit-assertions-8.0.1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.groovy.geb/geb-exceptions/8.0.1/8c2af9b4831f9fb345a8ca099b8bee171afd54d/geb-exceptions-8.0.1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.groovy/groovy-templates/5.0.7/6539a9aa061c5823fbf68fb359bc3e3bbf8f29b2/groovy-templates-5.0.7.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.groovy/groovy-xml/5.0.7/ed68092d85ae235b4f615b7ebc8918964a8d9871/groovy-xml-5.0.7.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.spockframework/spock-core/2.4-groovy-5.0/d6c4b3a7b9475a8f0a0602559a005f9153a388d3/spock-core-2.4-groovy-5.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.groovy/groovy-swing/5.0.7/e4f9c0d17d7e184f749070910941cae8f383d423/groovy-swing-5.0.7.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.groovy/groovy-dateutil/5.0.7/68c36e4a863bfe01210d132ccc55ba37a812c338/groovy-dateutil-5.0.7.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.groovy/groovy-nio/5.0.7/a97cd3cfc8c63333723fd420427ae8f01176ac9a/groovy-nio-5.0.7.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.groovy/groovy-sql/5.0.7/1f6e511e2b342256da7d2f2f7ea0c3e0fa61b394/groovy-sql-5.0.7.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.groovy/groovy-test-junit5/5.0.7/db174bd099157c096b90b17696d274febbff74b5/groovy-test-junit5-5.0.7.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.groovy/groovy-test/5.0.7/e0946624cfd1abd9b885efbed8c64c6e48631b8a/groovy-test-5.0.7.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.groovy/groovy-macro/5.0.7/c55f86667a59f04ba2ea72bb56e2d8882c6854cc/groovy-macro-5.0.7.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.groovy/groovy/5.0.7/462cc090284c3ba8bfb9d9e6dbbcddf09112f1d3/groovy-5.0.7.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.groovy/groovy-groovysh/5.0.7/42ec88f71fe74042a9127fc6e1d196c82dde325f/groovy-groovysh-5.0.7.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.groovy/groovy-console/5.0.7/497a7a5c66dd868a7aad947171b54f9ac3acbd9f/groovy-console-5.0.7.jar:/home/runner/.gradle/caches/modules-2/files-2.1/com.github.javaparser/javaparser-core/3.28.2/f585a590072b20c6b4be3c35291b6e66a88b995/javaparser-core-3.28.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.jline/jline/3.30.6/62949dd8d8f8d490170e0e16918d754660d3689c/jline-3.30.6.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.jline/jline-terminal-jna/3.30.9/a08b53977e2966f52c222ee8aa4f7c42c21cf2d2/jline-terminal-jna-3.30.9.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.testcontainers/testcontainers-selenium/2.0.5/59777e963934263f6e40d7d07bf786d3c8839b46/testcontainers-selenium-2.0.5.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.testcontainers/testcontainers/2.0.5/7e5013c78fd678ba8958db23c6883274019f2f2f/testcontainers-2.0.5.jar:/home/runner/.gradle/caches/modules-2/files-2.1/com.github.docker-java/docker-java-transport-zerodep/3.7.1/6b1af9996b2004703a41e0fbbf1031cabbbe4e6b/docker-java-transport-zerodep-3.7.1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.19.1/ca303052cd617c1af2e2c8d344c98a706fb63143/jna-5.19.1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.objenesis/objenesis/3.4/675cbe121a68019235d27f6c34b4f0ac30e07418/objenesis-3.4.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.28.0/e482f2c7a88dac3c497e96aa420b6a769f59c8d7/commons-compress-1.28.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.22.0/6b3eb4beb7058c2a638f5f17bcb388649fd339dd/commons-codec-1.22.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-chrome-driver/4.43.0/822045d6e6b0efd00e7b2af735e5c3a7fc82490a/selenium-chrome-driver-4.43.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-support/4.43.0/9122ca3bed046f25fac2f80ea6c1f4a3348b449e/selenium-support-4.43.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-chromium-driver/4.43.0/3702dee4ca7c38a3f35de60012e37d74d6ef882b/selenium-chromium-driver-4.43.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-remote-driver/4.43.0/6ed17da6a0f3c3edba818bd486b621280147fd21/selenium-remote-driver-4.43.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-http/4.43.0/be9acd7cea740b5ecf68fc4237ae400b6bc2cceb/selenium-http-4.43.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/33.6.0-jre/c376b13067cc99a5774403530953f7b05a91e218/guava-33.6.0-jre.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.sitemesh/spring-boot-starter-sitemesh/3.3.0-M1/7825ae8d991aa751297e9eeab26b8fae1574099f/spring-boot-starter-sitemesh-3.3.0-M1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-web/4.1.0/fdc11627f32cb0cfad6adf9c283c7618e450f1a1/spring-boot-starter-web-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-jackson/4.1.0/2feada57005e69f8d939815af7400b43f2c07b9e/spring-boot-starter-jackson-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-jackson/4.1.0/bada14f54b1961279f9942c54b5039c90cd6a252/spring-boot-jackson-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/tools.jackson.core/jackson-databind/3.1.5/782178f0b1fe088803c03b85eb9a406f60519044/jackson-databind-3.1.5.jar:/home/runner/.gradle/caches/modules-2/files-2.1/tools.jackson.core/jackson-core/3.1.5/ccd7eb3269b8d33bc097b36770f367cdfe2f1150/jackson-core-3.1.5.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-actuator/4.1.0/bd15774d0bb852ab3d4f3bdbf7b134a51ef8063d/spring-boot-starter-actuator-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-tomcat/4.1.0/6dbb6ad6bb33b7f1ce15a5822cfd1443966245e0/spring-boot-starter-tomcat-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-validation/4.1.0/36c16acdbe1b86463616aeb218f18764c9baff2d/spring-boot-starter-validation-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-micrometer-metrics/4.1.0/e2b5a25dd872e30d15832626c0789db9a4c3657/spring-boot-starter-micrometer-metrics-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter/4.1.0/4d1f5fcf982ec75223a3ee44169e268b6dd044f7/spring-boot-starter-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-logging/4.1.0/f2e2615d9fb27a035a8fc7aef19670769739ae76/spring-boot-starter-logging-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-classic/1.5.37/7c95bc3f7a4d9ad53bf632272818a923c85b9ad3/logback-classic-1.5.37.jar:/home/runner/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-core/1.5.37/41df60907428d396d02134253eee8bd385a31601/logback-core-1.5.37.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.spockframework/spock-spring/2.4-groovy-5.0/bfc808279932b9682ad02448b23dae698cdf3922/spock-spring-2.4-groovy-5.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.sitemesh/spring-webmvc-sitemesh/3.3.0-M1/1400c777f87eaade51bd65685d1f6efec8ad75a/spring-webmvc-sitemesh-3.3.0-M1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.hibernate/hibernate-core-jakarta/5.6.15.Final/6effdb9a98e423e9faed9713e9954f093f79988c/hibernate-core-jakarta-5.6.15.Final.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-actuator-autoconfigure/4.1.0/a8c1a01cc75f6d39eb795d5cbc7c05d4b6c93ed/spring-boot-actuator-autoconfigure-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-autoconfigure/4.1.0/a921df4e39389e43dacac5615a1185708ee8a960/spring-boot-autoconfigure-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-webmvc/4.1.0/2cb542ef7d4fa572d3031616544db20b6f7de4c7/spring-boot-webmvc-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-servlet/4.1.0/a067e9b4b7c255a8587852b6eb842413cc458e70/spring-boot-servlet-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-starter-tomcat-runtime/4.1.0/6107a851e178c1233b64634270b11b8d5490733a/spring-boot-starter-tomcat-runtime-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-tomcat/4.1.0/502aeed70cb11c3754c365324acd9f3ee746354/spring-boot-tomcat-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-web-server/4.1.0/e67513b382c2cef7b8bc364e8e85cd7f0940e331/spring-boot-web-server-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-test/4.1.0/f6c9cb2cc423397ce6c7c8ab5eb4296734290ad0/spring-boot-test-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-health/4.1.0/5ac1d047f93ca1658bfcfda813b5da3f5bb6765b/spring-boot-health-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-validation/4.1.0/fcd0b07c0c7e29f42e495f91710154dbc81d2c8c/spring-boot-validation-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-http-converter/4.1.0/c3b90921e920dfa7dcb78a5045f18ca0e4bc0b44/spring-boot-http-converter-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-micrometer-metrics/4.1.0/91c5d35269ce2ae1b832180617b9a52fbfec4f29/spring-boot-micrometer-metrics-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-actuator/4.1.0/aff3955601271f4efdff207afeffa832fcb2835f/spring-boot-actuator-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot-micrometer-observation/4.1.0/f0e219fbac48d71acbabd7f4c8116f58d72d4102/spring-boot-micrometer-observation-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.boot/spring-boot/4.1.0/bcf26d4c27ab080ef60c13220e96a37d687f9e26/spring-boot-4.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework/spring-orm/7.0.8/8c40fad8ecc72337353818da54ef2d104b3fa7a9/spring-orm-7.0.8.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.codehaus.gpars/gpars/1.2.1/c3ea0fbcd67a163bd5e3a3efdaa3428262d0d437/gpars-1.2.1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/com.googlecode.concurrentlinkedhashmap/concurrentlinkedhashmap-lru/1.4.2/2eaf3d3c9746d526ff7e5b93931d482c3887e6ac/concurrentlinkedhashmap-lru-1.4.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/jakarta.servlet/jakarta.servlet-api/6.1.0/1169a246913fe3823782af7943e7a103634867c5/jakarta.servlet-api-6.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.junit.platform/junit-platform-suite/6.0.3/d9df7a006d55bc2d47f6b1da3bb776d30669f413/junit-platform-suite-6.0.3.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.junit.platform/junit-platform-suite-engine/6.0.3/daceed9785e8b3a7edd71333c2ae293659e5b9f5/junit-platform-suite-engine-6.0.3.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.junit.platform/junit-platform-launcher/6.0.3/4a721cdd640ebdaa4c6850f5eee0b0377cf698b0/junit-platform-launcher-6.0.3.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.junit.platform/junit-platform-engine/6.0.3/101305612e7daa4ce978d3ba73fd02dd4a5f22d9/junit-platform-engine-6.0.3.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.junit.platform/junit-platform-suite-api/6.0.3/95660f3de4514019b684993effcbafce94cadd3d/junit-platform-suite-api-6.0.3.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.junit.platform/junit-platform-commons/6.0.3/1093a7faa2ba47c28aa83f378d9a2083463bb20c/junit-platform-commons-6.0.3.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-engine/6.0.3/e26f7e17d06cfc85ba7643b5ad00c87d5f2084dd/junit-jupiter-engine-6.0.3.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.junit.jupiter/junit-jupiter-api/6.0.3/2e6cfb62db85350179f0408ed5270f7cdf8cefda/junit-jupiter-api-6.0.3.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.opentest4j/opentest4j/1.3.0/152ea56b3a72f655d4fd677fc0ef2596c3dd5e6e/opentest4j-1.3.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework/spring-webmvc/7.0.8/d08172cf66f9625a42935d596ca4c83d21265996/spring-webmvc-7.0.8.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework/spring-context-support/7.0.8/1c9bd9da34fca09f3423d86f8e33bd9c099232eb/spring-context-support-7.0.8.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.security/spring-security-web/7.1.0/cec1635393d11a56da5ff111253c88056d5cc0eb/spring-security-web-7.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.security/spring-security-acl/7.1.0/8c7e8f93298931ae542badbe34b9c31f096eb02a/spring-security-acl-7.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.security/spring-security-core/7.1.0/50064b46aed22d05aa181b2c95d47989c7c99160/spring-security-core-7.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework/spring-context/7.0.8/6c58b590fd8d71afc36797cf6555e82500f1eb64/spring-context-7.0.8.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework/spring-jdbc/7.0.8/f979da380cd01fd363510ca98a7f544d1959a914/spring-jdbc-7.0.8.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework/spring-tx/7.0.8/96c66acfb3920457421a9cb3648a32e62f42f815/spring-tx-7.0.8.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework/spring-web/7.0.8/d7cddac31ee023d25d37f48e2ff0e168cf635c14/spring-web-7.0.8.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework/spring-aop/7.0.8/b73e58e9b7dbc4db6b4ebbe3336be0e901b0d261/spring-aop-7.0.8.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework/spring-beans/7.0.8/829cdf4c82a9409e0e10922b9e57e2ef12d5f04d/spring-beans-7.0.8.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.javassist/javassist/3.30.2-GA/284580b5e42dfa1b8267058566435d9e93fae7f7/javassist-3.30.2-GA.jar:/home/runner/.gradle/caches/modules-2/files-2.1/args4j/args4j/2.33/bd87a75374a6d6523de82fef51fc3cfe9baf9fc9/args4j-2.33.jar:/home/runner/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.13.2/48b8230771e573b54ce6e867a9001e75977fe78e/gson-2.13.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/com.github.ben-manes.caffeine/caffeine/3.2.4/c63b303adf59c733d2a96125ad6670e938a2c15d/caffeine-3.2.4.jar:/home/runner/.gradle/caches/modules-2/files-2.1/com.google.errorprone/error_prone_annotations/2.49.0/8b42a2e3865f6e0576da3fad51dbb96732ff0f14/error_prone_annotations-2.49.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.3/aeaffd00d57023a2c947393ed251f0354f0985fc/failureaccess-1.0.3.jar:/home/runner/.gradle/caches/modules-2/files-2.1/com.google.protobuf/protobuf-java/4.34.2/a0df183b985b193d7a0247029d04b14374c6cc35/protobuf-java-4.34.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/com.google.re2j/re2j/1.8/12c25e923e9e4fb1575a7640a2698745c6f19a94/re2j-1.8.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework/spring-test/7.0.8/a69fb470b6fbf2960552150e4a37e6903dbd2f49/spring-test-7.0.8.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework/spring-expression/7.0.8/bb844eefd513820e356b575d7ea0f7084147af59/spring-expression-7.0.8.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework/spring-core/7.0.8/25f5ebd179f92d7d12779e3761c96da4b0109ad/spring-core-7.0.8.jar:/home/runner/.gradle/caches/modules-2/files-2.1/io.micrometer/micrometer-jakarta9/1.17.0/e8a0380f6a92110cd76d7d9a329a3c57740c6e3f/micrometer-jakarta9-1.17.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/io.micrometer/micrometer-core/1.17.0/b71d95b2819c5959bedf186e9a667e932b573dad/micrometer-core-1.17.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/io.micrometer/micrometer-observation/1.17.0/2037bdaeb5725bdddb2390cbf93be3c19f8b8b48/micrometer-observation-1.17.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-manager/4.43.0/3257b6f3aa8c895d963c420dbb726ecda97ce9c/selenium-manager-4.43.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-json/4.43.0/c30951c919c1066f7e403539f28fb9179c51ad3/selenium-json-4.43.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-os/4.43.0/d6edd474f2dac25168382cf68322b116593f8ade/selenium-os-4.43.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.seleniumhq.selenium/selenium-api/4.43.0/5e3343e4c0efe3a6b3d7d9783f1fa16ef67db39c/selenium-api-4.43.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/io.micrometer/micrometer-commons/1.17.0/2edbb561cdd2b2777fbcd83aa9f2204ebabf592b/micrometer-commons-1.17.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.jspecify/jspecify/1.0.0/7425a601c1c7ec76645a78d22b8c6a627edee507/jspecify-1.0.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.graalvm.js/js-language/24.1.2/e0c9e3c1bff05311b022b633744964fe9ee601eb/js-language-24.1.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.graalvm.truffle/truffle-runtime/24.1.2/391459b97b8c1594f5549589ed0ed51d7224682e/truffle-runtime-24.1.2.jar:/home/runner/work/grails-core/grails-core/grails-gradle/common/build/libs/grails-gradle-common-8.0.0-SNAPSHOT.jar:/home/runner/.gradle/caches/modules-2/files-2.1/com.github.docker-java/docker-java-api/3.7.1/2df91233a782749e85139991cc94d4ef40b59038/docker-java-api-3.7.1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/com.fasterxml.jackson.core/jackson-annotations/2.21/b1bc1868bf02dc0bd6c7836257a036a331005309/jackson-annotations-2.21.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-to-slf4j/2.25.4/68df56640a5d245192e91bd2ac89e504b477cc10/log4j-to-slf4j-2.25.4.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.25.4/89ff2217b193fb187b134aa6ebcbfa8a28b018a9/log4j-api-2.25.4.jar:/home/runner/.gradle/caches/modules-2/files-2.1/io.opentelemetry/opentelemetry-exporter-logging/1.62.0/79ec5f1f23e00da7a8c8a30136cfbfaf9aa38f93/opentelemetry-exporter-logging-1.62.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/io.opentelemetry/opentelemetry-sdk-extension-autoconfigure/1.62.0/302abf92628ded497d03218ccf9c652887a7da86/opentelemetry-sdk-extension-autoconfigure-1.62.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/io.opentelemetry/opentelemetry-sdk-extension-autoconfigure-spi/1.62.0/99bbc1bf4cae62c793e6eaa3f41436e29710b876/opentelemetry-sdk-extension-autoconfigure-spi-1.62.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/io.opentelemetry/opentelemetry-sdk/1.62.0/6fa52c4641322b14b8bd515eb048bb9b1365d0c/opentelemetry-sdk-1.62.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/io.opentelemetry/opentelemetry-sdk-trace/1.62.0/7a337d2f887b151d27e734d1c221eb51b1c5b734/opentelemetry-sdk-trace-1.62.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/io.opentelemetry/opentelemetry-sdk-metrics/1.62.0/5838371075930a4a15f7f61240b4b64cb3e924d8/opentelemetry-sdk-metrics-1.62.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/io.opentelemetry/opentelemetry-sdk-logs/1.62.0/f242422084100da0bd3a5f6f2bcf364aaf4d2c53/opentelemetry-sdk-logs-1.62.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/io.opentelemetry/opentelemetry-sdk-common/1.62.0/b6742282daab8e13598b78a83ddfa54f10b5752b/opentelemetry-sdk-common-1.62.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/io.opentelemetry/opentelemetry-api/1.62.0/c4ee83d77005567852a72e08b945ebb023be1daa/opentelemetry-api-1.62.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/io.opentelemetry/opentelemetry-context/1.62.0/365cee4d1f365e4d4a05654742b50aa436c2dd8e/opentelemetry-context-1.62.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/io.opentelemetry/opentelemetry-common/1.62.0/e6468bd64a94429b68761f7c13e143c3fdfaafc7/opentelemetry-common-1.62.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.springframework.security/spring-security-crypto/7.1.0/819461a33c5b10b92bb1a125db933a17fc0db792/spring-security-crypto-7.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/net.bytebuddy/byte-buddy/1.18.10/5b34812ced047973a6d42654d50c3b69124ce587/byte-buddy-1.18.10.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.hibernate.validator/hibernate-validator/9.1.0.Final/53505ad984428ab42b4a4f3456aab9ec343bf2f2/hibernate-validator-9.1.0.Final.jar:/home/runner/.gradle/caches/modules-2/files-2.1/com.fasterxml/classmate/1.7.3/f61c7e7b81e9249b0f6a05914eff9d54fb09f4a0/classmate-1.7.3.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.20.0/65897b3e5731220962e659e001904af3c3cbeba9/commons-lang3-3.20.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.3.6/63e78ca6cd446c0ad166d14f03ed99e7efb3896d/commons-logging-1.3.6.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.ehcache/ehcache/3.12.0/bf2f57e7614e362ff5ed2c7388c4bb33e1d374dc/ehcache-3.12.0-jakarta.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.glassfish.jaxb/jaxb-runtime/4.0.9/500c199572538675d2819c938fbafe34935d8d6b/jaxb-runtime-4.0.9.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.glassfish.jaxb/jaxb-core/4.0.9/3f32ec949d109d666fa30994223d1c25a47b105f/jaxb-core-4.0.9.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.glassfish.jaxb/txw2/4.0.9/70325ebdebca3e7aae1dfa395fd41fc25d8a6f4e/txw2-4.0.9.jar:/home/runner/.gradle/caches/modules-2/files-2.1/junit/junit/4.13.2/8ac9e16d933b6fb43bc7f576336b8f4d7eb5ba12/junit-4.13.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest-core/3.0/254f69f4b0ca22198acfc19fcdd5f96140431c3e/hamcrest-core-3.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.hamcrest/hamcrest/3.0/8fd9b78a8e6a6510a078a9e30e9e86a6035cfaf7/hamcrest-3.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/jakarta.xml.bind/jakarta.xml.bind-api/4.0.5/161811f36cad3c65991502e80317f2f6703361df/jakarta.xml.bind-api-4.0.5.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.eclipse.angus/angus-activation/2.0.3/7f80607ea5014fef0b1779e6c33d63a88a45a563/angus-activation-2.0.3.jar:/home/runner/.gradle/caches/modules-2/files-2.1/jakarta.activation/jakarta.activation-api/2.1.4/9e5c2a0d75dde71a0bedc4dbdbe47b78a5dc50f8/jakarta.activation-api-2.1.4.jar:/home/runner/.gradle/caches/modules-2/files-2.1/jakarta.annotation/jakarta.annotation-api/3.0.0/54f928fadec906a99d558536756d171917b9d936/jakarta.annotation-api-3.0.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/jakarta.inject/jakarta.inject-api/2.0.1/4c28afe1991a941d7702fe1362c365f0a8641d1e/jakarta.inject-api-2.0.1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/jakarta.persistence/jakarta.persistence-api/3.2.0/bb75a113f3fa191c2c7ee7b206d8e674251b3129/jakarta.persistence-api-3.2.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/jakarta.transaction/jakarta.transaction-api/2.0.1/51a520e3fae406abb84e2e1148e6746ce3f80a1a/jakarta.transaction-api-2.0.1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/jakarta.validation/jakarta.validation-api/3.1.1/ec8622148afc5564235d17af80ea80288d0e7f92/jakarta.validation-api-3.1.1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/javax.cache/cache-api/1.1.1/c56fb980eb5208bfee29a9a5b9d951aba076bd91/cache-api-1.1.1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.hibernate.common/hibernate-commons-annotations/5.1.2.Final/e59ffdbc6ad09eeb33507b39ffcf287679a498c8/hibernate-commons-annotations-5.1.2.Final.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.jboss.logging/jboss-logging/3.6.3.Final/1cc9f976725720bb4a66f80af3e3aa6b9890d969/jboss-logging-3.6.3.Final.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.slf4j/jcl-over-slf4j/2.0.18/fb36c10c70e27bb427bb3cec86ac30bb83f667c7/jcl-over-slf4j-2.0.18.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.slf4j/jul-to-slf4j/2.0.18/79739c98001d5c9d078d087d5a348ec9e474ec8f/jul-to-slf4j-2.0.18.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.jodd/jodd-lagarto/6.0.6/a402ef17195531647c1d6f74f64963cfa5729a19/jodd-lagarto-6.0.6.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/2.0.18/78a9e7a37cd6360e0b818e86341b24123d28d4df/slf4j-api-2.0.18.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.yaml/snakeyaml/2.6/2bc14918a2f8d5414749ab12d0c590cd3198b8c1/snakeyaml-2.6.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.tomcat.embed/tomcat-embed-websocket/11.0.22/5686ff1ad745491d981d771514027d8fc55aed4f/tomcat-embed-websocket-11.0.22.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.tomcat.embed/tomcat-embed-core/11.0.22/cc7307efaa60c0d31784bf053ec4aa48a404f44b/tomcat-embed-core-11.0.22.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.tomcat.embed/tomcat-embed-el/11.0.22/db92447e16c3561e9ca7bf9311b6b6389816699e/tomcat-embed-el-11.0.22.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.multiverse/multiverse-core/0.7.0/db77d55199bc5672f05f5d725b70dd10033251ed/multiverse-core-0.7.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.codehaus.jsr166-mirror/jsr166y/1.7.0/8547fcb1c29b4f8c745c3f49a536aca58fc30f54/jsr166y-1.7.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.glassfish.expressly/expressly/5.0.0/78637fec7db6414c3ad32f3aa9e5d6610a299e5b/expressly-5.0.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/commons-validator/commons-validator/1.9.0/26e49d333890ccad072eb530a85fceb9c07818df/commons-validator-1.9.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.graalvm.regex/regex/24.1.2/c9850df88d2e8e99ca3103e8a28cf8d34f08cf5b/regex-24.1.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.graalvm.truffle/truffle-api/24.1.2/9f4f7b88626ff41c953e22a040fa83629ca77b17/truffle-api-24.1.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.graalvm.polyglot/polyglot/24.1.2/8f954ecda2c30def4cbd6f90d3871fa803a24d5/polyglot-24.1.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.graalvm.shadowed/icu4j/24.1.2/1a806bec5fad11a030eb0d6177d2c9b6e227b7e/icu4j-24.1.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.graalvm.sdk/jniutils/24.1.2/52b1040d974d3ba992e0c2d49c6af29dbacaaadf/jniutils-24.1.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.graalvm.truffle/truffle-compiler/24.1.2/1b613727530b52a3d855b09b2109084718375489/truffle-compiler-24.1.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.ant/ant-launcher/1.10.17/a65884e1ff214f724a6e9c089365c71935c488e4/ant-launcher-1.10.17.jar:/home/runner/.gradle/caches/modules-2/files-2.1/com.google.guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/b421526c5f297295adef1c886e5246c39d4ac629/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar:/home/runner/.gradle/caches/modules-2/files-2.1/com.google.j2objc/j2objc-annotations/3.1/a892ca9507839bbdb900d64310ac98256cab992f/j2objc-annotations-3.1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/io.leangen.geantyref/geantyref/1.3.16/177fe050a1ecc6f121bd3ffa511f2f5ce9099f00/geantyref-1.3.16.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.sitemesh/sitemesh/3.3.0-M1/1c8af997778cf7a561c6d3ad248b08e0c2f9ec96/sitemesh-3.3.0-M1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/com.google.auto.service/auto-service-annotations/1.1.1/da12a15cd058ba90a0ff55357fb521161af4736d/auto-service-annotations-1.1.1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.tomcat/tomcat-juli/11.0.22/d027d750f23ed42984f2c7b1c265ee56dc59086b/tomcat-juli-11.0.22.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.10.1/7bb9d450e8d4cbf9f9e04096c44bbfe7fba80b15/asm-util-9.10.1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.apache.ivy/ivy/2.5.3/163b4d6b330cd4590a05f3e97a6eb8bf5b54665e/ivy-2.5.3.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.abego.treelayout/org.abego.treelayout.core/1.0.3/457216e8e6578099ae63667bb1e4439235892028/org.abego.treelayout.core-1.0.3.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.jline/jansi/3.30.9/b872f641610b8a364be9ef5818b6adb440812721/jansi-3.30.9.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.jline/jline-console/3.30.9/28e88270a6e08fedcca43d10f9236df514a01bbf/jline-console-3.30.9.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.jline/jline-builtins/3.30.9/de079bdc66be5664b0d560558b5bd2e77aa0619f/jline-builtins-3.30.9.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.jline/jline-reader/3.30.9/1d029657522c5e74bc3e5c2eb85ac0937066f1c4/jline-reader-3.30.9.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.jline/jline-terminal-jni/3.30.9/dfe7a3a9b84483987c2b54fdf8973bd190c3fbb/jline-terminal-jni-3.30.9.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.jline/jline-terminal-jansi/3.30.9/9b5c0ee775e2c364af22591545b3fa37dd05dc60/jline-terminal-jansi-3.30.9.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.jline/jline-style/3.30.9/3329224943339d1bd166cbbf4d357eef6107b4ad/jline-style-3.30.9.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.jline/jline-terminal/3.30.9/d0e4c03f96fa7801735cbfd3249583892bf84e2e/jline-terminal-3.30.9.jar:/home/runner/.gradle/caches/modules-2/files-2.1/antlr/antlr/2.7.7/83cd2cd674a217ade95a4bb83a8a14f351f48bd0/antlr-2.7.7.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.jboss/jandex/2.4.2.Final/1e1c385990b258ff1a24c801e84aebbacf70eb39/jandex-2.4.2.Final.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.dom4j/dom4j/2.1.3/a75914155a9f5808963170ec20653668a2ffd2fd/dom4j-2.1.3.jar:/home/runner/.gradle/caches/modules-2/files-2.1/jakarta.el/jakarta.el-api/5.0.0/2a22b304920f43d6427cdefb5ce5f6726e2a63a3/jakarta.el-api-5.0.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/commons-collections/commons-collections/3.2.2/8ad72fe39fa8c91eaaf12aadb21e0c3661fe26d5/commons-collections-3.2.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.graalvm.sdk/collections/24.1.2/7a081164c92e34c7d659085aa75e47df60765f10/collections-24.1.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.graalvm.sdk/nativeimage/24.1.2/7565eb3a984f7aece7769950e936ec12638977b6/nativeimage-24.1.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.jodd/jodd-core/5.3.0/3faea779714e015f8ec9f1eb552d6f06f3c5b40c/jodd-core-5.3.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.threeten/threeten-extra/1.8.0/d3b1ac7e361b642132e529f562622aac7dfea752/threeten-extra-1.8.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.10.1/8d49f14d51f632cb1d87c88d1ceaf50db0d8af1b/asm-analysis-9.10.1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.10.1/e244332a17564c1d1572449399a842de35881be2/asm-tree-9.10.1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.10.1/ada2141c0cc52ee8f5c48cd5fa4ce0e794f22236/asm-9.10.1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.jline/jline-native/3.30.9/7e2da6b1d204e2a6eb9a2f07068a212b7aa80b93/jline-native-3.30.9.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.rnorth.duct-tape/duct-tape/1.0.8/92edc22a9ab2f3e17c9bf700aaee377d50e8b530/duct-tape-1.0.8.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.graalvm.sdk/word/24.1.2/58113ba6514ffe9a702ba9e6998655f44ea70b66/word-24.1.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.jodd/jodd-util/6.1.0/813ab31c6f4dcda13a9eb960d5876d37564d5a22/jodd-util-6.1.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.20.0/36f3474daec2849c149e877614e7f979b2082cd2/commons-io-2.20.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/17.0.0/8ceead41f4e71821919dbdb7a9847608f1a938cb/annotations-17.0.0.jar:/home/runner/.gradle/caches/modules-2/files-2.1/com.github.docker-java/docker-java-transport/3.7.1/7b8f1b7486e83f2871d9f98a7e12c529dfddc9c2/docker-java-transport-3.7.1.jar:/home/runner/.gradle/caches/modules-2/files-2.1/org.hdrhistogram/HdrHistogram/2.2.2/7959933ebcc0f05b2eaa5af0a0c8689fa257b15c/HdrHistogram-2.2.2.jar:/home/runner/.gradle/caches/modules-2/files-2.1/com.sun.istack/istack-commons-runtime/4.1.2/18ec117c85f3ba0ac65409136afa8e42bc74e739/istack-commons-runtime-4.1.2.jar, grails.env.initializing:false, grails.geb.atCheckWaiting.enabled:true, java.vm.vendor:BellSoft, sun.arch.data.model:64, grails.geb.timeouts.timeout:30, info.app.version:0.1, user.variant:, java.vendor.url:https://bell-sw.com/, catalina.useNaming:false, user.timezone:Etc/UTC, org.jboss.logging.provider:slf4j, grails.project.target.dir:build, java.vm.specification.version:21, os.name:Linux, user.country:, sun.java.launcher:SUN_STANDARD, sun.boot.library.path:/opt/hostedtoolcache/Java_Liberica_jdk/21.0.11-11/x64/lib, sun.java.command:worker.org.gradle.process.internal.worker.GradleWorkerMain 'Gradle Test Executor 355', base.dir:/home/runner/work/grails-core/grails-core/grails-test-examples/app1, jdk.debug:release, sun.cpu.endian:little, user.home:/home/runner, user.language:en, java.specification.vendor:Oracle Corporation, java.version.date:2026-04-21, java.home:/opt/hostedtoolcache/Java_Liberica_jdk/21.0.11-11/x64, grails.geb.reporting.directory:/home/runner/work/grails-core/grails-core/grails-test-examples/app1/build/geb-reports, file.separator:/, org.grails.MAIN_CLASS_NAME:functionaltests.Application, java.vm.compressedOopsMode:32-bit, line.separator:
|      , foo.bar:test, java.vm.specification.vendor:Oracle Corporation, java.specification.name:Java Platform API Specification, FILE_LOG_CHARSET:UTF-8, java.awt.headless:true, TESTCONFIG:, info.app.name:grails-test-examples-app1, sun.management.compiler:HotSpot 64-Bit Tiered Compilers, java.runtime.version:21.0.11+11-LTS, user.name:runner, stdout.encoding:UTF-8, path.separator::, otel.metrics.exporter:none, os.version:6.17.0-1018-azure, java.runtime.name:OpenJDK Runtime Environment, otel.traces.exporter:none, file.encoding:UTF-8, java.vm.name:OpenJDK 64-Bit Server VM, java.vendor.url.bug:https://bell-sw.com/support, otel.logs.exporter:none, java.io.tmpdir:/tmp, catalina.home:/tmp/tomcat.0.6417985464665117789, grails.env:test, java.version:21.0.11, user.dir:/home/runner/work/grails-core/grails-core/grails-test-examples/app1, os.arch:amd64, grails.http.client.timeout:120, java.vm.specification.name:Java Virtual Machine Specification, PID:24673, info.app.grailsVersion:8.0.0-SNAPSHOT, org.gradle.internal.worker.tmpdir:/home/runner/work/grails-core/grails-core/grails-test-examples/app1/build/tmp/integrationTest/work, grails.env.standalone:true, CONSOLE_LOG_CHARSET:UTF-8, catalina.base:/tmp/tomcat.0.6417985464665117789, native.encoding:UTF-8, java.library.path:/usr/java/packages/lib:/usr/lib64:/lib64:/lib:/usr/lib, java.vm.info:mixed mode, sharing, stderr.encoding:UTF-8, java.vendor:BellSoft, java.vm.version:21.0.11+11-LTS, sun.io.unicode.encoding:UnicodeLittle, grails.full.stacktrace:, java.class.version:65.0]
class java.lang.System

	at functionaltests.ErrorsFunctionalSpec.$tt__$spock_feature_1_4(ErrorsFunctionalSpec.groovy:74)
	at functionaltests.ErrorsFunctionalSpec.Test Interceptor.afterView() has access to the exception if thrown_closure5(ErrorsFunctionalSpec.groovy)
	at grails.gorm.transactions.GrailsTransactionTemplate$1.doInTransaction(GrailsTransactionTemplate.groovy:72)
	at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:137)
	at grails.gorm.transactions.GrailsTransactionTemplate.executeAndRollback(GrailsTransactionTemplate.groovy:69)
	at functionaltests.ErrorsFunctionalSpec.Test Interceptor.afterView() has access to the exception if thrown(ErrorsFunctionalSpec.groovy)
expected actual
Oops! null

Muted Tests

Note

Checks are currently running using the configuration below.

Select tests to mute in this pull request:

🔲 ErrorsFunctionalSpec > Test Interceptor.afterView() has access to the exception if thrown

Reuse successful test results:

🔲 ♻️ Only rerun the tests that failed or were muted before

Click the checkbox to trigger a rerun:

🔲 Rerun jobs


Learn more about TestLens at testlens.app.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants