https://grails.org/ logo
Join Slack
Powered by
# questions
  • t

    Thomas Rasmussen

    06/19/2025, 8:12 AM
    I am upgrading to Grails 7 M4 and I can't figure out what the new coordinates for this plugin is? apply plugin: 'org.grails.grails-plugin'
    j
    • 2
    • 9
  • d

    Dave

    06/19/2025, 2:52 PM
    Hi all, has anyone used PGVector with Grails (6) to store vector embeddings in a Postgres DB?. It doesn't seem to play nicely out of the box and looks like I have to roll my own Usertype. Just curious if others have had the same experience or whether I'm missing something from my field mapping.
    s
    • 2
    • 2
  • b

    Brandon Ray

    06/19/2025, 4:44 PM
    Hi everyone, I’m working on upgrading from 7 M3 to M4, but a lot of the plugins we rely on still only have M3 versions. Is there a plan to upgrade all of these in the near-term? e.g. https://repo.grails.org/ui/native/core/org/grails/plugins/spring-security-core/
    j
    • 2
    • 3
  • t

    Thomas Rasmussen

    06/23/2025, 6:55 AM
    build-test-data plugin Does anyone know the maintainer of the build-test-data plugin? The 6.0.0-M1 version released in january fails with the Grails 7.0.0-M4 release. I have opened a pull request https://github.com/longwa/build-test-data/pull/123
    j
    j
    • 3
    • 10
  • u

    user

    06/24/2025, 9:24 AM
    I felt that this is a nit in the document and added a fix, can someone kindly review and confirm if this is a nit please? https://github.com/apache/grails-spring-security/pull/1136
    👍 1
  • u

    user

    06/24/2025, 3:29 PM
    Hi all, we are using a token issued by an IdP with which we are not directly integrated using Oauth and we would like to validate the incoming JWT token and then add the user from the JWT a security-context so that our usual authorization flow could kick in. Is there a way we can use the spring-security-rest to do the token validation for us even though we are not generating any token? https://github.com/apache/grails-spring-security/blob/7.0.x/plugin-rest/docs/src/docs/tokenValidation.adoc
    j
    u
    • 3
    • 6
  • i

    IndianerJones

    06/25/2025, 6:33 AM
    Hi everyone, I’m running into an issue with Maven repository authentication in Grails after a change on our GitLab instance. We are running Grails 2.5.6 in a legacy project and now we have issues with our Repo. Previously, I used the following configuration in my BuildConfig.groovy and it worked fine until GitLab switched to requiring preemptive authentication:
    Copy code
    repositories {
        inherits true
        grailsCentral()
        mavenCentral()
        mavenRepo("<https://gitlab.company.net/api/v4/groups/dev/-/packages/maven>") {
            auth([
                username: "oauth",
                password: props.get("gitlabMavenPassword") as String ?: System.getenv("CI_JOB_TOKEN")
            ])
        }
    }
    Since the change, Grails only sends the authentication header after receiving a 401 response, but GitLab now expects the authentication header on the very first request (preemptive authentication). I tried something like this (hoping to force preemptive authentication):
    Copy code
    repositories {
        inherits true
        grailsCentral()
        mavenCentral()
        mavenRepo("<https://gitlab.company.net/api/v4/groups/dev/-/packages/maven>") {
            auth([
                username: "oauth",
                password: props.get("gitlabMavenPassword") as String ?: System.getenv("CI_JOB_TOKEN"),
                type    : "basic"
            ])
        }
    }
    But it doesn’t seem to help—Grails still only sends the header after the 401 response. Question: Is there a way to configure Grails (in BuildConfig.groovy or elsewhere) to force sending the authentication header on the first request (i.e., enable preemptive HTTP Basic Auth for Maven repositories)? Or is there another workaround for this situation? Thanks in advance for your help!
    s
    • 2
    • 6
  • u

    user

    06/26/2025, 11:44 AM
    I'm curious about dependencies and I've just posted a question on Stackoverflow (https://stackoverflow.com/questions/79680430/apache-grails-7-0-0-m4-dependency-on-groovy-4-0-27-and-why-groovy-4-0-26-is-show)
    j
    u
    • 3
    • 2
  • r

    rss

    06/26/2025, 12:04 PM
    Apache Grails 7.0.0-M4 dependency on Groovy 4.0.27 and why Groovy 4.0.26 is shown in my dependecies tree I'm moving my team's project from Grails 7.0.0-M1 to 7.0.0-M4 and it kinda works, but I'm new to Grails/Groovy/Gradle/... and curious so I run ./gradlew dependencies | less and notices a blockk like this: 17 │ compileClasspath - Compile classpath for source set 'main'. 18 │ +--- org.apache.grailsgrails bom7.0.0-M4 19 │ | +--- org.springframework.bootspring boot dependencies3.5.0 ... 211 │ | +--- org.apache.grails.commongrails common7.0.0-M4 212 │ | | +---...
  • u

    user

    06/26/2025, 1:58 PM
    Hi All, I have a custom built Filter by extending
    OncePerRequestFilter
    which I use to do some authentication. How do I make them work or skip based on path pattern by using
    grails.plugin.springsecurity.filterChain.chainMap
    ? Now no matter what I specify in the chainMap it gets invoked for every request that lands in our app.
    u
    • 2
    • 1
  • u

    user

    06/26/2025, 2:34 PM
    I have an API called
    /process/object
    which works fine without any auth, and by default my filterChain in
    application.groovy
    looks like this
    Copy code
    grails.plugin.springsecurity.filterChain.chainMap = [
        [pattern: '/**', filters: 'JOINED_FILTERS']
        ]
    Now, I have defined a new filter called
    tokenAuthenticationFilter
    by extending
    OncePerRequestFilter
    and I am registering this filter under application.groovy like
    Copy code
    grails.plugin.springsecurity.filterChain.filterNames = ['tokenAuthenticationFilter']
    grails.plugin.springsecurity.filterChain.chainMap = [
        [pattern: '/**', filters: 'JOINED_FILTERS,-tokenAuthenticationFilter']
        ]
    As soon as I do this, I get the below chain of exceptions,
    Copy code
    2025-06-26 15:32:54.366 [http-nio-8080-exec-1] ERROR o.a.c.c.C.[.[.[.[dispatcherServletRegistration] - Servlet.service() for servlet [dispatcherServletRegistration] in context with path [] threw exception  
    org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext
    	at org.springframework.security.access.intercept.AbstractSecurityInterceptor.credentialsNotFound(AbstractSecurityInterceptor.java:350)
    	at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:214)
    	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115)
    How can I explicity disable Auth for this? All I have done is introduce a new filter
    j
    u
    • 3
    • 2
  • u

    user

    06/26/2025, 2:50 PM
    Can I use
    anonymousAuthenticationFilter
    to pass through this?
  • l

    lmatuszewski

    06/30/2025, 9:52 AM
    Hi all! I would like to ask what is the status of hot reloading in Grails 7? I think it was using SpringLoaded before M4 and in M4 spring-boot-devtools were added and now the app is being restarted after every controller change. Is this intentional?
    j
    • 2
    • 1
  • s

    Stephen Lynch

    06/30/2025, 12:19 PM
    Codecs such as Base64CodecExtensionMethods.groovy were moved out of grails-codecs into a new package called grails-codecs-core. How are these default groovy extensions loaded? Previously these would be loaded through the gsp plugin -> grails-codecs dependency. In latest Grails 7, these appear not to be loaded any more so calls to x.encodeAsBase64 / x.encodeAsMD5() no longer work. Is this a bug / or a breaking change that is not documented? grails-codecs-core is not published in maven either?
    j
    • 2
    • 2
  • s

    seanleblanc

    07/01/2025, 8:37 PM
    I’m trying to determine what might be the recommended approach (in Grails 6) for building out a rest endpoint, including being able to generate an OpenAPI spec
    j
    m
    c
    • 4
    • 11
  • u

    user

    07/03/2025, 1:01 AM
    Hey everyone, we recently ran into an issue related to this GitHub ticket: https://github.com/apache/grails-core/issues/11376. Could someone provide more details? I’d like to better understand how Grails handles this internally.
    j
    u
    a
    • 4
    • 6
  • t

    Tung

    07/03/2025, 3:38 PM
    Is it possible to run a cron job on demand in services? The job will be called once after an hour, for example.
    j
    g
    j
    • 4
    • 3
  • r

    Richard Rice

    07/03/2025, 7:26 PM
    Is anyone able to configure a datasource to connect to snowflake? Specifically when using a private key to do so? When I try in my
    application.groovy
    it seems to be looking for a
    username
    when I want it to only read the properties in the props I provide. (@jdaugherty chatting with @gsandrew on this issue and he said you might have an idea)
    j
    j
    g
    • 4
    • 3
  • c

    cjchalmers

    07/11/2025, 9:06 AM
    I am using Grails 6 to generate an API service. Im running into an issue when I use views to expose data. I am using Controllers that extend from RestfulController, I have simple Domain objects with limited properties and a couple of relationships. The issue arises when I have Domain classes that use CamelCase such as ClinicalCenter or MolecularMarker. Using names such as Patient is no problem. Taking the latter case; I would have a folder called patient and therein a file called _patient.gson to show the data, works as expected. Taking the first example, I would have a view folder called molecularMarker and therin a file called _molecularMarker.gson, with almost the same data as patient but I keep getting the error below. I have tried other names, such as ClinicalCenter, and all give a similar error. If I were just to use Clinic then that does work. Am I missing something that I should be configuring/setting/naming? Here is an example of the template with the error below: model { MolecularMarker marker } json { id marker.id description marker.name } 2025-07-11 105433.970 ERROR --- [nio-8080-exec-1] .a.c.c.C.[.[.[.[grailsDispatcherServlet] : Servlet.service() for servlet [grailsDispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is grails.views.ViewRenderException: Error rendering view: Error rendering view: Cannot get property 'id' on null object] with root cause java.lang.NullPointerException: Cannot get property 'id' on null object at org.codehaus.groovy.runtime.NullObject.getProperty(NullObject.java:89) at org.codehaus.groovy.runtime.InvokerHelper.getProperty(InvokerHelper.java:190) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:336) at oncode_api_molecularMarker__molecularMarker_gson$_run_closure1.doCall(oncode_api_molecularMarker__molecularMarker_gson:8) at oncode_api_molecularMarker__molecularMarker_gson$_run_closure1.call(oncode_api_molecularMarker__molecularMarker_gson) at grails.plugin.json.builder.StreamingJsonBuilder$StreamingJsonDelegate.cloneDelegateAndGetContent(StreamingJsonBuilder.java:836) at grails.plugin.json.builder.StreamingJsonBuilder.call(StreamingJsonBuilder.java:255) at grails.plugin.json.view.JsonViewWritableScript.json(JsonViewWritableScript.groovy:81) at oncode_api_molecularMarker__molecularMarker_gson.run(oncode_api_molecularMarker__molecularMarker_gson:7) at grails.plugin.json.view.JsonViewWritableScript.doWrite(JsonViewWritableScript.groovy:29) at grails.views.AbstractWritableScript.writeTo(AbstractWritableScript.groovy:40) at grails.plugin.json.view.api.internal.DefaultGrailsJsonViewHelper$5.writeTo(DefaultGrailsJsonViewHelper.groovy:763) at grails.plugin.json.view.api.internal.DefaultGrailsJsonViewHelper.handleValue(DefaultGrailsJsonViewHelper.groovy:326) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:107) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1254) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1030) at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:1059) at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:1042) at org.codehaus.groovy.runtime.InvokerHelper.invokeMethodSafe(InvokerHelper.java:97) at grails.plugin.json.view.api.internal.DefaultGrailsJsonViewHelper$_getIterableWritable_closure3.doCall(DefaultGrailsJsonViewHelper.groovy:262) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:107) at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323) at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:274) at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1030) at groovy.lang.Closure.call(Closure.java:427) at grails.plugin.json.view.api.internal.DefaultGrailsJsonViewHelper$2.writeTo(DefaultGrailsJsonViewHelper.groovy:278) at grails.plugin.json.view.JsonViewWritableScript.json(JsonViewWritableScript.groovy:142) at oncode_api_object__object_gson.run(oncode_api_object__object_gson:5) at grails.plugin.json.view.JsonViewWritableScript.doWrite(JsonViewWritableScript.groovy:29) at grails.views.AbstractWritableScript.writeTo(AbstractWritableScript.groovy:40) at grails.views.mvc.GenericGroovyTemplateView.renderMergedOutputModel(GenericGroovyTemplateView.groovy:73) at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:316) at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1406) at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1150) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) at javax.servlet.http.HttpServlet.service(HttpServlet.java:645) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:750) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1794) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:1583)
    g
    • 2
    • 4
  • u

    user

    07/13/2025, 8:49 PM
    Hi everyone! I started learning Grails 4 days ago and I'm looking for clean examples that follow best practices, especially around MVC. I found this repo and it looks good to me, what do you think? https://github.com/hmtmcse-com/grails-tutorial-contacts-book Any other recommendations?
    j
    • 2
    • 1
  • c

    cjchalmers

    07/14/2025, 7:24 PM
    What is the best way/choice for running scheduled tasks/jobs within a Grails 6 application? I thought there was support for Quartz, but the plugin seems dated
    j
    j
    • 3
    • 18
  • j

    John Moore

    07/15/2025, 2:31 PM
    I did a bunch of reasonably large applications with Grails 2 a long while back, and although most have now been upgraded to Grails 6 and all the new stuff I've done uses Grails 6 (although I will start using 7 very soon), I feel I've not taken nearly as much advantage as I might have done of the capabilities provided by the newer versions. One thing I've been looking at in the last couple of days, which I've never used before, is Traits. In an application I'm working on at the moment, I'm moving away from using standard SMTP email (for which I generally use the Mail plugin) to using an email provider via an API. As email will need to be sent from various parts of the application and I don't want to repeat myself, I want to have an email component I can call from anywhere (as with the Mail plugin). I would naturally think of a service class for this, which could be used from controllers and other services, Quartz jobs, whatever. But what about a Trait for this instead? I could then even use it from a domain class method should I need to (not that I ever would, I think). To make sense the Trait would have to be able to use configuration from my application.groovy file. so I would want to implement GrailsApplicationAware in it. I then implement this trait in a service class, in which 'grailsApplication' is injected. But when I go to compile I get an error like this:
    Task :compileGroovy startup failed: /root/src/borderbus/grails-app/controllers/borderbus/AdminController.groovy: 11: The return type of java.lang.Object getGrailsApplication() in borderbus.AdminController is incompatible with grails.core.GrailsApplication in grails.web.api.WebAttributes . At [11:1] @ line 11, column 1. class AdminController implements BrevoTrait { ^ 1 error
    This presumably means there's a conflict between the getGrailsApplication() method from two different sources, the trait and the service. Am I doing this right? How can I get around this problem without overcomplicating things? And is a Trait a natural fit for this, or is there a better way? I presume I could create my own plugin but it's not something I've ever done before and I imagine it might be more cumbersome than is ideal.
    j
    g
    • 3
    • 4
  • g

    gopichand.bhaskaruni

    07/15/2025, 3:50 PM
    Hi, we are on Grails 6.2.3 which is pulling Spring-web 5.3.39, does this version of grails only work with version 5.3.39 or lower? the build is failing when trying to upgrade. may I know which other versions work or do you use which Grails 6.x? Thank you
    j
    • 2
    • 6
  • u

    user

    07/15/2025, 5:56 PM
    In our project we are running some non-grails spring related code in the
    /src/
    directory under the project and we have dependency to retrieve the configuration from
    application.yml
    . To achieve that we are using
    GrailsApplication grailsApplication = Holders.grailsApplication
    but found it here https://github.com/apache/grails-core/issues/12090#issuecomment-934592118 that using holders to load properties is not a good approach. So may I know whats the best and right approach? If holders is the right way to go, I am unable to stub it for unit-testing, can you please educate me how may I stub the Holders+application data?
    j
    j
    g
    • 4
    • 13
  • g

    giangio

    07/16/2025, 2:03 PM
    There is no meeting today?
    s
    j
    • 3
    • 3
  • j

    John Moore

    07/16/2025, 3:16 PM
    If people here were wanting to upgrade a reasonably simple application from Grails 5 to Grails 7, would you: a) Upgrade the version numbers etc in situ, correct any breaking changes, etc., or b) Create a new Grails 7 app from the application forge and move the domain classes, controllers, services, views, etc., across? I know it's hard to say, but in my experience there's a level of change between versions which makes the second option the easier one and I was just wondering whether 5 to 7 was such a one. (By contrast, 4 to 5 was a doddle to do in situ, at least on the 3 or 4 apps I tried).
    j
    g
    p
    • 4
    • 42
  • u

    user

    07/18/2025, 7:40 AM
    Hi. I have a project and I’m trying to use grails 7.0.0-M5 with spring security core 7.0.0-M4. When I try to go on login page I receive this error: Message: Error creating bean with name ‘grails.plugin.springsecurity.LoginController’: Failed properties: Property ‘grailsLayoutSelector’ threw exception: java.lang.AbstractMethodError; Property ‘grailsRenderViewMutator’ threw exception: java.lang.AbstractMethodError Caused by: Failed properties: Property ‘grailsLayoutSelector’ threw exception: java.lang.AbstractMethodError; Property ‘grailsRenderViewMutator’ threw exception: java.lang.AbstractMethodError Someone could help me?
    j
    u
    j
    • 4
    • 3
  • r

    rss

    07/21/2025, 4:44 PM
    findBy when there could be more than one I'm using a findBy query in a grails/gorm project, where there is usually only one result (and I only ever want one result). However, there could occasionally be two (or even three theoretically, though it hasn't happened yet). How can I tell GORM which one to return, when there are more than one? I'm looking these up by an ID in an external system, which will eventually roll back around when it hits a max, so we can have two rows in our data base for the same external ID. I will always want...
    j
    • 2
    • 1
  • j

    John Moore

    07/21/2025, 6:45 PM
    Very basic question... Looking at the External Config plugin, it says in the release notes "Notice, that from Grails 7, this plugin is released at a part of Grails core!". Does that mean I don't need to use
    Copy code
    implementation 'dk.glasius:external-config:4.0.1'
    and can just use the grails.config.locations as if it is part of Grails (which it presumably is as of 7)?
    j
    • 2
    • 3
  • j

    John Moore

    07/22/2025, 12:02 PM
    I have been converting a simple Grails 6 app to Grails 7, and I'm getting there, but I keep getting a 'unable to resolve class org.apache.commons.lang.time.DateUtils' error, and others also from the commons.lang package. In Grails 6 and earlier one didn't need to declare a dependency for this, it was built in. It tried declaring a dependency with: implementation 'org.apache.commonscommons lang33.13.0' but that didn't help. Also are groovy-dateutil and groovy-datetime part of core now?
    t
    • 2
    • 2