You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@grails.apache.org by bo...@apache.org on 2026/08/02 03:21:08 UTC

(grails-core) branch deps/adopt-jline-jansi created (now 6fe5410440)

This is an automated email from the ASF dual-hosted git repository.

borinquenkid pushed a change to branch deps/adopt-jline-jansi
in repository https://gitbox.apache.org/repos/asf/grails-core.git


      at 6fe5410440 Migrate from unmaintained fusesource Jansi to the maintained org.jline fork

This branch includes the following new commits:

     new 6fe5410440 Migrate from unmaintained fusesource Jansi to the maintained org.jline fork

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(grails-core) 01/01: Migrate from unmaintained fusesource Jansi to the maintained org.jline fork

Posted by bo...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

borinquenkid pushed a commit to branch deps/adopt-jline-jansi
in repository https://gitbox.apache.org/repos/asf/grails-core.git

commit 6fe5410440f1d7bef23dcebd6d209fada92b024b
Author: Walter Duque de Estrada <wb...@mac.com>
AuthorDate: Sat Aug 1 22:14:04 2026 -0500

    Migrate from unmaintained fusesource Jansi to the maintained org.jline fork
    
    org.fusesource.jansi is unmaintained and flagged by CVE-2026-8484 with no
    fixed release. The JLine project maintains the fork and publishes it as
    org.jline:jansi (repackaged under org.jline.jansi), which Groovy 5 already
    uses for groovysh.
    
    - Manage org.jline:jansi:3.30.9 in dependencies.gradle and bump
      jline.version to 3.30.9 to match Groovy 5.0.7's transitives
    - Rename org.fusesource.jansi imports to org.jline.jansi in GrailsConsole,
      AnsiConsoleUrlMappingsRenderer, forge InteractiveShell, and their specs;
      CreateAppCommandSpec now uses the Ansi.DISABLE constant
    - Switch the coordinate in all build files, the base profile, the forge
      Scaffolding feature, and the user guide so generated apps get the fork
    - Align jansiVersion in grails-forge (2.4.2) and grails-data-neo4j (2.4.1)
    - Update the SBOM license mapping to org.jline:jline@3.30.9 and note the
      remaining ossIndexAudit exemption now only covers fusesource jansi
      pulled transitively by previously published Grails 6/7 artifacts
    
    Co-Authored-By: Claude Fable 5 <no...@anthropic.com>
---
 .../org/apache/grails/buildsrc/SbomPlugin.groovy   | 22 +++++++++++-----------
 .../grails/buildsrc/VulnerabilityScanPlugin.groovy |  7 ++++---
 dependencies.gradle                                |  8 +++++---
 gradle/docs-dependencies.gradle                    |  2 +-
 grails-bootstrap/build.gradle                      |  4 ++--
 .../groovy/grails/build/logging/GrailsConsole.java | 16 ++++++++--------
 .../grails/build/logging/GrailsConsoleSpec.groovy  |  2 +-
 grails-console/build.gradle                        |  2 +-
 grails-controllers/build.gradle                    |  2 +-
 grails-data-hibernate5/docs/build.gradle           |  2 +-
 grails-data-hibernate7/docs/build.gradle           |  2 +-
 grails-data-mongodb/docs/build.gradle              |  2 +-
 grails-data-neo4j/docs/build.gradle                |  2 +-
 grails-data-neo4j/gradle.properties                |  2 +-
 .../gradleBuild/gradleDependencies.adoc            |  2 +-
 grails-forge/gradle.properties                     |  2 +-
 grails-forge/grails-forge-cli/build.gradle         |  2 +-
 .../org/grails/forge/cli/InteractiveShell.java     |  2 +-
 .../org/grails/forge/feature/view/Scaffolding.java |  2 +-
 .../forge/feature/view/ScaffoldingSpec.groovy      |  2 +-
 grails-gradle/gradle/docs-config.gradle            |  2 +-
 grails-gradle/model/build.gradle                   |  2 +-
 grails-profiles/base/profile.yml                   |  2 +-
 grails-scaffolding/build.gradle                    |  4 ++--
 grails-shell-cli/build.gradle                      |  2 +-
 .../profile/commands/CreateAppCommandSpec.groovy   |  3 ++-
 grails-spring-security/oauth2/plugin/build.gradle  |  4 ++--
 grails-spring-security/plugin/build.gradle         |  4 ++--
 grails-test-core/build.gradle                      |  2 +-
 .../async-events-pubsub-demo/build.gradle          |  2 +-
 grails-test-examples/cache/build.gradle            |  2 +-
 .../external-configuration/build.gradle            |  2 +-
 grails-test-examples/geb-context-path/build.gradle |  2 +-
 grails-test-examples/geb-gebconfig/build.gradle    |  2 +-
 grails-test-examples/geb/build.gradle              |  2 +-
 grails-test-examples/gsp-layout/build.gradle       |  2 +-
 grails-test-examples/gsp-sitemesh3/build.gradle    |  2 +-
 .../async-events-pubsub-demo/build.gradle          |  2 +-
 grails-test-examples/jetty/build.gradle            |  2 +-
 grails-test-examples/mail/build.gradle             |  2 +-
 grails-test-examples/mongodb/base/build.gradle     |  2 +-
 .../mongodb/database-per-tenant/build.gradle       |  2 +-
 .../mongodb/hibernate5/build.gradle                |  2 +-
 grails-test-examples/redis/build.gradle            |  2 +-
 grails-test-examples/scaffolding/build.gradle      |  2 +-
 .../acl/functional-test-app/build.gradle           |  2 +-
 .../spring-security/cas/test1/build.gradle         |  2 +-
 .../build.gradle                                   |  2 +-
 .../ldap/functional-test-app/build.gradle          |  2 +-
 .../ldap/retrieve-db-roles/build.gradle            |  2 +-
 .../ldap/retrieve-group-roles/build.gradle         |  2 +-
 .../spring-security/ui/extended/build.gradle       |  2 +-
 .../spring-security/ui/simple/build.gradle         |  2 +-
 grails-test-examples/undertow/build.gradle         |  2 +-
 grails-web-url-mappings/build.gradle               |  4 ++--
 .../AnsiConsoleUrlMappingsRenderer.groovy          | 14 +++++++-------
 56 files changed, 92 insertions(+), 88 deletions(-)

diff --git a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/SbomPlugin.groovy b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/SbomPlugin.groovy
index 531425fe7d..285b727b22 100644
--- a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/SbomPlugin.groovy
+++ b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/SbomPlugin.groovy
@@ -107,17 +107,17 @@ class SbomPlugin implements Plugin<Project> {
             'pkg:maven/jline/jline@2.14.6?type=jar'                           : 'BSD-2-Clause', // maps incorrectly because of https://github.com/CycloneDX/cyclonedx-core-java/issues/205
             'pkg:maven/opensymphony/sitemesh@2.6.0?type=jar'                  : 'OpenSymphony', // custom license approved by legal LEGAL-707
             'pkg:maven/org.antlr/antlr4-runtime@4.7.2?type=jar'               : 'BSD-3-Clause', // maps incorrectly because of https://github.com/CycloneDX/cyclonedx-core-java/issues/205
-            'pkg:maven/org.jline/jansi@3.30.9?type=jar'                       : 'BSD-3-Clause', // jline group resolved at 3.30.9 transitively via groovy-groovysh; main org.jline:jline pinned at 3.30.6 directly
-            'pkg:maven/org.jline/jline@3.30.6?type=jar'                       : 'BSD-3-Clause', // direct dependency declared at jline.version in dependencies.gradle
-            'pkg:maven/org.jline/jline-builtins@3.30.9?type=jar'              : 'BSD-3-Clause', // jline group resolved at 3.30.9 transitively via groovy-groovysh; main org.jline:jline pinned at 3.30.6 directly
-            'pkg:maven/org.jline/jline-console@3.30.9?type=jar'               : 'BSD-3-Clause', // jline group resolved at 3.30.9 transitively via groovy-groovysh; main org.jline:jline pinned at 3.30.6 directly
-            'pkg:maven/org.jline/jline-native@3.30.9?type=jar'                : 'BSD-3-Clause', // jline group resolved at 3.30.9 transitively via groovy-groovysh; main org.jline:jline pinned at 3.30.6 directly
-            'pkg:maven/org.jline/jline-reader@3.30.9?type=jar'                : 'BSD-3-Clause', // jline group resolved at 3.30.9 transitively via groovy-groovysh; main org.jline:jline pinned at 3.30.6 directly
-            'pkg:maven/org.jline/jline-style@3.30.9?type=jar'                 : 'BSD-3-Clause', // jline group resolved at 3.30.9 transitively via groovy-groovysh; main org.jline:jline pinned at 3.30.6 directly
-            'pkg:maven/org.jline/jline-terminal@3.30.9?type=jar'              : 'BSD-3-Clause', // jline group resolved at 3.30.9 transitively via groovy-groovysh; main org.jline:jline pinned at 3.30.6 directly
-            'pkg:maven/org.jline/jline-terminal-jansi@3.30.9?type=jar'        : 'BSD-3-Clause', // jline group resolved at 3.30.9 transitively via groovy-groovysh; main org.jline:jline pinned at 3.30.6 directly
-            'pkg:maven/org.jline/jline-terminal-jna@3.30.9?type=jar'          : 'BSD-3-Clause', // jline group resolved at 3.30.9 transitively via groovy-groovysh; main org.jline:jline pinned at 3.30.6 directly
-            'pkg:maven/org.jline/jline-terminal-jni@3.30.9?type=jar'          : 'BSD-3-Clause', // jline group resolved at 3.30.9 transitively via groovy-groovysh; main org.jline:jline pinned at 3.30.6 directly
+            'pkg:maven/org.jline/jansi@3.30.9?type=jar'                       : 'BSD-3-Clause', // direct dependency declared at jansi.version in dependencies.gradle
+            'pkg:maven/org.jline/jline@3.30.9?type=jar'                       : 'BSD-3-Clause', // direct dependency declared at jline.version in dependencies.gradle
+            'pkg:maven/org.jline/jline-builtins@3.30.9?type=jar'              : 'BSD-3-Clause', // jline group resolved at 3.30.9 transitively via groovy-groovysh, matching jline.version in dependencies.gradle
+            'pkg:maven/org.jline/jline-console@3.30.9?type=jar'               : 'BSD-3-Clause', // jline group resolved at 3.30.9 transitively via groovy-groovysh, matching jline.version in dependencies.gradle
+            'pkg:maven/org.jline/jline-native@3.30.9?type=jar'                : 'BSD-3-Clause', // jline group resolved at 3.30.9 transitively via groovy-groovysh, matching jline.version in dependencies.gradle
+            'pkg:maven/org.jline/jline-reader@3.30.9?type=jar'                : 'BSD-3-Clause', // jline group resolved at 3.30.9 transitively via groovy-groovysh, matching jline.version in dependencies.gradle
+            'pkg:maven/org.jline/jline-style@3.30.9?type=jar'                 : 'BSD-3-Clause', // jline group resolved at 3.30.9 transitively via groovy-groovysh, matching jline.version in dependencies.gradle
+            'pkg:maven/org.jline/jline-terminal@3.30.9?type=jar'              : 'BSD-3-Clause', // jline group resolved at 3.30.9 transitively via groovy-groovysh, matching jline.version in dependencies.gradle
+            'pkg:maven/org.jline/jline-terminal-jansi@3.30.9?type=jar'        : 'BSD-3-Clause', // jline group resolved at 3.30.9 transitively via groovy-groovysh, matching jline.version in dependencies.gradle
+            'pkg:maven/org.jline/jline-terminal-jna@3.30.9?type=jar'          : 'BSD-3-Clause', // jline group resolved at 3.30.9 transitively via groovy-groovysh, matching jline.version in dependencies.gradle
+            'pkg:maven/org.jline/jline-terminal-jni@3.30.9?type=jar'          : 'BSD-3-Clause', // jline group resolved at 3.30.9 transitively via groovy-groovysh, matching jline.version in dependencies.gradle
             'pkg:maven/org.jruby/jzlib@1.1.5?type=jar'                        : 'BSD-3-Clause', // https://web.archive.org/web/20240822213507/http://www.jcraft.com/jzlib/LICENSE.txt shows it's a 3 clause
             'pkg:maven/org.liquibase.ext/liquibase-hibernate5@4.27.0?type=jar': 'Apache-2.0', // maps incorrectly because of https://github.com/liquibase/liquibase/issues/2445 & the base pom does not define a license
             'pkg:maven/org.json/json@20251224?type=jar'                       : 'Public-Domain', // required due to jedis, https://issues.apache.org/jira/browse/LEGAL-666 approves this usage
diff --git a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/VulnerabilityScanPlugin.groovy b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/VulnerabilityScanPlugin.groovy
index 4c748622de..835469afab 100644
--- a/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/VulnerabilityScanPlugin.groovy
+++ b/build-logic/plugins/src/main/groovy/org/apache/grails/buildsrc/VulnerabilityScanPlugin.groovy
@@ -68,9 +68,10 @@ class VulnerabilityScanPlugin implements Plugin<Project> {
             // Remove if H2 ever ships a patched release that OSS Index no longer flags.
             'com.h2database:h2:2.4.240',
             // CVE-2026-8484: org.fusesource.jansi is unmaintained; all versions through 2.4.3 are flagged and no
-            // fixed release exists upstream. Grails still uses the fusesource coordinate for ANSI console output
-            // (package org.fusesource.jansi). Remove once consumers migrate off fusesource jansi or a patched
-            // release ships.
+            // fixed release exists upstream. Grails itself migrated to the maintained org.jline:jansi fork, but
+            // previously published Grails 6/7 artifacts (e.g. grails-shell-cli) still pull the fusesource
+            // coordinate transitively on some scanned classpaths. Remove once no resolved classpath contains
+            // org.fusesource.jansi.
             'org.fusesource.jansi:jansi:1.18',
             // CVE-2026-14683/14684/14685/14686: pulled transitively via micrometer/actuator (LatencyUtils).
             // The fix is HdrHistogram 2.2.3, which is not yet published to Maven Central (2.2.2 is the latest
diff --git a/dependencies.gradle b/dependencies.gradle
index 79ebd4f1f8..10eb48b971 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -31,9 +31,11 @@ ext {
             'gradle-groovy.version'         : '4.0.32',
             'gradle-spock.version'          : '2.4-groovy-4.0',
             'grails-publish-plugin.version' : '1.0.0-M2',
-            'jansi.version'                 : '2.4.2',
+            // Security: the org.jline fork replaces unmaintained org.fusesource.jansi (CVE-2026-8484).
+            // Versioned with JLine releases - keep in lockstep with jline.version below.
+            'jansi.version'                 : '3.30.9',
             'javaparser-core.version'       : '3.28.2',
-            'jline.version'                 : '3.30.6',
+            'jline.version'                 : '3.30.9',
             'jna.version'                   : '5.19.1',
             'jquery.version'                : '4.0.0',
             'maven-model.version'           : '3.9.16',
@@ -58,7 +60,7 @@ ext {
             'commons-text'            : "org.apache.commons:commons-text:${gradleBomDependencyVersions['commons-text.version']}",
             'directory-watcher'       : "io.methvin:directory-watcher:${gradleBomDependencyVersions['directory-watcher.version']}",
             'grails-publish-plugin'   : "org.apache.grails.gradle:grails-publish:${gradleBomDependencyVersions['grails-publish-plugin.version']}",
-            'jansi'                   : "org.fusesource.jansi:jansi:${gradleBomDependencyVersions['jansi.version']}",
+            'jansi'                   : "org.jline:jansi:${gradleBomDependencyVersions['jansi.version']}",
             'javaparser-core'         : "com.github.javaparser:javaparser-core:${gradleBomDependencyVersions['javaparser-core.version']}",
             'jline'                   : "org.jline:jline:${gradleBomDependencyVersions['jline.version']}",
             'jna'                     : "net.java.dev.jna:jna:${gradleBomDependencyVersions['jna.version']}",
diff --git a/gradle/docs-dependencies.gradle b/gradle/docs-dependencies.gradle
index bb4b9b1835..2466b799d5 100644
--- a/gradle/docs-dependencies.gradle
+++ b/gradle/docs-dependencies.gradle
@@ -20,7 +20,7 @@ apply plugin: 'org.apache.grails.buildsrc.groovydoc'
 
 dependencies {
     add('documentation', platform(project(':grails-bom')))
-    add('documentation', 'org.fusesource.jansi:jansi')
+    add('documentation', 'org.jline:jansi')
     add('documentation', 'com.github.javaparser:javaparser-core')
     add('documentation', 'org.apache.groovy:groovy')
     add('documentation', 'org.apache.groovy:groovy-groovydoc')
diff --git a/grails-bootstrap/build.gradle b/grails-bootstrap/build.gradle
index e4f69b8145..b54c7d3237 100644
--- a/grails-bootstrap/build.gradle
+++ b/grails-bootstrap/build.gradle
@@ -52,7 +52,7 @@ dependencies {
     compileOnly 'org.apache.groovy:groovy-ant'
 
     compileOnly 'io.methvin:directory-watcher'
-    compileOnly 'org.fusesource.jansi:jansi'
+    compileOnly 'org.jline:jansi'
     compileOnly 'org.jline:jline'
     compileOnly 'net.java.dev.jna:jna'
 
@@ -60,7 +60,7 @@ dependencies {
 
     testImplementation 'org.apache.groovy:groovy-xml'
     testImplementation 'org.apache.groovy:groovy-templates'
-    testImplementation 'org.fusesource.jansi:jansi'
+    testImplementation 'org.jline:jansi'
     testImplementation 'org.jline:jline'
 
     testImplementation 'org.apache.groovy:groovy-test-junit5'
diff --git a/grails-bootstrap/src/main/groovy/grails/build/logging/GrailsConsole.java b/grails-bootstrap/src/main/groovy/grails/build/logging/GrailsConsole.java
index 2641e487ff..90b74389be 100644
--- a/grails-bootstrap/src/main/groovy/grails/build/logging/GrailsConsole.java
+++ b/grails-bootstrap/src/main/groovy/grails/build/logging/GrailsConsole.java
@@ -32,9 +32,9 @@ import org.codehaus.groovy.runtime.StackTraceUtils;
 import org.codehaus.groovy.runtime.typehandling.NumberMath;
 
 import org.apache.tools.ant.BuildException;
-import org.fusesource.jansi.Ansi;
-import org.fusesource.jansi.Ansi.Color;
-import org.fusesource.jansi.AnsiConsole;
+import org.jline.jansi.Ansi;
+import org.jline.jansi.Ansi.Color;
+import org.jline.jansi.AnsiConsole;
 import org.jline.reader.Completer;
 import org.jline.reader.History;
 import org.jline.reader.LineReader;
@@ -49,11 +49,11 @@ import grails.util.Environment;
 import org.grails.build.logging.GrailsConsoleErrorPrintStream;
 import org.grails.build.logging.GrailsConsolePrintStream;
 
-import static org.fusesource.jansi.Ansi.Color.DEFAULT;
-import static org.fusesource.jansi.Ansi.Color.RED;
-import static org.fusesource.jansi.Ansi.Color.YELLOW;
-import static org.fusesource.jansi.Ansi.Erase.FORWARD;
-import static org.fusesource.jansi.Ansi.ansi;
+import static org.jline.jansi.Ansi.Color.DEFAULT;
+import static org.jline.jansi.Ansi.Color.RED;
+import static org.jline.jansi.Ansi.Color.YELLOW;
+import static org.jline.jansi.Ansi.Erase.FORWARD;
+import static org.jline.jansi.Ansi.ansi;
 
 /**
  * Utility class for delivering console output in a nicely formatted way.
diff --git a/grails-bootstrap/src/test/groovy/grails/build/logging/GrailsConsoleSpec.groovy b/grails-bootstrap/src/test/groovy/grails/build/logging/GrailsConsoleSpec.groovy
index 4f99dd9650..a896e452aa 100644
--- a/grails-bootstrap/src/test/groovy/grails/build/logging/GrailsConsoleSpec.groovy
+++ b/grails-bootstrap/src/test/groovy/grails/build/logging/GrailsConsoleSpec.groovy
@@ -18,11 +18,11 @@
  */
 package grails.build.logging
 
+import org.jline.jansi.Ansi
 import org.jline.reader.LineReader
 import org.jline.reader.LineReaderBuilder
 import org.jline.terminal.Terminal
 import org.jline.terminal.TerminalBuilder
-import org.fusesource.jansi.Ansi
 import spock.lang.IgnoreIf
 import spock.lang.Issue
 import spock.lang.Specification
diff --git a/grails-console/build.gradle b/grails-console/build.gradle
index 3d57a651e9..42f419b85a 100644
--- a/grails-console/build.gradle
+++ b/grails-console/build.gradle
@@ -53,7 +53,7 @@ dependencies {
     api 'org.apache.groovy:groovy-console'
     api 'org.apache.groovy:groovy-swing'
     api 'org.apache.groovy:groovy-groovysh'
-    implementation 'org.fusesource.jansi:jansi'
+    implementation 'org.jline:jansi'
     implementation 'org.jline:jline'
     implementation 'net.java.dev.jna:jna'
 
diff --git a/grails-controllers/build.gradle b/grails-controllers/build.gradle
index 8c34aedd2a..408de31f7e 100644
--- a/grails-controllers/build.gradle
+++ b/grails-controllers/build.gradle
@@ -55,7 +55,7 @@ dependencies {
     runtimeOnly project(':grails-i18n')
 
     testRuntimeOnly 'org.jline:jline'
-    testRuntimeOnly 'org.fusesource.jansi:jansi'
+    testRuntimeOnly 'org.jline:jansi'
 
     compileOnly 'jakarta.servlet:jakarta.servlet-api'
     compileOnly 'org.springframework:spring-test'
diff --git a/grails-data-hibernate5/docs/build.gradle b/grails-data-hibernate5/docs/build.gradle
index db14debb59..5198e45656 100644
--- a/grails-data-hibernate5/docs/build.gradle
+++ b/grails-data-hibernate5/docs/build.gradle
@@ -42,7 +42,7 @@ dependencies {
     documentation 'org.apache.groovy:groovy-ant'
     documentation 'org.apache.groovy:groovy-groovydoc'
     documentation 'org.apache.groovy:groovy-templates'
-    documentation 'org.fusesource.jansi:jansi'
+    documentation 'org.jline:jansi'
     documentation project(':grails-bootstrap')
     documentation project(':grails-core')
     documentation project(':grails-spring')
diff --git a/grails-data-hibernate7/docs/build.gradle b/grails-data-hibernate7/docs/build.gradle
index 21f7b24cac..f972347fdf 100644
--- a/grails-data-hibernate7/docs/build.gradle
+++ b/grails-data-hibernate7/docs/build.gradle
@@ -43,7 +43,7 @@ dependencies {
     documentation 'org.apache.groovy:groovy-ant'
     documentation 'org.apache.groovy:groovy-groovydoc'
     documentation 'org.apache.groovy:groovy-templates'
-    documentation 'org.fusesource.jansi:jansi'
+    documentation 'org.jline:jansi'
     documentation project(':grails-bootstrap')
     documentation project(':grails-core')
     documentation project(':grails-spring')
diff --git a/grails-data-mongodb/docs/build.gradle b/grails-data-mongodb/docs/build.gradle
index 3795057c80..aef152a6c9 100644
--- a/grails-data-mongodb/docs/build.gradle
+++ b/grails-data-mongodb/docs/build.gradle
@@ -50,7 +50,7 @@ tasks.register('resolveMongodbVersion').configure { Task docTask ->
 
 dependencies {
     documentation platform(project(':grails-bom'))
-    documentation 'org.fusesource.jansi:jansi'
+    documentation 'org.jline:jansi'
     documentation 'org.apache.groovy:groovy'
     documentation 'org.apache.groovy:groovy-ant'
     documentation 'org.apache.groovy:groovy-groovydoc'
diff --git a/grails-data-neo4j/docs/build.gradle b/grails-data-neo4j/docs/build.gradle
index 2cec032f48..a661260999 100644
--- a/grails-data-neo4j/docs/build.gradle
+++ b/grails-data-neo4j/docs/build.gradle
@@ -49,7 +49,7 @@ configurations {
 }
 
 dependencies {
-    documentation "org.fusesource.jansi:jansi:$jansiVersion"
+    documentation "org.jline:jansi:$jansiVersion"
     documentation "org.apache.groovy:groovy"
     documentation "org.apache.groovy:groovy-templates"
     documentation "org.apache.groovy:groovy-dateutil"
diff --git a/grails-data-neo4j/gradle.properties b/grails-data-neo4j/gradle.properties
index 06643c57f4..26f5627c29 100644
--- a/grails-data-neo4j/gradle.properties
+++ b/grails-data-neo4j/gradle.properties
@@ -25,7 +25,7 @@ h2Version=1.4.200
 hibernateDatastoreVersion=8.0.2
 hibernateEhcacheVersion=5.5.7.Final
 hibernateValidatorVersion=6.2.5.Final
-jansiVersion=2.4.1
+jansiVersion=3.30.9
 javaParserCoreVersion=3.25.8
 javassistVersion=3.30.2-GA
 jettyVersion=9.4.29.v20200521
diff --git a/grails-doc/src/en/guide/commandLine/gradleBuild/gradleDependencies.adoc b/grails-doc/src/en/guide/commandLine/gradleBuild/gradleDependencies.adoc
index d80c80fae4..aa002974e6 100644
--- a/grails-doc/src/en/guide/commandLine/gradleBuild/gradleDependencies.adoc
+++ b/grails-doc/src/en/guide/commandLine/gradleBuild/gradleDependencies.adoc
@@ -49,7 +49,7 @@ dependencies {
     runtimeOnly "cloud.wondrify:asset-pipeline-grails"
     runtimeOnly "com.h2database:h2"
     runtimeOnly "com.zaxxer:HikariCP"
-    runtimeOnly "org.fusesource.jansi:jansi"
+    runtimeOnly "org.jline:jansi"
     integrationTestImplementation testFixtures("org.apache.grails:grails-geb")
     testImplementation "org.apache.grails:grails-testing-support-datamapping"
     testImplementation "org.apache.grails:grails-testing-support-web"
diff --git a/grails-forge/gradle.properties b/grails-forge/gradle.properties
index b82968e526..c6d3d426c5 100644
--- a/grails-forge/gradle.properties
+++ b/grails-forge/gradle.properties
@@ -34,7 +34,7 @@ gradleSdkvendorPluginVersion=3.0.0
 groovyVersion=4.0.32
 jacksonDatabindVersion=2.18.3
 # match the jansi version in grails-bom
-jansiVersion=2.4.2
+jansiVersion=3.30.9
 javaDiffUtils=4.15
 jgitVersion=6.10.0.202406032230-r
 micronautApplicationPluginVersion=4.6.2
diff --git a/grails-forge/grails-forge-cli/build.gradle b/grails-forge/grails-forge-cli/build.gradle
index 4f9f4bdab2..a42f6cae2b 100644
--- a/grails-forge/grails-forge-cli/build.gradle
+++ b/grails-forge/grails-forge-cli/build.gradle
@@ -90,7 +90,7 @@ dependencies {
     implementation "info.picocli:picocli:$picocliVersion"
     implementation "info.picocli:picocli-shell-jline3:$picocliVersion"
     implementation 'jakarta.inject:jakarta.inject-api'
-    implementation "org.fusesource.jansi:jansi:$jansiVersion"
+    implementation "org.jline:jansi:$jansiVersion"
     implementation "org.slf4j:slf4j-nop"
     implementation "org.yaml:snakeyaml"
 
diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/InteractiveShell.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/InteractiveShell.java
index 618b1cecd8..a69d250059 100644
--- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/InteractiveShell.java
+++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/InteractiveShell.java
@@ -18,7 +18,7 @@
  */
 package org.grails.forge.cli;
 
-import org.fusesource.jansi.AnsiConsole;
+import org.jline.jansi.AnsiConsole;
 import org.jline.reader.EndOfFileException;
 import org.jline.reader.LineReader;
 import org.jline.reader.LineReaderBuilder;
diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/view/Scaffolding.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/view/Scaffolding.java
index e0ea7078a5..1f7e59ffae 100644
--- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/view/Scaffolding.java
+++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/view/Scaffolding.java
@@ -81,7 +81,7 @@ public class Scaffolding implements DefaultFeature {
     @Override
     public void apply(GeneratorContext generatorContext) {
         generatorContext.addDependency(Dependency.builder()
-                .groupId("org.fusesource.jansi")
+                .groupId("org.jline")
                 .artifactId("jansi")
                 .runtimeOnly());
 
diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/ScaffoldingSpec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/ScaffoldingSpec.groovy
index 3160999f0c..da455f634a 100644
--- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/ScaffoldingSpec.groovy
+++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/view/ScaffoldingSpec.groovy
@@ -42,7 +42,7 @@ class ScaffoldingSpec extends ApplicationContextSpec implements CommandOutputFix
 
         then:
         template.contains('implementation "org.apache.grails:grails-scaffolding"')
-        template.contains('runtimeOnly "org.fusesource.jansi:jansi"')
+        template.contains('runtimeOnly "org.jline:jansi"')
     }
 
 }
diff --git a/grails-gradle/gradle/docs-config.gradle b/grails-gradle/gradle/docs-config.gradle
index 0069bb65d8..b86b70514c 100644
--- a/grails-gradle/gradle/docs-config.gradle
+++ b/grails-gradle/gradle/docs-config.gradle
@@ -21,7 +21,7 @@ apply plugin: 'org.apache.grails.buildsrc.groovydoc'
 
 dependencies {
     add('documentation', platform(project(':grails-gradle-bom')))
-    add('documentation', 'org.fusesource.jansi:jansi')
+    add('documentation', 'org.jline:jansi')
     add('documentation', 'com.github.javaparser:javaparser-core')
     // Use Gradle's embedded Groovy (gradle-groovy.version), not the project's main Groovy version.
     add('documentation', "org.apache.groovy:groovy:${gradleBomDependencyVersions['gradle-groovy.version']}")
diff --git a/grails-gradle/model/build.gradle b/grails-gradle/model/build.gradle
index c6bd8cfeea..24363ef49d 100644
--- a/grails-gradle/model/build.gradle
+++ b/grails-gradle/model/build.gradle
@@ -61,7 +61,7 @@ dependencies {
     }
 
     compileOnly 'org.jline:jline' // for profile compilation
-    compileOnly 'org.fusesource.jansi:jansi'
+    compileOnly 'org.jline:jansi'
 
     api 'org.yaml:snakeyaml'
 
diff --git a/grails-profiles/base/profile.yml b/grails-profiles/base/profile.yml
index 7dce3d7dc4..8a5eb085a7 100644
--- a/grails-profiles/base/profile.yml
+++ b/grails-profiles/base/profile.yml
@@ -50,6 +50,6 @@ dependencies:
     - scope: testImplementation
       coords: "org.apache.grails:grails-testing-support-datamapping"
     - scope: runtimeOnly
-      coords: "org.fusesource.jansi:jansi"
+      coords: "org.jline:jansi"
     - scope: testImplementation
       coords: "org.spockframework:spock-core"
diff --git a/grails-scaffolding/build.gradle b/grails-scaffolding/build.gradle
index 89c7e47fa1..df3a044c27 100644
--- a/grails-scaffolding/build.gradle
+++ b/grails-scaffolding/build.gradle
@@ -60,14 +60,14 @@ dependencies {
     }
     // GrailsConsole (used by the scaffolding commands) needs jline at compile time
     cliImplementation 'org.jline:jline'
-    cliImplementation 'org.fusesource.jansi:jansi'
+    cliImplementation 'org.jline:jansi'
     api project(':grails-fields')
     api project(':grails-rest-transforms')
 
     implementation project(':grails-gsp')
 
     compileOnly 'org.jline:jline'
-    compileOnly 'org.fusesource.jansi:jansi'
+    compileOnly 'org.jline:jansi'
 
     testImplementation 'org.spockframework:spock-core'
     testImplementation project(':grails-layout')
diff --git a/grails-shell-cli/build.gradle b/grails-shell-cli/build.gradle
index 9b45417a15..6b8255f5a3 100644
--- a/grails-shell-cli/build.gradle
+++ b/grails-shell-cli/build.gradle
@@ -56,7 +56,7 @@ dependencies {
     api project(':grails-bootstrap')
     api 'org.apache.grails.gradle:grails-gradle-model'
     api 'org.apache.ant:ant'
-    api 'org.fusesource.jansi:jansi'
+    api 'org.jline:jansi'
     api 'org.jline:jline'
     api("org.gradle:gradle-tooling-api:$gradleToolingApiVersion") {
         exclude group: 'org.slf4j', module: 'slf4j-api'
diff --git a/grails-shell-cli/src/test/groovy/org/grails/cli/profile/commands/CreateAppCommandSpec.groovy b/grails-shell-cli/src/test/groovy/org/grails/cli/profile/commands/CreateAppCommandSpec.groovy
index 63f7ace820..7dfaee7d7a 100644
--- a/grails-shell-cli/src/test/groovy/org/grails/cli/profile/commands/CreateAppCommandSpec.groovy
+++ b/grails-shell-cli/src/test/groovy/org/grails/cli/profile/commands/CreateAppCommandSpec.groovy
@@ -21,6 +21,7 @@ package org.grails.cli.profile.commands
 import grails.build.logging.GrailsConsole
 import org.grails.cli.profile.Feature
 import org.grails.cli.profile.Profile
+import org.jline.jansi.Ansi
 import org.spockframework.util.StringMessagePrintStream
 import spock.lang.Shared
 import spock.lang.Specification
@@ -38,7 +39,7 @@ class CreateAppCommandSpec extends Specification {
     PrintStream originalOut
 
     void setup() {
-        System.setProperty("org.fusesource.jansi.Ansi.disable", "true")
+        System.setProperty(Ansi.DISABLE, "true")
         originalOut = GrailsConsole.instance.out
         sps = new StringPrintStream()
         GrailsConsole.instance.out = sps
diff --git a/grails-spring-security/oauth2/plugin/build.gradle b/grails-spring-security/oauth2/plugin/build.gradle
index 96851866ff..54e61c07f3 100644
--- a/grails-spring-security/oauth2/plugin/build.gradle
+++ b/grails-spring-security/oauth2/plugin/build.gradle
@@ -56,7 +56,7 @@ dependencies {
 	}
 	// GrailsConsole (used by init-o-auth2) needs jline at compile time
 	cliImplementation 'org.jline:jline'
-	cliImplementation 'org.fusesource.jansi:jansi'
+	cliImplementation 'org.jline:jansi'
 
 	api project(':grails-spring-security'), {
 		// api: GrailsUserDetailsService, SpringSecurityService
@@ -86,7 +86,7 @@ dependencies {
 	implementation 'org.jline:jline', {
 		// comp: ConsoleReader
 	}
-	compileOnly 'org.fusesource.jansi:jansi' // required for Groovy static type checking of groovysh (Ansi) references
+	compileOnly 'org.jline:jansi' // required for Groovy static type checking of groovysh (Ansi) references
 	implementation project(':grails-datamapping-core'), {
 		// impl: @Transactional(runtime)
 	}
diff --git a/grails-spring-security/plugin/build.gradle b/grails-spring-security/plugin/build.gradle
index 14453792e6..f1c4de2830 100644
--- a/grails-spring-security/plugin/build.gradle
+++ b/grails-spring-security/plugin/build.gradle
@@ -57,7 +57,7 @@ dependencies {
 	}
 	// GrailsConsole (used by the s2-* commands) needs jline at compile time
 	cliImplementation 'org.jline:jline'
-	cliImplementation 'org.fusesource.jansi:jansi'
+	cliImplementation 'org.jline:jansi'
 
 	api project(':grails-spring-security-compat')
 	api project(':grails-async') // AsyncGrailsWebRequest is used in public API
@@ -91,7 +91,7 @@ dependencies {
 
 	compileOnly 'jakarta.servlet:jakarta.servlet-api' // Provided
 	compileOnly 'org.jline:jline' // for shell commands
-	compileOnly 'org.fusesource.jansi:jansi' // required for Groovy static type checking of groovysh (Ansi) references
+	compileOnly 'org.jline:jansi' // required for Groovy static type checking of groovysh (Ansi) references
 	compileOnly project(':grails-core') // Provided as this is a Grails Plugin
 	compileOnly 'org.apache.groovy:groovy' // Compile-time annotations
 	compileOnly 'org.slf4j:slf4j-nop' // Prevents warnings about missing slf4j implementation during compilation
diff --git a/grails-test-core/build.gradle b/grails-test-core/build.gradle
index dd9cda9c1e..77bc12fae4 100644
--- a/grails-test-core/build.gradle
+++ b/grails-test-core/build.gradle
@@ -55,7 +55,7 @@ dependencies {
 
     // command line requirements
     api  'org.jline:jline'
-    api 'org.fusesource.jansi:jansi'
+    api 'org.jline:jansi'
 
     // Ant
     api 'org.apache.ant:ant'
diff --git a/grails-test-examples/async-events-pubsub-demo/build.gradle b/grails-test-examples/async-events-pubsub-demo/build.gradle
index 71a43208e8..ad28689df6 100644
--- a/grails-test-examples/async-events-pubsub-demo/build.gradle
+++ b/grails-test-examples/async-events-pubsub-demo/build.gradle
@@ -63,7 +63,7 @@ dependencies {
     implementation 'org.springframework.boot:spring-boot-starter-tomcat'
 
     runtimeOnly 'com.h2database:h2'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
     runtimeOnly 'com.zaxxer:HikariCP'
 
     testImplementation 'org.apache.grails:grails-testing-support-web'
diff --git a/grails-test-examples/cache/build.gradle b/grails-test-examples/cache/build.gradle
index 2d9b22ff2b..19fd6fdddd 100644
--- a/grails-test-examples/cache/build.gradle
+++ b/grails-test-examples/cache/build.gradle
@@ -60,7 +60,7 @@ dependencies {
     runtimeOnly 'cloud.wondrify:asset-pipeline-grails'
     runtimeOnly 'com.h2database:h2'
     runtimeOnly 'org.apache.tomcat:tomcat-jdbc'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
 
     testImplementation 'org.apache.grails:grails-testing-support-datamapping'
     testImplementation 'org.apache.grails:grails-testing-support-web'
diff --git a/grails-test-examples/external-configuration/build.gradle b/grails-test-examples/external-configuration/build.gradle
index 5cec149d12..c2cbc5e719 100644
--- a/grails-test-examples/external-configuration/build.gradle
+++ b/grails-test-examples/external-configuration/build.gradle
@@ -55,7 +55,7 @@ dependencies {
 
     runtimeOnly 'com.h2database:h2'
     runtimeOnly 'org.apache.tomcat:tomcat-jdbc'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
 
     testImplementation 'org.apache.grails:grails-testing-support-datamapping'
     testImplementation 'org.apache.grails:grails-testing-support-web'
diff --git a/grails-test-examples/geb-context-path/build.gradle b/grails-test-examples/geb-context-path/build.gradle
index 00ae5e70a8..88e659bc65 100644
--- a/grails-test-examples/geb-context-path/build.gradle
+++ b/grails-test-examples/geb-context-path/build.gradle
@@ -62,7 +62,7 @@ dependencies {
     runtimeOnly 'cloud.wondrify:asset-pipeline-grails'
     runtimeOnly 'com.h2database:h2'
     runtimeOnly 'org.apache.tomcat:tomcat-jdbc'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
 
     testImplementation 'org.apache.grails:grails-testing-support-datamapping'
     testImplementation 'org.apache.grails:grails-testing-support-web'
diff --git a/grails-test-examples/geb-gebconfig/build.gradle b/grails-test-examples/geb-gebconfig/build.gradle
index 0f8d0b7505..3f7f484e34 100644
--- a/grails-test-examples/geb-gebconfig/build.gradle
+++ b/grails-test-examples/geb-gebconfig/build.gradle
@@ -65,7 +65,7 @@ dependencies {
     runtimeOnly 'cloud.wondrify:asset-pipeline-grails'
     runtimeOnly 'com.h2database:h2'
     runtimeOnly 'org.apache.tomcat:tomcat-jdbc'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
 
     testImplementation 'org.apache.grails:grails-testing-support-datamapping'
     testImplementation 'org.apache.grails:grails-testing-support-web'
diff --git a/grails-test-examples/geb/build.gradle b/grails-test-examples/geb/build.gradle
index f957537f01..443aa29317 100644
--- a/grails-test-examples/geb/build.gradle
+++ b/grails-test-examples/geb/build.gradle
@@ -64,7 +64,7 @@ dependencies {
     runtimeOnly 'cloud.wondrify:asset-pipeline-grails'
     runtimeOnly 'com.h2database:h2'
     runtimeOnly 'org.apache.tomcat:tomcat-jdbc'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
 
     testImplementation 'org.apache.grails:grails-testing-support-datamapping'
     testImplementation 'org.apache.grails:grails-testing-support-web'
diff --git a/grails-test-examples/gsp-layout/build.gradle b/grails-test-examples/gsp-layout/build.gradle
index 60b1e65dfd..2139c0760f 100644
--- a/grails-test-examples/gsp-layout/build.gradle
+++ b/grails-test-examples/gsp-layout/build.gradle
@@ -50,7 +50,7 @@ dependencies {
     runtimeOnly 'org.apache.grails:grails-gsp'
     implementation 'org.apache.grails:grails-layout'
     runtimeOnly 'cloud.wondrify:asset-pipeline-grails'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
     runtimeOnly 'org.apache.grails:grails-url-mappings'
     runtimeOnly 'org.springframework.boot:spring-boot-autoconfigure'
     runtimeOnly 'org.springframework.boot:spring-boot-starter-logging'
diff --git a/grails-test-examples/gsp-sitemesh3/build.gradle b/grails-test-examples/gsp-sitemesh3/build.gradle
index 00aac73447..f9f222bec7 100644
--- a/grails-test-examples/gsp-sitemesh3/build.gradle
+++ b/grails-test-examples/gsp-sitemesh3/build.gradle
@@ -51,7 +51,7 @@ dependencies {
 
     runtimeOnly 'org.apache.grails:grails-gsp'
     runtimeOnly 'cloud.wondrify:asset-pipeline-grails'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
     runtimeOnly 'org.apache.grails:grails-url-mappings'
     runtimeOnly 'org.springframework.boot:spring-boot-autoconfigure'
     runtimeOnly 'org.springframework.boot:spring-boot-starter-logging'
diff --git a/grails-test-examples/hibernate7/async-events-pubsub-demo/build.gradle b/grails-test-examples/hibernate7/async-events-pubsub-demo/build.gradle
index 5159dbcf8f..458b048aec 100644
--- a/grails-test-examples/hibernate7/async-events-pubsub-demo/build.gradle
+++ b/grails-test-examples/hibernate7/async-events-pubsub-demo/build.gradle
@@ -62,7 +62,7 @@ dependencies {
     implementation 'org.springframework.boot:spring-boot-starter-tomcat'
 
     runtimeOnly 'com.h2database:h2'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
     runtimeOnly 'com.zaxxer:HikariCP'
 
     testImplementation 'org.apache.grails:grails-testing-support-web'
diff --git a/grails-test-examples/jetty/build.gradle b/grails-test-examples/jetty/build.gradle
index dd36e268aa..713a91fcd9 100644
--- a/grails-test-examples/jetty/build.gradle
+++ b/grails-test-examples/jetty/build.gradle
@@ -56,7 +56,7 @@ dependencies {
     testAndDevelopmentOnly 'org.webjars.npm:jquery'
 
     runtimeOnly 'cloud.wondrify:asset-pipeline-grails'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
 
     integrationTestImplementation testFixtures('org.apache.grails:grails-geb')
 }
diff --git a/grails-test-examples/mail/build.gradle b/grails-test-examples/mail/build.gradle
index 5f2fe17042..a146286ad9 100644
--- a/grails-test-examples/mail/build.gradle
+++ b/grails-test-examples/mail/build.gradle
@@ -46,7 +46,7 @@ dependencies {
     testAndDevelopmentOnly 'org.webjars.npm:jquery'
 
     runtimeOnly 'cloud.wondrify:asset-pipeline-grails'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
     runtimeOnly 'org.apache.grails:grails-services'
     runtimeOnly 'org.apache.grails:grails-url-mappings'
     runtimeOnly 'org.springframework.boot:spring-boot-autoconfigure'
diff --git a/grails-test-examples/mongodb/base/build.gradle b/grails-test-examples/mongodb/base/build.gradle
index 94b98935f5..ba803e644f 100644
--- a/grails-test-examples/mongodb/base/build.gradle
+++ b/grails-test-examples/mongodb/base/build.gradle
@@ -48,7 +48,7 @@ dependencies {
     testAndDevelopmentOnly 'org.webjars.npm:jquery'
 
     runtimeOnly 'cloud.wondrify:asset-pipeline-grails'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
     runtimeOnly 'org.apache.grails:grails-url-mappings'
     runtimeOnly 'org.apache.grails:grails-scaffolding'
     runtimeOnly 'org.springframework.boot:spring-boot-autoconfigure'
diff --git a/grails-test-examples/mongodb/database-per-tenant/build.gradle b/grails-test-examples/mongodb/database-per-tenant/build.gradle
index 6c3ceeda58..a2e23afabf 100644
--- a/grails-test-examples/mongodb/database-per-tenant/build.gradle
+++ b/grails-test-examples/mongodb/database-per-tenant/build.gradle
@@ -48,7 +48,7 @@ dependencies {
     testAndDevelopmentOnly 'org.webjars.npm:jquery'
 
     runtimeOnly 'cloud.wondrify:asset-pipeline-grails'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
     runtimeOnly 'org.apache.grails:grails-url-mappings'
     runtimeOnly 'org.springframework.boot:spring-boot-autoconfigure'
     runtimeOnly 'org.springframework.boot:spring-boot-starter-logging'
diff --git a/grails-test-examples/mongodb/hibernate5/build.gradle b/grails-test-examples/mongodb/hibernate5/build.gradle
index d3b91b69f4..8d0ae39c77 100644
--- a/grails-test-examples/mongodb/hibernate5/build.gradle
+++ b/grails-test-examples/mongodb/hibernate5/build.gradle
@@ -51,7 +51,7 @@ dependencies {
     runtimeOnly 'cloud.wondrify:asset-pipeline-grails'
     runtimeOnly 'com.h2database:h2'
     runtimeOnly 'com.zaxxer:HikariCP'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
     runtimeOnly 'org.apache.grails:grails-scaffolding'
     runtimeOnly 'org.apache.grails:grails-url-mappings'
     runtimeOnly 'org.hibernate:hibernate-ehcache', {
diff --git a/grails-test-examples/redis/build.gradle b/grails-test-examples/redis/build.gradle
index e656b71871..4dd103336a 100644
--- a/grails-test-examples/redis/build.gradle
+++ b/grails-test-examples/redis/build.gradle
@@ -49,7 +49,7 @@ dependencies {
     runtimeOnly 'cloud.wondrify:asset-pipeline-grails'
     runtimeOnly 'com.h2database:h2'
     runtimeOnly 'org.apache.tomcat:tomcat-jdbc'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
     runtimeOnly 'org.springframework.boot:spring-boot-autoconfigure'
     runtimeOnly 'org.springframework.boot:spring-boot-starter'
     runtimeOnly 'org.springframework.boot:spring-boot-starter-logging'
diff --git a/grails-test-examples/scaffolding/build.gradle b/grails-test-examples/scaffolding/build.gradle
index a89ba4b6ac..52463a928f 100644
--- a/grails-test-examples/scaffolding/build.gradle
+++ b/grails-test-examples/scaffolding/build.gradle
@@ -57,7 +57,7 @@ dependencies {
     implementation "org.apache.grails:grails-gsp"
     integrationTestImplementation testFixtures("org.apache.grails:grails-geb")
     profile "org.apache.grails.profiles:web"
-    runtimeOnly "org.fusesource.jansi:jansi"
+    runtimeOnly "org.jline:jansi"
     runtimeOnly "com.h2database:h2"
     runtimeOnly "com.zaxxer:HikariCP"
     runtimeOnly "cloud.wondrify:asset-pipeline-grails"
diff --git a/grails-test-examples/spring-security/acl/functional-test-app/build.gradle b/grails-test-examples/spring-security/acl/functional-test-app/build.gradle
index df891180ac..c6ab01a8f9 100644
--- a/grails-test-examples/spring-security/acl/functional-test-app/build.gradle
+++ b/grails-test-examples/spring-security/acl/functional-test-app/build.gradle
@@ -39,7 +39,7 @@ dependencies {
 
     runtimeOnly 'com.h2database:h2'
     runtimeOnly 'com.zaxxer:HikariCP'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
     runtimeOnly 'org.apache.grails:grails-databinding'
     runtimeOnly 'org.apache.grails:grails-services'
     runtimeOnly 'org.apache.grails:grails-url-mappings'
diff --git a/grails-test-examples/spring-security/cas/test1/build.gradle b/grails-test-examples/spring-security/cas/test1/build.gradle
index 7269dc728c..08dcbd6715 100644
--- a/grails-test-examples/spring-security/cas/test1/build.gradle
+++ b/grails-test-examples/spring-security/cas/test1/build.gradle
@@ -47,7 +47,7 @@ dependencies {
     runtimeOnly 'org.apache.grails:grails-databinding'
     runtimeOnly 'org.apache.grails:grails-url-mappings'
     runtimeOnly 'org.apache.grails:grails-data-hibernate5'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
     runtimeOnly 'org.springframework.boot:spring-boot-autoconfigure'
     runtimeOnly 'org.springframework.boot:spring-boot-starter-logging'
     runtimeOnly 'org.springframework.boot:spring-boot-starter-tomcat'
diff --git a/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/build.gradle b/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/build.gradle
index 2faa88f11d..f8620e545b 100644
--- a/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/build.gradle
+++ b/grails-test-examples/spring-security/ldap/custom-user-details-context-mapper/build.gradle
@@ -47,7 +47,7 @@ dependencies {
     runtimeOnly 'cloud.wondrify:asset-pipeline-grails'
     runtimeOnly 'com.h2database:h2'
     runtimeOnly 'com.zaxxer:HikariCP'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
     runtimeOnly 'org.apache.grails:grails-databinding'
     runtimeOnly 'org.apache.grails:grails-url-mappings'
     runtimeOnly 'org.apache.grails:grails-data-hibernate5'
diff --git a/grails-test-examples/spring-security/ldap/functional-test-app/build.gradle b/grails-test-examples/spring-security/ldap/functional-test-app/build.gradle
index cd84de6070..cff74e2142 100644
--- a/grails-test-examples/spring-security/ldap/functional-test-app/build.gradle
+++ b/grails-test-examples/spring-security/ldap/functional-test-app/build.gradle
@@ -46,7 +46,7 @@ dependencies {
     runtimeOnly 'cloud.wondrify:asset-pipeline-grails'
     runtimeOnly 'com.h2database:h2'
     runtimeOnly 'com.zaxxer:HikariCP'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
     runtimeOnly 'org.apache.grails:grails-databinding'
     runtimeOnly 'org.apache.grails:grails-services'
     runtimeOnly 'org.apache.grails:grails-url-mappings'
diff --git a/grails-test-examples/spring-security/ldap/retrieve-db-roles/build.gradle b/grails-test-examples/spring-security/ldap/retrieve-db-roles/build.gradle
index 9021327e0c..c9ce53bc9e 100644
--- a/grails-test-examples/spring-security/ldap/retrieve-db-roles/build.gradle
+++ b/grails-test-examples/spring-security/ldap/retrieve-db-roles/build.gradle
@@ -47,7 +47,7 @@ dependencies {
     runtimeOnly 'cloud.wondrify:asset-pipeline-grails'
     runtimeOnly 'com.h2database:h2'
     runtimeOnly 'com.zaxxer:HikariCP'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
     runtimeOnly 'org.apache.grails:grails-databinding'
     runtimeOnly 'org.apache.grails:grails-services'
     runtimeOnly 'org.apache.grails:grails-url-mappings'
diff --git a/grails-test-examples/spring-security/ldap/retrieve-group-roles/build.gradle b/grails-test-examples/spring-security/ldap/retrieve-group-roles/build.gradle
index de683ed0e1..0ed607c4e4 100644
--- a/grails-test-examples/spring-security/ldap/retrieve-group-roles/build.gradle
+++ b/grails-test-examples/spring-security/ldap/retrieve-group-roles/build.gradle
@@ -47,7 +47,7 @@ dependencies {
     runtimeOnly 'cloud.wondrify:asset-pipeline-grails'
     runtimeOnly 'com.h2database:h2'
     runtimeOnly 'com.zaxxer:HikariCP'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
     runtimeOnly 'org.apache.grails:grails-databinding'
     runtimeOnly 'org.apache.grails:grails-url-mappings'
     runtimeOnly 'org.apache.grails:grails-services'
diff --git a/grails-test-examples/spring-security/ui/extended/build.gradle b/grails-test-examples/spring-security/ui/extended/build.gradle
index 23de3fbf75..2698abebef 100644
--- a/grails-test-examples/spring-security/ui/extended/build.gradle
+++ b/grails-test-examples/spring-security/ui/extended/build.gradle
@@ -49,7 +49,7 @@ dependencies {
     runtimeOnly 'com.zaxxer:HikariCP'
     runtimeOnly 'org.apache.grails:grails-services'
     runtimeOnly 'org.apache.grails:grails-url-mappings'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
     runtimeOnly 'org.springframework.boot:spring-boot-autoconfigure'
     runtimeOnly 'org.springframework.boot:spring-boot-starter-logging'
     runtimeOnly 'org.springframework.boot:spring-boot-starter-tomcat'
diff --git a/grails-test-examples/spring-security/ui/simple/build.gradle b/grails-test-examples/spring-security/ui/simple/build.gradle
index 6b1bf070ff..f6b1d69cd8 100644
--- a/grails-test-examples/spring-security/ui/simple/build.gradle
+++ b/grails-test-examples/spring-security/ui/simple/build.gradle
@@ -49,7 +49,7 @@ dependencies {
     runtimeOnly 'com.zaxxer:HikariCP'
     runtimeOnly 'org.apache.grails:grails-services'
     runtimeOnly 'org.apache.grails:grails-url-mappings'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
     runtimeOnly 'org.springframework.boot:spring-boot-autoconfigure'
     runtimeOnly 'org.springframework.boot:spring-boot-starter-logging'
     runtimeOnly 'org.springframework.boot:spring-boot-starter-tomcat'
diff --git a/grails-test-examples/undertow/build.gradle b/grails-test-examples/undertow/build.gradle
index 5e3ef303ec..de66441b96 100644
--- a/grails-test-examples/undertow/build.gradle
+++ b/grails-test-examples/undertow/build.gradle
@@ -56,7 +56,7 @@ dependencies {
     testAndDevelopmentOnly 'org.webjars.npm:jquery'
 
     runtimeOnly 'cloud.wondrify:asset-pipeline-grails'
-    runtimeOnly 'org.fusesource.jansi:jansi'
+    runtimeOnly 'org.jline:jansi'
 
     integrationTestImplementation testFixtures('org.apache.grails:grails-geb')
 }
diff --git a/grails-web-url-mappings/build.gradle b/grails-web-url-mappings/build.gradle
index 9e9e27762a..cb447a430a 100644
--- a/grails-web-url-mappings/build.gradle
+++ b/grails-web-url-mappings/build.gradle
@@ -66,8 +66,8 @@ dependencies {
     api 'org.apache.groovy:groovy'
     api project(':grails-datamapping-validation')
 
-    compileOnly 'org.fusesource.jansi:jansi'
-    testRuntimeOnly 'org.fusesource.jansi:jansi'
+    compileOnly 'org.jline:jansi'
+    testRuntimeOnly 'org.jline:jansi'
     compileOnly 'org.jline:jline'
 
     implementation 'com.github.ben-manes.caffeine:caffeine'
diff --git a/grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/reporting/AnsiConsoleUrlMappingsRenderer.groovy b/grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/reporting/AnsiConsoleUrlMappingsRenderer.groovy
index 78a8f2f6c8..3afed025bf 100644
--- a/grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/reporting/AnsiConsoleUrlMappingsRenderer.groovy
+++ b/grails-web-url-mappings/src/main/groovy/org/grails/web/mapping/reporting/AnsiConsoleUrlMappingsRenderer.groovy
@@ -20,7 +20,7 @@ package org.grails.web.mapping.reporting
 
 import groovy.transform.CompileStatic
 
-import org.fusesource.jansi.Ansi
+import org.jline.jansi.Ansi
 
 import grails.build.logging.GrailsConsole
 import grails.gorm.validation.ConstrainedProperty
@@ -29,12 +29,12 @@ import grails.web.mapping.reporting.UrlMappingsRenderer
 import org.grails.web.mapping.ResponseCodeMappingData
 import org.grails.web.mapping.ResponseCodeUrlMapping
 
-import static org.fusesource.jansi.Ansi.Color.CYAN
-import static org.fusesource.jansi.Ansi.Color.DEFAULT
-import static org.fusesource.jansi.Ansi.Color.GREEN
-import static org.fusesource.jansi.Ansi.Color.RED
-import static org.fusesource.jansi.Ansi.Color.YELLOW
-import static org.fusesource.jansi.Ansi.ansi
+import static org.jline.jansi.Ansi.Color.CYAN
+import static org.jline.jansi.Ansi.Color.DEFAULT
+import static org.jline.jansi.Ansi.Color.GREEN
+import static org.jline.jansi.Ansi.Color.RED
+import static org.jline.jansi.Ansi.Color.YELLOW
+import static org.jline.jansi.Ansi.ansi
 
 /**
  * Renders URL mappings to the console