(快速参考)

3 从先前版本升级

版本 6.2.0

3 从先前版本升级

3.1 从 Grails 5 升级到 Grails 6

为了确保与 Grails 6 兼容,您必须更新项目中的以下版本

1. Java 11 作为基准

从 Grails 6 开始,Java 11 成为该框架的基准要求。升级到 Grails 6 时,请确保您的项目配置为使用 Java 11。这种与 Java 11 的兼容性使您能够利用 Java 11 提供的最新功能、安全增强功能和性能改进。

在继续进行 Grails 6 升级之前,请确保将项目的 Java 版本更新到 11。这样做将确保顺利过渡到最新版本的 Grails,并使您能够享受 Java 11 提供的所有优势。

2. 新的 Grails CLI

Grails 6 带来了一个经过全面改进且高效的命令行界面 (CLI),使您能够以惊人的速度生成应用程序和插件。例如,您现在可以使用新的 CLI 通过以下命令创建一个新的 Grails 6 应用程序

grails create-app my-app

新的 CLI 还允许您轻松生成插件。例如,要创建一个名为“my-plugin”的新插件,您可以使用以下命令

grails create-plugin my-plugin

Grails 6 中一项值得注意的改进是,它不再支持某些执行冗余任务的命令,例如过时的 grails run-app 命令。相反,它建议使用 Gradle bootRun 任务来运行您的应用程序,该任务可提供更好的性能和功能。

例如,要运行您的 Grails 6 应用程序,您可以使用以下命令

./gradlew bootRun

由于这些改进,新的 CLI 提供了一种更简化、更高效的方式来处理 Grails 应用程序和插件。

此外,为了充分利用 Grails 6 中的改进,建议从项目根文件夹中删除旧的 Grails 包装器文件 ./grailsw./grails。这可确保您完全依赖于新 CLI 的增强功能。

总的来说,Grails 6 通过其新的 CLI、优化的命令以及用于生成应用程序和插件的先进功能,提供了显著改进的开发体验。

3. 设置 Grails 版本和 Grails Gradle 插件

要升级到 Grails 6,请务必在 gradle.properties 文件中配置适当的版本,如下所示

gradle.properties
grailsVersion=6.0.0
grailsGradlePluginVersion=6.0.0

通过指定上述版本,您将获得 Grails 6 中引入的最新功能、改进和错误修复。升级到此版本可以通过增强的性能和改进的安全性增强您的应用程序。此外,它还允许您利用 Grails 框架中的最新进展,以获得更高效、更安全的开发体验。

4. GORM 版本

如果您的项目使用 GORM,请确保更新 gradle.properties 文件中的版本,如下所示

gradle.properties
gormVersion=8.0.0

通过升级到 GORM 8.0.0,您将受益于必要的更新和优化。此升级可确保与您的数据库无缝交互,并增强您的数据管理体验。及时了解 GORM 允许您利用最新的数据库功能和改进,从而优化应用程序的性能和功能。

5. Gradle 版本

Grails 6 使用 Gradle 7.6.2,它比以前的版本提供了性能改进、错误修复和新功能。升级到最新的 Gradle 版本有助于加速您的构建过程,并确保与其他依赖项的兼容性。

5.1. 升级到 Gradle 7.6.2

运行以下命令将 Gradle 包装器更新到所需的版本(例如,Gradle 7.6.2)

./gradlew wrapper --gradle-version 7.6.2

此命令将下载指定的 Gradle 版本,并更新项目中的 Gradle 包装器设置。

5.2. 检查 Gradle 版本

命令完成后,您可以通过检查位于 gradle/wrapper 目录中的 gradle-wrapper.properties 文件来验证 Gradle 版本是否已更新。文件中的 distributionUrl 现在应指向 Gradle 7.6.2 发行版

distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.2-bin.zip
5.3. 构建项目

更新 Gradle 包装器后,您现在可以使用更新的 Gradle 版本构建 Grails 项目

./gradlew build

这将使用新的 Gradle 版本启动构建过程。

6. 拥抱 Grails 6 中的现代插件管理

在 Gradle 中,有两种主要方法可以将插件添加到您的项目中:plugins 块和 apply plugin 语句。

Grails 6 引入了一个重大的变化,即采用 Gradle plugins 块来管理插件,而不是传统的 apply plugin 语句。这种转变简化了项目的构建配置,使其更符合现代 Gradle 约定。新的 Grails 项目现在将利用 plugins 块来管理插件依赖项和配置。

在 Grails 6 中使用 plugins

使用新方法,将插件添加到 Grails 6 项目中更加明确和有条理。在您的 build.gradle 文件中,您可以在 plugins 块内声明插件,并指定插件的 ID 和版本。

以下是使用 plugins 块添加 views-json 插件的示例

build.gradle
plugins {
    id 'org.grails.plugins.views-json' version '3.0.0'
}

管理多个插件

plugins 块允许您添加多个插件,每个插件都在自己的行上。这增强了清晰度,并使管理插件依赖项变得更容易。

build.gradle
plugins {
    id 'org.grails.plugins.views-json' version '3.0.0'
    // Add other plugins as needed
}

将旧应用程序迁移到新方法

如果您要将较旧的 Grails 应用程序迁移到 Grails 6,可以将插件声明从 apply plugin 更新到 plugins 块。例如,如果以前的应用程序使用 views-json 插件,则可以按如下方式修改 build.gradle

之前(使用 apply plugin

build.gradle
apply plugin: 'org.grails.plugins.views-json'

之后(在 Grails 6 中使用 plugins 块)

build.gradle
plugins {
    id 'org.grails.plugins.views-json' version '3.0.0'
}

通过迁移到 plugins 块,您的 Grails 6 项目将遵循现代 Gradle 约定,从而更易于管理插件依赖项和配置。这种新方法保持了一致性,并增强了项目的整体结构,确保了更平滑、更高效的开发流程。

6.2. 使用 pluginManagement 块

build.gradle 文件中的 apply plugin 迁移到 settings.gradle 文件中的 pluginManagement 块是 Grails 6 中引入的一项重大变化。此变化是 Grails 努力采用 Gradle pluginManagement 方法来更好地控制插件版本并在项目之间保持一致性的一部分。

在以前版本的 Grails(Grails 6 之前)中,开发人员习惯于使用 apply plugin 语法直接在 build.gradle 文件中应用插件。例如

build.gradle
buildscript {
    repositories {
        maven { url "https://plugins.gradle.org.cn/m2/" }
        maven { url "https://repo.grails.org/grails/core" }
    }
    dependencies {
        classpath "org.grails:grails-gradle-plugin:$grailsGradlePluginVersion"
        classpath "org.grails.plugins:hibernate5:7.3.0"
        classpath "org.grails.plugins:views-gradle:2.3.2"
    }
}

version "0.1"
group "hellorestapi"

apply plugin:"eclipse"
apply plugin:"idea"
apply plugin:"war"
apply plugin:"org.grails.grails-web"
apply plugin:"org.grails.plugins.views-json"

但是,在 Grails 6 中,建议的做法是将插件声明移动到 settings.gradle 文件中的 pluginManagement 块中。pluginManagement 块充当管理多项目构建中所有项目的插件版本的中心位置。

在 pluginManagement 块中配置插件

以下是您如何在 pluginManagement 块中声明 views-json 插件的方法

  1. 在您的 Grails 6 项目中打开 settings.gradle 文件。

  2. 添加包含 views-json 插件声明的 pluginManagement

settings.gradle
pluginManagement {
    repositories {
        // Add the Grails plugin repository to resolve the views-json plugin
        maven { url "https://repo.grails.org/grails/core" }
        // Other repositories can be added here if needed
    }

    // Declare the views-json plugin and its version
    plugins {
        id 'org.grails.plugins.views-json' version '3.0.0'
        // Other plugins can be declared here
    }
}

通过在 pluginManagement 块中包含 views-json 插件,Grails 6 将确保多项目构建中的所有项目都使用指定版本的 views-json 插件。这促进了不同项目之间 JSON 渲染的一致性,并简化了维护和版本控制。

将旧应用程序迁移到新方法

如果您要将较旧的 Grails 应用程序迁移到 Grails 6,可以将插件声明从 apply plugin 更新到 build.gradle 文件中的 plugins 块,如上一节所示。

通过采用 pluginManagement 块并在 settings.gradle 文件中声明 views-json 插件,您可以确保在 Grails 6 生态系统的所有项目中一致地使用该插件。这种方法简化了插件版本控制,并在使用 Grails 应用程序中的 JSON 响应时改进了整体开发体验。

6.3 Grails 采用 "buildSrc" 文件夹管理构建脚本依赖

在之前的 Grails 版本中(Grails 6 之前),管理构建脚本依赖(例如 views-gradle 插件)通常直接在主 build.gradle 文件中完成。这使得 Gradle 可以在生产环境中编译 JSON 视图。开发人员会在 buildscript 块中定义构建脚本所需的仓库和依赖项。

build.gradle
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        // Example: views-gradle plugin
        classpath "org.grails.plugins:views-gradle:3.0.0"
    }
}

// Apply the views-json plugin
apply plugin: 'views-json'

// Other configurations and dependencies

这种方法意味着构建脚本依赖项与项目的其余配置混合在一起,使得 build.gradle 文件更长,并且可能更难维护。因此,构建脚本部分可能会充斥着各种插件依赖项和其他构建逻辑。

随着 Grails 6 的引入,通过使用 buildSrc 文件夹,管理构建脚本依赖项的方式得到了显著改进。这个专用文件夹提供了一种更有条理的方法来处理构建脚本依赖项、自定义 Gradle 插件和特定于项目的扩展。

Grails 6 采用 "buildSrc" 文件夹的优势

  1. 模块化构建配置: buildSrc 文件夹充当 Grails 应用程序中的一个独立迷你项目,允许您封装构建逻辑、插件和依赖项。这种关注点分离提高了构建配置的组织性和模块化。

  2. 简化的构建脚本管理: 通过将构建脚本依赖项移至 buildSrc,您可以保持主 build.gradle 文件的整洁,并专注于应用程序的特定需求。这减少了混乱,并促进了更简洁明了的构建脚本。

  3. 更好的协作: buildSrc 方法简化了开发团队内部的协作。构建逻辑可以集中起来并在项目之间共享,从而实现一致且高效的开发工作流程。

从 Grails 5 更新

新的 Grails 6 应用程序使用 buildSrc/build.gradle。如果需要额外的配置(例如应用插件或声明依赖项),buildSrc 目录可以托管构建脚本。Grails 项目中的 buildSrc 文件夹遵循特定的树形布局,其中包括 build.gradle 文件。以下是树形布局:

buildSrc/
├── build.gradle
└── src/
    └── main/
        └── groovy/

让我们逐步介绍如何在 Grails 6 中使用 buildSrc 文件夹管理 views-gradle 插件。

步骤 1:创建 buildSrc 文件夹

在 Grails 6 项目的根目录中,创建一个名为 buildSrc 的新文件夹。

步骤 2:添加 buildSrc 脚本

buildSrc 文件夹中,创建一个 build.gradle 文件,并指定 views-gradle 插件依赖项。

buildSrc/build.gradle
repositories {
    mavenCentral()
}

dependencies {
    implementation "org.grails.plugins:views-gradle:3.0.0"
}

步骤 3:删除 apply plugin 语句

在主 build.gradle 文件中,删除与 views-gradle 相关的 buildscript 块和 apply plugin 语句,因为它现在在 buildSrc 文件夹中管理。

build.gradle
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.grails.plugins:views-gradle:3.0.0"
    }
}

// No need to apply views-json plugin here
// Remove the apply plugin statement for views-json if it was previously present
apply plugin: 'views-json'

// ... Other configurations and dependencies

通过使用 buildSrc 文件夹,开发人员可以将构建脚本依赖项和自定义插件配置与主 build.gradle 文件分离。这将生成更清晰、更简洁的构建脚本,更易于维护和理解。此外,buildSrc 方法鼓励模块化,因为构建逻辑和自定义插件可以集中起来并在项目之间共享,从而促进开发团队内部更好的协作和一致性。

7. 用于 MongoDB 同步驱动的 GORM

GORM for MongoDB 已更新,以支持最新的 mongodb-driver-sync。如果您正在使用 GORM for MongoDB 并利用了特定的 MongoDB 驱动程序或低级 Mongo API 功能,请考虑查看升级到 4.0 驱动程序指南

此更新确保与 MongoDB 无缝集成,访问新功能,并在与 MongoDB 数据库交互时提高性能。

8. 资源管道插件

在 Grails 6 中,资源管道插件已更新至 4.3.0 版。资源管道插件是 Grails 应用程序中的一个关键组件,负责管理前端资源,如样式表、JavaScript 文件和图像。更新至 4.3.0 版带来了一些改进和新功能,以增强 Grails 项目中前端资源的管理和处理。

asset-pipeline 插件 4.3.0 提供了用于管理和处理前端资源的新功能,确保它们得到有效捆绑并提供给用户。

9. Spring 5.3

Grails 6 基于 Spring 5.3.27 构建。如果您的项目使用 Spring 特定功能,请参阅升级到 Spring 5.3 指南

Spring 5.3 引入了对 Spring 框架的增强和修复,为您提供了依赖注入、Web 框架和其他 Spring 相关功能的最新改进。

10. Spring Boot 2.7

Grails 6 更新至 Spring Boot 2.7。有关更多信息,请参阅Spring Boot 2.7 发行说明

Spring Boot 2.7 带来了新功能、性能增强和兼容性改进,为您的 Grails 应用程序奠定了坚实的基础。

11. Micronaut 3.9.3

Grails 6 附带 Micronaut 3.9.3。如果您正在使用特定的 Micronaut 功能,请参阅升级到 Micronaut 3.x 指南

Micronaut 3.9.3 带来了新功能、改进和错误修复,为您的应用程序提供了强大且轻量级的微服务框架。

12. Micronaut for Spring 4.5.1

Grails 6 已更新为使用 Micronaut for Spring 4.5.1。有关更多信息,请查看发行说明

Micronaut for Spring 4.5.1 提供了 Micronaut 和 Spring 之间的无缝集成,允许您在 Grails 项目中利用这两个框架的优势。

3.2 从 Grails 4 升级到 Grails 5

提升 Grails 版本

您需要将 gradle.properties 中定义的 Grails 版本升级为:

gradle.properties
...
grailsVersion=5.2.0
...

Apache Groovy 3.0.7

Grails 5.1.1 提供对 Groovy 3 的支持。我们建议您查看Groovy 3 发行说明,以便在您使用 Groovy 3 中可能不支持的特定功能时更新您的应用程序。

gradle.properties 中定义 groovyVersion 以强制应用程序使用 Groovy 3。

Grails 5.1 应用程序的 gradle.properties

gradle.properties
...
groovyVersion=3.0.7
...

提升 GORM 版本

如果您正在使用GORM,则需要将 gradle.properties 中定义的版本更新为:

gradle.properties
...
gormVersion=7.2.0
...

提升 Gradle 版本

Grails 5.2.x 使用 Gradle 7.2

gradle-wrapper.properties
...
distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
...

您也可以运行以下命令:

./gradlew wrapper --gradle-version 7.2

用于 MongoDB 同步驱动的 GORM

GORM for MongoDB 已更新,以支持最新的 mongodb-driver-sync。如果您正在使用 GORM for MongoDB 并对 MongoDB 驱动程序或低级 Mongo API 执行特定操作,则可能需要查看升级到 4.0 驱动程序

提升资源管道插件版本

先前版本的 asset-pipeline 不受 Grails 5.0 支持,因为它使用与 Groovy 3 二进制不兼容的 Groovy 版本进行编译。因此,请将插件版本更新至 3.2.4。

默认禁用 StringCharArrayAccessor

先前版本的 Grails 使用默认启用的 StringCharArrayAccessor,它提供对 java.lang.String 内部结构的优化访问。在 Grails 5.0 中,它默认禁用,但您可以通过设置名称为 stringchararrayaccessor.disabled 且值为 false 的系统属性来启用它。

启用 StringCharArrayAccessor 将显示 IllegalReflectiveAccess 警告,因为它使用反射来进行优化。

Grails 配置文件中 profile.yml 和 feature.yml 文件的更改

定义特征和配置文件中依赖项的方式已更改。有关更多信息,请参阅应用程序配置文件部分。

不推荐使用点导航 Grails 配置

为了降低复杂性、提高性能和增强可维护性,不推荐使用点符号 (config.a.b.c) 访问配置。此功能将在未来版本中删除。

此外,如果您通过点符号访问配置,您将看到一条警告消息。

访问配置的推荐方法是:

grailsApplication.config.getProperty("hola", String.class)

Spring 5.3

Grails 5.0.0.RC1 基于 Spring 5.3.2 构建。如果您使用 Spring 特定功能,请参阅升级到 Spring 5.3

Spring Boot 2.4

Grails 5.1.1 更新至 Spring Boot 2.6。有关更多信息,请查看Spring Boot 2.6 发行说明

Micronaut 3.2.0

Grails 5.1.1 附带 Micronaut 3.2.0。如果您使用特定功能,请查看升级到 Micronaut 3.x

Micronaut for Spring 4.0.1

Grails 5.1.1 已更新至 Micronaut for Spring 4.0.1,有关更多信息,请查看发行说明

Gradle 7.x

编译依赖项配置以及其他配置已从 Gradle 7.x 中删除。在先前版本中,它们已被弃用。

替换配置

build.gradle
...
 compile -> implementation
 testCompile -> testImplementation
 runtime -> runtimeOnly
...
有关 Gradle 升级文档的更多信息,请参阅Gradle 升级文档

多项目设置中的插件

如果您的多项目构建中包含 grails 插件,则还应该将 compile 配置替换为 implementation 配置。

此外,如果您的主应用程序依赖于插件声明的依赖项,则需要应用进一步的更改。

要再次使用这些依赖项,您必须使用 api 配置声明它们。您还必须在插件项目中应用 java-library gradle 插件。

3.3 从 Grails 3.3.x 升级到 Grails 4

提升 Grails 版本

您需要升级 gradle.properties 中定义的 Grails 版本。

Grails 3 应用程序的 gradle.properties

gradle.properties
...
grailsVersion=3.3.8
...

Grails 4 应用程序的 gradle.properties

gradle.properties
...
grailsVersion=4.0.4
...

提升 GORM 版本

如果您使用的是 GORM,则需要更新 gradle.properties 中定义的版本。

Grails 3 应用程序的 gradle.properties

gradle.properties
...
gormVersion=6.1.10.RELEASE
...

Grails 4 应用程序的 gradle.properties

gradle.properties
...
gormVersion=7.0.4
...

将 GORM DSL 条目移动到 runtime.groovy

GORM DSL 条目应移至 runtime.groovy。例如,在 application.groovy 中使用以下 GORM 配置不受支持,并且会破坏应用程序

grails.gorm.default.mapping = {
    id generator: 'identity'
}

Spring 5 和 Spring Boot 2.1

Grails 4.0 基于 Spring 5 和 Spring Boot 2.1 构建。如果您使用的是 Spring 特定功能,请参阅 迁移指南发行说明

Hibernate 5.4 和 GORM 7.x

Grails 4.x 支持最低版本的 Hibernate 5.4 和 GORM 7.x。GORM 进行了一些更改,以支持更新版本的 Hibernate 并简化 GORM 本身。

有关这些更改的详细信息,请参阅 GORM 升级文档

Spring Boot 2.1 Actuator

请查看 Spring Boot Actuator 文档,因为它与 Grails 3.x 使用的 Spring Boot 1.5 版本相比发生了很大变化。

如果您有如下配置

grails-app/conf/application.yml - Grails 3.3.x
endpoints:
    enabled: false
    jmx:
        enabled: true
        unique-names: true

请将其替换为

grails-app/conf/application.yml - Grails 4.x
spring:
    jmx:
        unique-names: true
management:
    endpoints:
        enabled-by-default: false

Spring Boot Developer Tools 和 Spring Loaded

早期版本的 Grails 使用名为 Spring Loaded 的重新加载代理。由于该库不再维护并且不支持 Java 11,因此已删除对 Spring Loaded 的支持。

作为替代,Grails 4 应用程序在 build.gradle 构建脚本中包含了 Spring Boot Developer Tools 依赖项。如果您要迁移 Grails 3.x 应用程序,请包含以下依赖项集

build.gradle
.
..
...
configurations {
    developmentOnly
    runtimeClasspath {
        extendsFrom developmentOnly
    }
}

dependencies {
        developmentOnly("org.springframework.boot:spring-boot-devtools")
        ...
        ..
}
...
..
.

此外,您应该在 application.yml 中为 Spring Developer Tools 配置必要的排除项

spring:
    devtools:
        restart:
            exclude:
                - grails-app/views/**
                - grails-app/i18n/**
                - grails-app/conf/**

上述配置可防止服务器在视图或消息包更改时重新启动。

您可以将 Spring Developer Tools 与浏览器扩展程序(例如 Chrome LiveReload 扩展程序)结合使用,以便在更改 Grails 应用程序中的任何内容时自动刷新浏览器。

Spring Boot Gradle 插件更改

Grails 4 基于 Spring Boot 2.1 构建。Grails 3 应用程序基于 Spring Boot 1.x 构建。

您的 Grails 3 应用程序的 build.gradle 可能具有如下配置

build.gradle
bootRun {
    addResources = true
    ...
}

Grails 4 应用程序基于 Spring Boot 2.1 构建。从 Spring Boot 2.0 开始,addResources 属性不再存在。相反,您需要将 sourceResources 属性设置为要使用的源集。通常是 sourceSets.main。这在 Spring Boot Gradle 插件文档 中有所描述。

您的 Grails 4 应用程序的 build.gradle 可以配置为

build.gradle
bootRun {
        sourceResources sourceSets.main
    ...
}

为 Grails 插件构建可执行 jar

bootRepackage 任务已分别替换为 bootJar 和 bootWar 任务,用于构建可执行 jar 和 war。这两个任务都扩展了它们等效的标准 Gradle jar 或 war 任务,使您可以访问所有常用的配置选项和行为。

如果您有如下配置

build.gradle | Grails 3
// enable if you wish to package this plugin as a standalone application
bootRepackage.enabled = false

请将其替换为

build.gradle | Grails 4
// enable if you wish to package this plugin as a standalone application
bootJar.enabled = false

升级到 Gradle 5

默认情况下,Grails 3 应用程序使用 Gradle 3.5。Grails 4 应用程序使用 Gradle 5。

要升级到 Gradle 5,请执行

./gradlew wrapper --gradle-version 5.0

由于 Gradle 5 中的更改,插件的传递依赖项不再解析。如果您的项目使用了具有传递依赖项的插件,则需要将这些依赖项显式添加到 build.gradle 文件中。

如果您自定义了应用程序的构建,则可能需要进行其他迁移。请查看 Gradle 升级您的构建 文档。特别要注意的是,默认的 Gradle 守护进程现在以 512MB 的堆启动,而不是 1GB。请查看 默认内存设置已更改 文档。

Groovy 语言更新至 2.5.6

请记住,在 grails 4.0.x 中,有一个小的 groovy 语言升级(例如,3.3.9 使用 groovy 2.4.x),这需要进行一些更改,这些更改在尝试编译源代码时会立即显现出来。但是,核心链表函数的实现也发生了变化!在此处查看重大更改的概述:Groovy 2.5 的重大更改

删除了日期辅助函数

最常见的问题是日期实用程序函数已移至单个项目中,例如,如果不添加以下内容,则 new Date().format("ddMMyyyy") 将不再起作用

build.gradle
dependencies {
    implementation "org.codehaus.groovy:groovy-dateutil:3.0.4"
}

更改了链表方法实现

检查您是否正在使用 groovy 版本的链表实现

  • [].pop() - 将不再删除列表的最后一个元素,而是删除第一个元素。建议将其替换为 [].removeLast()

  • [].push(..) - 将不再添加到列表的末尾,而是添加到列表的开头。建议将其替换为 [].add(..)

H2 Web 控制台

Spring Boot 2.1 包括对 H2 数据库 Web 控制台的原生支持。由于 Spring Boot 中已经包含此功能,因此已从 Grails 中删除了等效功能。因此,H2 控制台现在位于 /h2-console,而不是以前的 URI /dbconsole。有关更多信息,请参阅 Spring Boot 文档中的 使用 H2 的 Web 控制台

升级 Hibernate

如果您在 Grails 3 应用程序中使用 GORM 作为 Hibernate 实现,则需要升级到 Hibernate 5.4。

Grails 3 build.gradle 例如

build.gradle
dependencies {
...
  implementation "org.grails.plugins:hibernate5"
  implementation "org.hibernate:hibernate-core:5.1.5.Final"
}

在 Grails 4 中将变为

build.gradle
dependencies {
...
  implementation "org.grails.plugins:hibernate5"
  implementation "org.hibernate:hibernate-core:5.4.0.Final"
}

迁移到 Geb 2.3

Geb 1.1.x(与 JDK 1.7 兼容的版本)是 Grails 3 默认附带的版本。Grails 4 不再与 Java 1.7 兼容。您应该迁移到 Geb 2.3。

在 Grails 3 中,如果您的 build.gradle 看起来像这样

build.gradle
dependencies {
 testCompile "org.grails.plugins:geb:1.1.2"
 testRuntime "org.seleniumhq.selenium:selenium-htmlunit-driver:2.47.1"
 testRuntime "net.sourceforge.htmlunit:htmlunit:2.18"
}

在 Grails 4 中,您应该将其替换为

build.gradle
buildscript {
    repositories {
       ...
    }
    dependencies {
        ...
        classpath "gradle.plugin.com.energizedwork.webdriver-binaries:webdriver-binaries-gradle-plugin:$webdriverBinariesVersion" (1)
    }
}
...
..

repositories {
  ...
}

apply plugin:"idea"
...
...
apply plugin:"com.energizedwork.webdriver-binaries" (1)


dependencies {
...
    testCompile "org.grails.plugins:geb" (4)
    testRuntime "org.seleniumhq.selenium:selenium-chrome-driver:$seleniumVersion"  (5)
    testRuntime "org.seleniumhq.selenium:selenium-firefox-driver:$seleniumVersion" (5)
    testRuntime "org.seleniumhq.selenium:selenium-safari-driver:$seleniumSafariDriverVersion" (5)

    testCompile "org.seleniumhq.selenium:selenium-remote-driver:$seleniumVersion" (5)
    testCompile "org.seleniumhq.selenium:selenium-api:$seleniumVersion" (5)
    testCompile "org.seleniumhq.selenium:selenium-support:$seleniumVersion" (5)
}

webdriverBinaries {
    chromedriver "$chromeDriverVersion" (2)
    geckodriver "$geckodriverVersion" (3)
}

tasks.withType(Test) {
    systemProperty "geb.env", System.getProperty('geb.env')
    systemProperty "geb.build.reportsDir", reporting.file("geb/integrationTest")
    systemProperty "webdriver.chrome.driver", System.getProperty('webdriver.chrome.driver')
    systemProperty "webdriver.gecko.driver", System.getProperty('webdriver.gecko.driver')
}
gradle.properties
gebVersion=2.3
seleniumVersion=3.12.0
webdriverBinariesVersion=1.4
hibernateCoreVersion=5.1.5.Final
chromeDriverVersion=2.44 (2)
geckodriverVersion=0.23.0 (3)
seleniumSafariDriverVersion=3.14.0
1 包括 Webdriver 二进制文件 Gradle 插件
2 设置适当的 适用于 Chrome 版本的 Webdriver
3 设置适当的 适用于 Firefox 版本的 Webdriver
4 包括 Grails Geb 插件依赖项,它对 geb-spock 具有传递依赖项。这是使用 Geb 和 Spock 所需的依赖项。
5 Selenium 和不同的驱动程序依赖项。

还要在 src/integration-test/resources/GebConfig.groovy 处创建一个 Geb 配置 文件。

src/integration-test/resources/GebConfig.groovy
import org.openqa.selenium.chrome.ChromeDriver
import org.openqa.selenium.chrome.ChromeOptions
import org.openqa.selenium.firefox.FirefoxDriver
import org.openqa.selenium.firefox.FirefoxOptions
import org.openqa.selenium.safari.SafariDriver

environments {

    // You need to configure in Safari -> Develop -> Allowed Remote Automation
    safari {
        driver = { new SafariDriver() }
    }

    // run via “./gradlew -Dgeb.env=chrome iT”
    chrome {
        driver = { new ChromeDriver() }
    }

    // run via “./gradlew -Dgeb.env=chromeHeadless iT”
    chromeHeadless {
        driver = {
            ChromeOptions o = new ChromeOptions()
            o.addArguments('headless')
            new ChromeDriver(o)
        }
    }

    // run via “./gradlew -Dgeb.env=firefoxHeadless iT”
    firefoxHeadless {
        driver = {
            FirefoxOptions o = new FirefoxOptions()
            o.addArguments('-headless')
            new FirefoxDriver(o)
        }
    }

    // run via “./gradlew -Dgeb.env=firefox iT”
    firefox {
        driver = { new FirefoxDriver() }
    }
}

已弃用的类

Grails 4 中已删除以下在 Grails 3.x 中已弃用的类。请查看以下列表以找到合适的替代品

已删除的类

替代品

org.grails.datastore.gorm.validation.constraints.UniqueConstraint

org.grails.datastore.gorm.validation.constraints.builtin.UniqueConstraint

grails.util.BuildScope

grails.transaction.GrailsTransactionTemplate

grails.gorm.transactions.GrailsTransactionTemplate

org.grails.transaction.transform.RollbackTransform

org.grails.datastore.gorm.transactions.transform.RollbackTransform

grails.transaction.NotTransactional

grails.gorm.transactions.NotTransactional

grails.transaction.Rollback

grails.gorm.transactions.Rollback

grails.transaction.Transactional

grails.gorm.transactions.Transactional

org.grails.config.FlatConfig

org.grails.core.metaclass.MetaClassEnhancer

请改用特征。

org.grails.core.util.ClassPropertyFetcher

org.grails.datastore.mapping.reflect.ClassPropertyFetcher

org.grails.transaction.transform.TransactionalTransform

org.grails.datastore.gorm.transactions.transform.TransactionalTransform

grails.core.ComponentCapableDomainClass

grails.core.GrailsDomainClassProperty

请改用 org.grails.datastore.mapping.model.MappingContext API

org.grails.core.DefaultGrailsDomainClassProperty

org.grails.core.MetaGrailsDomainClassProperty

org.grails.core.support.GrailsDomainConfigurationUtil

请改用 org.grails.datastore.mapping.model.MappingContextorg.grails.datastore.mapping.model.MappingFactory API

org.grails.plugins.domain.DomainClassPluginSupport

org.grails.plugins.domain.support.GormApiSupport

org.grails.plugins.domain.support.GrailsDomainClassCleaner

现在由 org.grails.datastore.mapping.model.MappingContext 处理

grails.validation.AbstractConstraint

请改用 org.grails.datastore.gorm.validation.constraints.AbstractConstraint

grails.validation.AbstractVetoingConstraint

 org.grails.datastore.gorm.validation.constraints.AbstractVetoingConstraint

grails.validation.CascadingValidator

grails.gorm.validation.CascadingValidator

grails.validation.ConstrainedProperty

grails.gorm.validation.ConstrainedProperty

grails.validation.Constraint

grails.gorm.validation.Constraint

grails.validation.ConstraintFactory

org.grails.datastore.gorm.validation.constraints.factory.ConstraintFactory

grails.validation.VetoingConstraint

grails.gorm.validation.VetoingConstraint

grails.validation.ConstraintException

org.grails.validation.BlankConstraint

org.grails.datastore.gorm.validation.constraints.BlankConstraint

org.grails.validation.ConstrainedPropertyBuilder

org.grails.datastore.gorm.validation.constraints.builder.ConstrainedPropertyBuilder

org.grails.validation.ConstraintDelegate

org.grails.validation.ConstraintsEvaluatorFactoryBean

org.grails.datastore.gorm.validation.constraints.eval.ConstraintsEvaluator

org.grails.validation.CreditCardConstraint

org.grails.datastore.gorm.validation.constraints.CreditCardConstraint

org.grails.validation.DefaultConstraintEvaluator

org.grails.datastore.gorm.validation.constraints.eval.DefaultConstraintEvaluator

org.grails.validation.DomainClassPropertyComparator

org.grails.validation.EmailConstraint

org.grails.datastore.gorm.validation.constraints.EmailConstraint

org.grails.validation.GrailsDomainClassValidator

grails.gorm.validation.PersistentEntityValidator

org.grails.validation.InListConstraint

org.grails.datastore.gorm.validation.constraints.InListConstraint

org.grails.validation.MatchesConstraint

org.grails.datastore.gorm.validation.constraints.MatchesConstraint

org.grails.validation.MaxConstraint

org.grails.datastore.gorm.validation.constraints.MaxConstraint

org.grails.validation.MaxSizeConstraint

org.grails.datastore.gorm.validation.constraints.MaxSizeConstraint

org.grails.validation.MinConstraint

org.grails.datastore.gorm.validation.constraints.MinConstraint

org.grails.validation.MinSizeConstraint

org.grails.datastore.gorm.validation.constraints.MinSizeConstraint

org.grails.validation.NotEqualConstraint

org.grails.datastore.gorm.validation.constraints.NotEqualConstraint

org.grails.validation.NullableConstraint

org.grails.datastore.gorm.validation.constraints.NullableConstraint

org.grails.validation.RangeConstraint

org.grails.datastore.gorm.validation.constraints.RangeConstraint

org.grails.validation.ScaleConstraint

org.grails.datastore.gorm.validation.constraints.ScaleConstraint

org.grails.validation.SizeConstraint

org.grails.datastore.gorm.validation.constraints.SizeConstraint

org.grails.validation.UrlConstraint

org.grails.datastore.gorm.validation.constraints.UrlConstraint

org.grails.validation.ValidatorConstraint

org.grails.datastore.gorm.validation.constraints.ValidatorConstraint

org.grails.validation.routines.DomainValidator

已被更新版本的 commons-validation 替代

org.grails.validation.routines.InetAddressValidator

已被更新版本的 commons-validation 替代

org.grails.validation.routines.RegexValidator

已被更新版本的 commons-validation 替代

org.grails.validation.routines.ResultPair

已被更新版本的 commons-validation 替代

org.grails.validation.routines.UrlValidator

已被更新版本的 commons-validation 替代

grails.web.JSONBuilder

groovy.json.StreamingJsonBuilder

Grails-Java8

对于那些已经添加了对 grails-java8 插件的依赖的用户,您只需要删除该依赖即可。插件中的所有类都已移至各自的项目中。

配置文件弃用

Grails 3.x 中支持的一些配置文件将不再维护,因此不再可能在简写形式下创建应用程序。升级现有项目时,需要为这些配置文件提供版本。

  • org.grails.profiles:angularjsorg.grails.profiles:angularjs:1.1.2

  • org.grails.profiles:webpackorg.grails.profiles:webpack:1.1.6

  • org.grails.profiles:react-webpackorg.grails.profiles:react-webpack:1.0.8

计划方法

在 Grails 3 中,使用 Spring @Scheduled 注解不需要任何配置或其他更改。在 Grails 4 中,您必须将 @EnableScheduling 注解应用于应用程序类才能使调度工作。