(快速参考)

365bet地区框架

s365bet地区团队

4.0.2

目录

介绍

Java空间中的许多现代Web框架都比需要的更为复杂,并且不接受“不要重复自己的DRY”原理

365bet地区诸如Rails和Django之类的动态框架帮助为Web应用程序的更现代的思考方式铺平了道路。365bet地区建立在这些概念的基础上,并极大地降低了在Java平台上构建Web应用程序的复杂性。基于已经建立的Java技术(例如Spring和Hibernate)

365bet地区365bet地区是一个完整的堆栈框架,它试图通过核心技术及其相关插件来解决许多Web开发难题,现成的东西包括

通过这些功能,所有这些都易于使用Groovy语言和领域特定语言DSL的广泛使用

本文档将指导您开始使用365bet地区,并使用365bet地区框架构建Web应用程序。

除了本文档外,还有综合指南引导您了解技术的各个方面

最后,365bet地区不仅仅是一个Web框架,它还由各种子项目组成。下表总结了生态系统中的其他一些关键项目,并提供了文档链接。

Table 365bet地区生态系统项目
项目 描述

GORM for Hibernate

SQL数据库的对象映射实现

适用于MongoDB的GORM

MongoDB文档数据库的对象映射实现

蓝色为新j

Neo j Graph数据库的对象映射实现

JSON视图

一种用于在服务器端呈现JSON的View技术

一种用于在服务器上呈现HTML和其他标记的View技术

异步框架

异步编程抽象,支持RxJava GPar等

365bet地区的新功能

365bet地区本节介绍了365bet地区中引入的所有新功能

更新的依赖关系

365bet地区365bet地区随附以下依赖项升级

  • Groovy

  • GORM和Hibernate现在是新应用程序的默认Hibernate版本

  • 春季框架

  • 春季靴

  • 摇篮

  • 斯波克

Micronaut父上下文

微航海365bet地区现在是365bet地区的父应用程序上下文,因此允许使用许多Micronaut功能,包括MicronautHTTP客户端卡夫卡客户.

365bet地区Micronaut还已用于改善启动和减少365bet地区应用程序的整体内存消耗以及Spring Boot中的相关改进

入门

安装要求

365bet地区在安装365bet地区之前,您至少需要Java开发工具包JDK安装版本或更高版本。为您的操作系统下载适当的JDK,然后运行安装程序,然后设置一个名为JAVA首页指向此安装的位置

为了使365bet地区的安装自动化,我们建议开发人员这大大简化了安装和管理多个365bet地区版本的工作

在某些平台上,例如OS X,会自动检测到Java安装。但是,在许多情况下,您将需要手动配置Java的位置,例如,如果您使用bash或Bourne Shell的其他变体

导出JAVA_HOME库Java Home导出PATH PATH JAVA HOME bin
在Windows上,您必须在以下位置配置这些环境变量我的计算机高级环境变量

下载并安装

365bet地区开始使用365bet地区并运行的第一步是安装发行版

365bet地区在nix系统上安装365bet地区的最佳方法是开发人员365bet地区这大大简化了安装和管理多个365bet地区版本的工作

使用SDKMAN安装

365bet地区要使用SDKMAN安装最新版本的365bet地区,请在您的终端上运行

SDK安装365bet地区

您也可以指定版本

SDK安装365bet地区

您可以在网站上找到有关SDKMAN使用的更多信息。SDKMAN文件

手动安装

对于手动安装,请遵循以下步骤

  • 下载365bet地区的二进制发行版,并将生成的zip文件提取到您选择的位置

  • 将GRAILS HOME环境变量设置为您提取zip的位置

    • 在基于Unix Linux的系统上,通常需要添加类似以下内容的问题将GRAILS HOME导出到grails到您的个人资料

    • 在Windows上,通常需要在以下位置设置环境变量我的计算机高级环境变量

  • 然后添加我是目录到您的路径变量

    • 在基于Unix Linux的系统上,可以通过添加导出PATH PATH GRAILS HOME bin到您的个人资料

    • 在Windows上,这是通过修改路径下的环境变量我的计算机高级环境变量

365bet地区如果365bet地区工作正常,您现在应该可以输入grails版本在终端窗口中,查看类似于此的输出

ils子: 4.0.2

创建一个应用程序

365bet地区要创建365bet地区应用程序,您首先需要熟悉以以下方式使用的命令

ils>

创建应用创建一个应用程序

grails创建应用helloworld

这将在当前目录中创建一个包含项目的新目录。在控制台中导航到该目录。

cd helloworld

你好世界的例子

365bet地区现在让我们接受新项目并将其转换为经典的Hello world示例。首先更改为您刚刚创建的helloworld目录,然后启动365bet地区交互式控制台。

cd helloworld grails

您应该看到如下所示的提示

互动的helloworld

我们想要的是一个简单的页面,该页面仅将消息Hello World发送到浏览器中。在365bet地区中,只要您想要一个新页面,就可以为其创建一个新的控制器操作,因为我们还没有一个控制器,所以现在可以使用创建控制器命令

grails创建控制器你好

不要忘记,在交互式控制台中,我们会自动完成命令名称,因此您可以键入cre,然后按得到所有的清单创建命令键入命令名称的更多字母,然后再次完成

上面的命令将创建一个新的控制者在里面grails应用程序控制器helloworld目录称为HelloController常规为什么要额外你好,世界365bet地区目录由于在Java环境中,强烈建议将所有类都放入包中,因此如果您不提供365bet地区,则365bet地区默认为应用程序名称。创建控制器在此提供更多细节

现在我们有了一个控制器,让我们添加一个操作来生成Hello World页面。在任何文本编辑器中,编辑新的控制器HelloController常规通过添加渲染线添加文件,编辑后的文件代码应如下所示

你好,世界 HelloController {

    定义 指数渲染"你好,世界"
    }
}

365bet地区这个动作只是一个方法,在这种特殊情况下,它调用365bet地区提供的特殊方法来渲染这页纸

完成的工作要查看应用程序的运行情况,您只需要使用另一个命令启动服务器即可运行应用:

grails运行应用

这将在承载您的应用程序的端口上启动嵌入式服务器。您现在应该可以通过URL访问应用程序HTTP本地主机尝试一下

要为您的应用程序设置上下文路径,可以在以下位置添加配置属性grails应用配置会议应用yml:

服务器:
    小服务程序:
        上下文路径: 你好,世界

使用上述配置后,服务器将改为从URL启动http本地主机helloworld.

或者,您也可以通过命令行设置上下文路径

grails运行应用程序Dgrails服务器servlet上下文路径helloworld
如果您看到错误服务器无法启动已使用的端口地址错误,则表明该端口上正在运行另一台服务器。您可以使用以下命令在其他端口上运行服务器,从而轻松解决此问题:运行应用程序端口只是一个例子,您几乎可以选择
在Windows上,如果看到错误,则启动进程命令C到Java exe的路径时会出现问题,请再次运行堆栈跟踪如果根错误是由java io IOException引起的IOException CreateProcess错误文件名或扩展名太长添加365bet地区路径Jar true给你建立gradle文件这是Windows的已知限制

结果看起来像这样

简介

365bet地区这是365bet地区简介页面,由365bet地区应用程序视图索引gsp365bet地区文件它检测到控制器的存在并提供指向它们的链接您可以单击HelloController链接以查看包含文本Hello World Voila的自定义页面,您拥有第一个运行的365bet地区应用程序

控制器的最后一件事是可以包含许多动作,每个动作对应于一个不同的页面,此时忽略AJAX。每个页面都可以通过由控制器名称和动作名称组成的唯一URL进行访问。//这意味着您可以通过以下方式访问“ Hello World”页面helloworld hello索引控制器名称是hello,从类名称中删除控制器后缀,小写字母的第一个字母和索引是操作名称,但是您也可以通过没有操作名称的相同URL访问页面,这是因为索引是默认动作见结尾控制器和动作用户指南部分,以了解更多有关默认操作的信息

使用互动模式

由于365bet地区具有交互模式,因此不必每次为每个命令都重新启动JVM,从而使命令执行速度更快。要使用交互模式,请从任何项目的根目录中键入grails并使用TAB完成来获取可用命令列表,请参见屏幕快照。下面举个例子

互动输出

有关交互模式功能的更多信息,请参阅互动模式在用户指南中

在IDE中进行设置

IntelliJ IDEA

IntelliJ IDEA是365bet地区开发的出色IDE。它有免费社区版和付费终极版两个版本。

尽管GSP语法高亮只是最终版的一部分,但社区版可用于大多数事情

如果您只想在社区版中突出显示,则始终可以在HTML编辑器中打开GSP文件。

365bet地区要开始使用Intellij IDEA和365bet地区,只需转到档案开启然后将IDEA指向您建立gradle文件以导入和配置项目

TextMate Sublime VIM等

365bet地区有几种出色的文本编辑器可与Groovy和365bet地区很好地配合使用。请参阅以下参考资料

约定优于配置

365bet地区365bet地区使用约定而不是配置来配置自身,这通常意味着使用文件名和位置来代替显式配置,因此您需要熟悉365bet地区提供的目录结构

这是一个细分,并链接到相关部分

运行和调试应用程序

365bet地区365bet地区应用程序可以使用以下命令与内置的Tomcat服务器一起运行:运行应用默认情况下将在端口上加载服务器的命令

grails运行应用

您可以使用来指定其他端口港口论点

grails运行应用程序端口

请注意,最好以交互方式启动应用程序,因为容器重新启动要快得多

365bet地区grails grails运行应用程序365bet地区应用程序在环境开发中的http localhost上运行grails停止应用程序关闭应用程序应用程序关闭grails运行应用程序365bet地区在环境开发中的http localhost上运行的应用程序

您可以通过右键单击应用程序365bet地区在您的IDE中进行分类,并选择自365bet地区之后的适当操作

或者,您可以使用以下命令运行您的应用,然后将远程调试器附加到该应用

grails运行应用程序调试jvm

有关的更多信息运行应用命令可以在参考指南中找到

测试应用程序

创建365bet地区365bet地区中的命令会自动为您创建单元测试或集成测试src测试目录当然,您可以使用有效的测试逻辑信息来填充这些测试,有关这些信息可以在以下部分中找到:单元和集成测试.

要执行测试,请运行测试应用命令如下

365bet地区测试应用

部署应用程序

365bet地区365bet地区应用程序可以通过多种不同方式进行部署

365bet地区如果要部署到传统容器Tomcat Jetty等,则可以创建Web应用程序存档WAR文件,365bet地区包括战争执行此任务的命令

战争

这将在建立库然后可以按照您的容器说明部署目录

365bet地区请注意,默认情况下,365bet地区会在WAR文件中包括Tomcat的可嵌入版本,如果您部署到其他版本的Tomcat,则可能会导致问题。如果您不打算使用嵌入式容器,则应将Tomcat依赖项的范围更改为提供部署到您的生产容器之前建立gradle:

提供"org springframework boot spring boot starter tomcat"

365bet地区如果要构建要在Tomcat上部署的WAR文件,则此外,您还需要在默认情况下根据Tomcat API构建365bet地区的目标Tomcat版本。要定位Tomcat容器,请插入一行以建立gradle以上依存关系部分

分机'tomcat版本'] = '7.0.59'

与大多数默认为发展环境,除非覆盖战争命令在生产默认情况下,您可以通过指定环境名称来像其他脚本一样覆盖此环境

365bet地区开发战争

如果您不想操作单独的Servlet容器,则只需将365bet地区 WAR文件作为常规Java应用程序运行即可。

grails war java Dgrails env prod jar build libs mywar war

365bet地区部署365bet地区时,应始终使用服务器选项并具有足够的内存分配一组不错的VM标志将是

服务器Xmx M XX MaxPermSize m

支持的Java EE容器

365bet地区365bet地区可在任何支持Servlet及更高版本的容器上运行,并且已知可在以下特定容器产品上运行

  • 雄猫

  • GlassFish或以上

  • 树脂以上

  • JBoss以上

  • 码头以上

  • Oracle Weblogic c或更高版本

  • IBM WebSphere或以上

需要在应用程序服务器服务器中设置Xverify none。流程定义Java虚拟机的旧版本WebSphere的通用JVM参数对于WebSphere版本或更新的版本,不再需要

有些容器有错误,但是大多数情况下都可以解决已知部署问题列表365bet地区可以在365bet地区 Wiki上找到

另外参考365bet地区指南365bet地区有关如何将365bet地区部署到各种流行的云服务的提示

创造文物

365bet地区365bet地区附带了一些便利性目标,例如创建控制器, 创建域类以此类推控制器以及为您提供的不同伪像类型注意这些只是为了方便起见,您也可以轻松使用IDE或喜欢的文本编辑器,例如,创建应用程序的基础通常需要领域模型:

grails创建应用程序helloworld cd helloworld grails创建域类书

这将导致在以下位置创建域类grails应用程序域helloworld Book groovy

你好,世界  {
}

有很多这样的创建命令行参考指南中可以探索的命令

365bet地区为了减少运行365bet地区脚本所需的时间,请使用交互模式

生成应用

365bet地区要快速开始使用365bet地区,通常使用一种称为脚手架生成应用程序的框架为此,请使用生成诸如全部产生这将产生一个控制者及其单元测试及相关意见:

grails生成所有helloworld书

365bet地区从365bet地区升级x

撞上365bet地区版本

您将需要升级在中定义的365bet地区版本gradle属性.

365bet地区应用程序gradle属性

gradle属性
grails版本

365bet地区应用程序gradle属性

gradle属性
grails版本

提升GORM版本

如果您正在使用您将需要更新在中定义的版本gradle属性.

365bet地区应用程序gradle属性

gradle属性
gormVersion发布

365bet地区应用程序gradle属性

gradle属性
gormVersion

将GORM DSL条目移动到运行时

GORM DSL条目应移至运行时常规例如,在应用程序不支持,将中断应用程序

grails gorm默认映射ID发电机: '身份'
}

春季和春季启动

365bet地区是基于Spring和Spring Boot构建的。迁移指南发行说明如果您使用的是Spring特定功能

Hibernate和GORM x

365bet地区365bet地区 x支持最低版本的Hibernate和GORM x对GORM进行了一些更改,以支持较新的Hibernate版本并简化GORM本身

这些更改的详细信息在GORM升级文档.

弹簧启动器

请检查弹簧启动器365bet地区文档,因为它与Spring Boot所使用的365bet地区 x版本相比发生了很大变化

如果您有以下配置

365bet地区grails应用配置会议应用yml 365bet地区 x
终点:
    已启用: 
    jmx:
        已启用: 真正
        唯一的名字: 真正

替换为

365bet地区grails应用配置会议应用yml 365bet地区 x
弹簧:
    jmx:
        唯一的名字: 真正
管理:
    终点:
        默认启用: 

Spring Boot开发人员工具和Spring Loaded

365bet地区以前的365bet地区版本使用了称为弹簧加载由于该库不再维护且不支持Java,因此已删除对Spring Loaded的支持

作为替代,365bet地区应用程序包括Spring Boot开发人员工具的依赖建立gradle365bet地区构建脚本如果您要迁移365bet地区 x应用,请包括以下依赖项集

建立gradle
配置开发仅运行时类路径从开发扩展自依赖开发"org springframework boot spring boot devtools")
        ...
        ..
}
...
..
.

另外,您还应该在中为Spring Developer Tools配置必要的排除项yml应用程序:

弹簧:
    开发工具:
        重新开始:
            排除:
                - grails应用程序视图
                - 365bet地区应用程式n
                - grails应用程序配置

上面的配置可防止在视图或消息捆绑包更改时服务器重新启动

您可以将Spring Developer Tools与浏览器扩展结合使用,例如Chrome LiveReload扩展365bet地区在365bet地区应用程序中进行任何更改时都能自动刷新浏览器

Spring Boot Gradle插件更改

365bet地区365bet地区构建在Spring Boot之上365bet地区应用构建在Spring Boot x之上

365bet地区您的365bet地区应用建立gradle可能有这样的配置

建立gradle
bootRun addResources真正
    ...
}

365bet地区365bet地区应用程序是基于Spring Boot构建的,从Spring Boot开始addResources属性不再存在而是需要将sourceResources属性设置为要使用的源集。sourceSets主要这在Spring Boot Gradle插件的文档.

365bet地区您的365bet地区应用建立gradle可以配置

建立gradle
bootRun sourceResources sourceSets主要

为365bet地区插件构建可执行jar

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

如果您有以下配置

建立gradle 365bet地区
如果您希望将此插件打包为独立应用程序,请启用bootRepackage已启用

替换为

建立gradle 365bet地区
如果您希望将此插件打包为独立应用程序,请启用启用bootJar

升级到Gradle

365bet地区默认使用365bet地区应用摇篮365bet地区应用程序使用Gradle

升级到Gradle执行

gradlew包装器gradle版本

由于Gradle的变化传递依存关系不再得到解决用于插件如果您的项目使用的插件具有传递性依赖,则需要将其显式添加到您的插件中建立gradle文件

如果您自定义应用程序的构建,则可能需要其他迁移,请检查Gradle升级构建文件资料

H Web控制台

365bet地区Spring Boot包括对H数据库Web控制台的本机支持。由于Spring Boot已经包含了该功能,因此已从365bet地区中删除了等效功能。h控制台而不是之前的URIdbconsole看到使用H的Web控制台有关更多信息,请参见Spring Boot文档

升级休眠

365bet地区如果您在365bet地区应用程序中使用GORM进行Hibernate实施,则需要升级到Hibernate

365bet地区谷物建立gradle

建立gradle
依赖项编译"org grails插件休眠"编译"组织休眠休眠核心决赛"
}

365bet地区将在365bet地区中

建立gradle
依赖项编译"org grails插件休眠"编译"组织休眠休眠核心决赛"
}

迁移到Geb

365bet地区Geb x一个与JDK兼容的版本是365bet地区默认提供的版本,365bet地区不再与Java兼容,您应该迁移到Geb

365bet地区在365bet地区中,如果构建gradle看起来像

建立gradle
依赖项testCompile"org grails出生的插件"testRuntime"org seleniumhq selenium selenium htmlunit driver"testRuntime"净sourceforge htmlunit htmlunit"
}

365bet地区在365bet地区中,您应该将其替换为

建立gradle
buildscript存储库依赖项类路径"gradle插件com精力充沛的工作webdriver binaries webdriver binaries gradle插件$webdriverBinariesVersion" (1)资料库适用插入:"理念"应用插入:"使用通电工作的webdriver二进制文件" (1)依赖项testCompile"org grails出生的插件" (4)testRuntime"org seleniumhq硒硒铬驱动程序$硒版本"  (5)testRuntime"org seleniumhq selenium selenium firefox驱动程序$硒版本" (5)testRuntime"org seleniumhq硒safari Safari驱动程序$seleniumSafariDriverVersion" (5)测试编译"org seleniumhq selenium selenium远程驱动程序$硒版本" (5)测试编译"org seleniumhq硒api$硒版本" (5)测试编译"org seleniumhq硒硒支持$硒版本" (5)webdriver二进制chromedriver"$chromeDriverVersion" (2)geckodriver"$geckodriverVersion" (3)具有类型测试系统属性的任务"吉布环境", 系统getProperty'吉布环境'系统属性"geb构建报告"报告文件"给IntegrationTest"系统属性"webdriver chrome驱动程序", 系统getProperty'webdriver chrome驱动程序'系统属性"webdriver壁虎驱动", 系统getProperty'webdriver壁虎驱动')
}
gradle属性
gebVersion seleniumVersion webdriverBinariesVersion hibernateCoreVersion最终chromeDriverVersion(2)geckodriverVersion(3)seleniumSafariDriverVersion
1 包括Webdriver Binaries Gradle插件.
2 设置适当的适用于Chrome版本的Webdriver.
3 设置适当的Firefox版本的Webdriver.
4 包括365bet地区365bet地区 Geb插件依赖性具有传递依赖给小鸡这是工作所必需的依赖天生和史波克
5 硒和不同的驱动程序依赖性

还创建一个Geb配置归档于src集成测试资源GebConfig groovy.

src集成测试资源GebConfig groovy
进口 org openqa硒铬ChromeDriver
进口 组织机构openqa硒铬ChromeOptions
进口 组织openqa硒firefox FirefoxDriver
进口 org openqa硒Firefox Firefox选项
进口 组织openqa硒野生动物园SafariDriver环境您需要在Safari开发中配置允许远程自动化野生动物园的司机SafariDriver通过gradlew Dgeb env chrome iT运行镀铬驱动器ChromeDriver通过gradlew Dgeb env chromeHeadless iT运行chrome无头驱动程序ChromeOptions oChromeOptions或addArguments'无头')
            Chrometriver o通过gradlew Dgeb env firefox运行firefox无头驱动程序FirefoxOptions oFirefox选项或addArguments'无头')
            FirefoxDriver o通过gradlew Dgeb env firefox iT运行火狐驱动程序火狐浏览器

不推荐使用的课程

365bet地区365bet地区 x中已弃用的以下类已在365bet地区中删除。请检查以下列表以找到合适的替代品

移除的课程

另类

组织grails数据存储区gorm验证约束UniqueConstraint

org grails数据存储区gorm验证约束(内置UniqueConstraint)

免费使用BuildScope

365bet地区grails交易365bet地区TransactionTemplate

365bet地区grails gorm交易365bet地区TransactionTemplate

组织grails事务转换RollbackTransform

组织grails数据存储gorm事务转换RollbackTransform

grails交易NotTransactional

grails gorm Transactions NotTransactional

grails交易回滚

grails gorm事务回滚

交易事务

grails gorm Transactions事务性

组织grails配置FlatConfig

org grails核心元类MetaClassEnhancer

使用特征代替

组织grails核心util ClassPropertyFetcher

org grails数据存储区映射反映了ClassPropertyFetcher

组织grails事务转换TransactionalTransform

组织grails数据存储gorm事务转换TransactionalTransform

365bet地区核心ComponentCapableDomainClass

365bet地区365bet地区核心365bet地区DomainClassProperty

使用org grails数据存储区映射模型MappingContext改为使用API

365bet地区组织grails核心Default365bet地区DomainClassProperty

365bet地区org Grail Daughter PostGravelsThomasClassPretty

365bet地区org grails核心支持365bet地区DomainConfigurationUtil

使用org grails数据存储区映射模型MappingContextorg grails数据存储区映射模型MappingFactory改为使用API

org grails插件域DomainClassPluginSupport

org grails插件域支持GormApiSupport

org grails插件域支持365bet地区DomainClassCleaner

处理者org grails数据存储区映射模型MappingContext现在

grails验证AbstractConstraint

采用组织grails数据存储区gorm验证约束AbstractConstraint代替

grails验证AbstractVetoingConstraint

 组织grails数据存储区gorm验证约束AbstractVetoingConstraint

365bet地区验证CascadingValidator

Grylls热验证CascadingValidator

验证ConstrainedProperty

grails gorm验证ConstrainedProperty

grails验证约束

grails gorm验证约束

365bet地区验证ConstraintFactory

组织grails数据存储区gorm验证约束工厂ConstraintFactory

365bet地区验证VetoingConstraint

grails gorm验证VetoingConstraint

验证ConstraintException

组织grails验证BlankConstraint

组织grails数据存储区gorm验证约束BlankConstraint

组织grails验证ConstrainedPropertyBuilder

组织grails数据存储区gorm验证约束构建器ConstrainedPropertyBuilder

组织grails验证ConstraintDelegate

组织grails验证ConstraintsEvaluatorFactoryBean

组织grails数据存储区gorm验证约束eval ConstraintsEvaluator

组织grails验证CreditCardConstraint

组织grails数据存储区gorm验证约束CreditCardConstraint

组织grails验证DefaultConstraintEvaluator

组织grails数据存储区gorm验证约束eval DefaultConstraintEvaluator

组织grails验证DomainClassPropertyComparator

组织grails验证EmailConstraint

组织grails数据存储区gorm验证约束EmailConstraint

组织grails验证365bet地区DomainClassValidator

grails gorm验证PersistentEntityValidator

组织grails验证InListConstraint

组织grails数据存储区gorm验证约束InListConstraint

组织grails验证MatchesConstraint

组织grails数据存储区gorm验证约束MatchesConstraint

组织grails验证MaxConstraint

组织grails数据存储区gorm验证约束MaxConstraint

组织grails验证MaxSizeConstraint

组织grails数据存储区gorm验证约束MaxSizeConstraint

组织grails验证MinConstraint

组织grails数据存储区gorm验证约束MinConstraint

组织grails验证MinSizeConstraint

组织grails数据存储区gorm验证约束MinSizeConstraint

组织grails验证NotEqualConstraint

组织grails数据存储区gorm验证约束NotEqualConstraint

组织grails验证NullableConstraint

组织grails数据存储区gorm验证约束NullableConstraint

组织验证验证rangcnstreet

Org Grils数据存储区Gourm验证约束Colorconstrint

组织grails验证ScaleConstraint

组织grails数据存储区gorm验证约束ScaleConstraint

组织grails验证SizeConstraint

组织grails数据存储区gorm验证约束SizeConstraint

组织grails验证UrlConstraint

组织grails数据存储区gorm验证约束UrlConstraint

组织grails验证ValidatorConstraint

组织grails数据存储gorm验证约束ValidatorConstraint

组织grails验证例程DomainValidator

替换为较新版本的Commons Validation

组织grails验证例程InetAddressValidator

替换为较新版本的Commons Validation

org grails验证例程RegexValidator

替换为较新版本的Commons Validation

org grails验证例程ResultPair

替换为较新版本的Commons Validation

org grails验证例程UrlValidator

替换为较新版本的Commons Validation

grails Web JSONBuilder

groovy json StreamingJsonBuilder

365bet地区365bet地区 Java

对于那些增加了对365bet地区 Java插件,您需要做的就是简单地删除依赖关系插件中的所有类都已移至各自的项目中

配置文件弃用

365bet地区365bet地区 x支持的一些配置文件将不再维护,因此,当它们以简写形式出现时,将不再可能创建应用程序。升级现有项目时,将有必要为这些配置文件提供版本

  • org grails档案angularjsorg grails档案angularjs

  • org grails个人资料webpackorg grails个人资料webpack

  • org grails个人资料react webpackorg grails个人资料react webpack

预定方法

365bet地区在365bet地区中,无需配置或进行其他更改即可使用Spring。预定的365bet地区注解在365bet地区中,您必须应用启用排程批注到您的应用程序类,以便安排工作

组态

365bet地区看起来很奇怪,在一个包含配置之上的约定的框架中,我们现在解决这个问题。使用365bet地区默认设置,您实际上可以开发应用程序而无需进行任何配置,快速入门演示了这一点,但是了解在何处以及如何覆盖是很重要的需要使用时的约定用户指南的后续部分将提及您可以使用的配置设置,而不是如何进行设置的假设是,您至少已阅读本章的第一部分

基本配置

365bet地区365bet地区中的配置通常分为区域构建配置和运行时配置

构建配置通常是通过Gradle和建立gradle默认情况下,YAML中指定了文件运行时配置grails应用配置会议应用yml文件

365bet地区如果您更喜欢使用365bet地区风格的Groovy配置,则可以使用Groovy指定配置ConfigSlurper语法两个Groovy配置文件可用grails应用配置会议应用程序grails应用程序配置运行时groovy:

  1. 采用应用程序不依赖于应用程序类的配置

  2. 采用运行时常规取决于应用程序类的配置

这种分离是必要的,因为在应用程序365bet地区可用于需要加载的365bet地区 CLI应用程序在应用程序被编译之前对应用程序类的引用应用程序这些命令由CLI执行时将导致异常

运行365bet地区 CLI启动时发生错误,脚本groovy无法解析类com foo Bar

对于Groovy配置,以下变量可用于配置脚本

变量 描述

userHome

365bet地区运行365bet地区应用程序的帐户的主目录位置

365bet地区首页

365bet地区安装365bet地区的目录的位置网格首页设置了环境变量

appName

出现在构建gradle中的应用程序名称

appVersion

出现在构建gradle中的应用程序版本

例如

我的tmp目录"${userHome}grails tmp"

365bet地区使用365bet地区Application访问配置

如果要读取运行时配置设置,即在yml应用程序使用grails应用在控制器和标签库中可用作变量的对象

 我的控制器 {
    定义 你好() {
        定义收件人grails应用程序配置getProperty'foo bar你好'渲染"你好${接受者}"
    }
}

配置的属性grails应用对象是的实例设定档接口,并提供了许多有用的方法来读取应用程序的配置

特别是getProperty上面看到的方法对于有效地检索配置属性非常有用,同时指定属性类型的默认类型为String和/或提供默认的后备值

 我的控制器 {

    定义 你好收件人收件人检索Integer属性foo bar max hellos,否则使用的值
        定义最大grails应用程序配置getProperty'foo bar max hellos', 整数, 5)

        在不指定类型的情况下获取属性foo bar问候语,默认为String,否则使用值Hello
        定义问候grails应用程序配置getProperty'foo酒吧问候', "你好")

        定义邮件收件人receiveHelloCount max"抱歉,您已获得最多次数" :  "${问候}, ${接受者}"呈现消息

请注意设定档实例是基于Spring的合并配置PropertySource概念,并从环境系统属性和本地应用程序配置中读取配置,并将它们合并为一个对象

365bet地区365bet地区应用365bet地区可以轻松地注入服务和其他365bet地区工件

进口 365bet地区核心

 我的服务365bet地区365bet地区Application grailsApplication问候定义收件人grails应用程序配置getProperty'foo bar你好')
        返回 "你好${接受者}"
    }
}

365bet地区ConfigurationAware接口

在运行时动态访问配置对应用程序性能的影响很小。另一种方法是实现365bet地区ConfigurationAware提供一个setConfiguration初始化类时将应用程序配置作为参数接受的方法然后可以将相关的配置属性分配给类上的实例属性,以供以后使用

设定档实例具有与注入实例相同的属性和用法365bet地区应用config对象这是来自上一个示例的服务类,使用365bet地区365bet地区ConfigurationAware而不是注射365bet地区365bet地区应用:

进口 365bet地区grails核心支持365bet地区ConfigurationAware

 我的服务 实施365bet地区365bet地区ConfigurationAware接受者问候返回 "你好${接受者}"
    }

    虚空setConfiguration配置Config收件人配置getProperty'foo bar你好')
    }

}

弹簧值注释

您可以使用Spring注释以注入配置值

进口 org springframework bean工厂注释

 我的控制器 {
    ('foo bar你好')
    接受者定义 你好渲染"你好${接受者}"
    }
}
在Groovy代码中,必须在字符串周围使用单引号引起来的值。注释,否则将被解释为GString而不是Spring表达式

如您所见,在访问配置设置时,您使用与定义它们时相同的点符号

YML格式配置的选项

yml应用程序365bet地区文件是在365bet地区中引入的,YAML现在是配置文件的首选格式

使用系统属性命令行参数

假设您正在使用JDBC连接字符串命令行参数,而您想访问yml文件中的参数,则可以通过以下方式完成

生产:
    数据源:
        网址: JDBC连接字符串

同样,可以访问系统参数

您将需要在建立gradle修改bootRun目标是否grails运行应用用于启动应用程序

bootRun系统属性系统属性

为了测试以下内容,需要更改测试任务如下

测试系统性能系统属性

外部配置

365bet地区365bet地区会读应用属性yml来自配置365bet地区或默认情况下为当前目录,因为365bet地区是SpringBoot的配置选项,也可用于文档,请查阅https docs spring io spring boot docs当前参考html引导功能外部配置html引导功能外部配置应用程序属性文件

内置选项

365bet地区365bet地区具有一组值得了解的核心设置,它们的默认设置适用于大多数项目,但了解它们的工作很重要,因为以后您可能需要一个或多个它们

运行时设置

在运行时方面grails应用配置会议应用yml还有很多其他核心设置

  • grails启用本机ascii365bet地区如果您不需要365bet地区的本机ascii转换,请将其设置为false n属性文件,默认为true

  • grails视图默认编解码器设置GSP的默认编码方式可以是html之一,也可以是基本默认值none为了降低XSS攻击的风险,请将其设置为html

  • grails视图gsp编码用于GSP源文件的文件编码默认为utf

  • grails mime文件扩展是否使用文件扩展名来指定MIME类型内容协商默认为true

  • grails mime类型用于以下方面的受支持的mime类型的地图内容协商.

  • grails serverURL一个字符串,用于指定绝对链接的服务器URL部分,包括服务器名称,例如,grails serverURL http my yourportal com请参见createLink也被重定向使用

  • grails视图gsp sitemesh预处理确定是否进行SiteMesh预处理禁用此选项会减慢页面渲染速度,但是如果需要SiteMesh从GSP视图中解析生成的HTML,则将其禁用是正确的选项如果您不了解此高级属性,请不要担心,将其设置为true

  • grails重新加载排除grails重新加载包括配置这些指令可以确定特定于项目的源文件的重新加载行为每个指令都包含一个字符串列表,这些字符串是项目源文件的类名,应在重载行为中排除这些字符串,或者在运行带有开发环境的应用程序时相应地包含这些字符串。运行应用命令如果grails重新加载包括配置了伪指令,那么只有该列表中的类将被重新加载

记录中

由于365bet地区日志记录由Logback日志记录框架并可以使用365bet地区应用程序配置会议日志回切文件

如果您喜欢XML,可以替换logback groovy带有一个文件登录XML文件代替

有关配置日志记录的更多信息,请参阅登录文档就此主题而言

记录仪名称

365bet地区365bet地区工件控制器服务被注入日志自动属性

365bet地区在365bet地区之前,365bet地区 Artifact的记录器的名称遵循以下约定:365bet地区应用.其中type是工件的类型,例如控制器要么服务班级名称是工件的完全限定名称

365bet地区365bet地区 x简化了记录器名称下例说明了更改

BookController常规位于365bet地区应用控制器公司不带注释自我

记录器名称365bet地区 x或更高

记录器名称365bet地区 x或更低

与公司BookController

grails应用程序控制器com公司BookController

BookController常规位于365bet地区应用控制器公司带有注释自我

记录器名称365bet地区 x或更高

记录器名称365bet地区 x或更低

与公司BookController

与公司BookController

BookService groovy位于365bet地区 App Services com公司不带注释自我

365bet地区记录器名称365bet地区 x或更高

365bet地区记录器名称365bet地区 x或更低

com公司BookService

365bet地区 App Services com公司BookService

BookService groovy位于365bet地区 App Services com公司带有注释自我

记录器名称365bet地区 x或更高

记录器名称365bet地区 x或更低

com公司BookService

com公司BookService

BookDetail groovy位于src groovy com公司带有注释自我

记录器名称365bet地区 x或更高

记录器名称365bet地区 x或更低

与公司BookDetail

与公司BookDetail

从Stacktrace日志屏蔽请求参数

365bet地区当365bet地区记录堆栈跟踪信息时,日志消息中可能包含当前请求的所有请求参数的名称和值。要屏蔽安全请求参数的值,请在grails exceptionresolver参数排除配置属性

grails应用配置会议应用yml
:
    异常解析器:
        参数:
            排除:
                - 密码
                - 信用卡

通过设置参数,可以完全关闭请求参数记录grails exceptionresolver logRequestParametersconfig属性为false当应用程序在开发模式下运行时,默认值为true;对于所有其他环境,默认值为false

grails应用配置会议应用yml
:
    异常解析器:
        日志请求参数: 

外部配置文件

如果设置配置属性日志配置你可以指导退回使用外部配置文件

grails应用配置会议应用yml
测井:
    配置: 用户我配置logback groovy

或者,您可以为配置文件位置提供系统属性

gradlew日志记录配置用户,我的配置logback groovy bootRun

或者您可以使用环境变量

导出LOGGING CONFIG用户config logback groovy gradlew bootRun

365bet地区365bet地区提供以下GORM配置选项

  • 格栅美食档案如果设置为真正导致保存域类上的方法抛出一个验证ValidationException如果验证保存过程中失败此选项也可能分配了代表程序包名称的字符串列表。如果该值是字符串列表,则failOnError行为将仅应用于包括子程序包在内的那些程序包中的域类。保存方法文档以获取更多信息

例如,为所有域类启用failOnError

:
    蓝色的:
        failOnError: 真正

并通过包为域类启用failOnError

:
    蓝色的:
        failOnError:
            - 公司名称为somepackage
            - 公司名称为someotherpackage

配置HTTP代理

要将365bet地区设置为使用HTTP代理,有两个步骤:首先,您需要配置如果您希望使用代理来创建应用程序,则CLI要注意代理。可以使用网格选项环境变量,例如在Unix系统上

导出GRAILS OPTS Dhttps代理主机Dhttps代理端口Dhttp代理用户测试Dhttp代理密码测试
默认的配置文件存储库通过HTTPS解析,因此https proxyPorthttps proxyUser使用,但用户名和密码指定为http proxyUserhttp proxyPassword

对于Windows系统,可以在以下位置配置环境变量我的计算机高级环境变量.

有了此配置后,命令可以通过代理连接并进行身份验证

365bet地区其次,由于365bet地区使用Gradle作为构建系统,因此您需要将Gradle配置为通过代理进行身份验证。有关如何执行此操作的说明,请参见关于该主题的Gradle用户指南部分.

应用类别

每个新的365bet地区应用程序都具有一个应用内的类365bet地区应用初始化目录

应用类将365bet地区AutoConfiguration类和功能静态空主方法,意味着它可以作为常规应用程序运行

执行应用程序类

有几种方法可以执行应用365bet地区类,如果您使用的是IDE,则只需右键单击该类并直接从IDE中运行它即可启动365bet地区应用程序

这对于调试也很有用,因为您可以直接从IDE进行调试,而无需在使用调试器时连接远程调试器。运行应用程序调试jvm从命令行命令

例如,您也可以将应用程序打包到可运行的WAR文件中

grails包java jar构建libs myapp war

如果您打算使用无容器方法来部署应用程序,这将非常有用

自定义应用程序类

您可以通过多种方式自定义应用

自定义扫描

365bet地区默认情况下,365bet地区将扫描所有已知的源目录以查找控制器域类,但是,如果您希望扫描的其他JAR文件中有软件包,则可以通过覆盖包名的方法应用

 应用 延伸365bet地区365bet地区AutoConfiguration覆写
    采集<包名包名'我的额外包裹']
    }

    ...
}

注册其他Bean

应用该类也可以用作Spring bean定义的源,只需定义一个用注释的方法即可。豆角,扁豆返回的对象将成为Spring bean。方法的名称用作bean名称

 应用 延伸365bet地区AutoConfiguration豆角,扁豆MyType myBean返回 我的风格

应用程序生命周期

应用该类还实现了365bet地区365bet地区Application生命周期所有插件实现的接口

这意味着应用该类可用于执行与插件相同的功能。您可以覆盖常规插件挂钩doWithSpring, doWithApplicationContext等等,以覆盖适当的方法

 应用 延伸365bet地区AutoConfiguration覆写关闭doWithSpring mySpringBean MyType

环境环境

每个环境配置

365bet地区365bet地区支持每个环境配置的概念yml应用程序应用程序中的文件grails应用程序配置目录可以使用YAML或通过提供的语法针对每个环境配置使用ConfigSlurper例如,考虑以下默认值yml应用程序365bet地区365bet地区提供的定义

环境:
    发展:
        数据源:
            dbCreate: 创建放置
            网址: jdbc h mem devDb MVCC TRUE LOCK TIMEOUT DB EXIT FALSE关闭
    测试:
        数据源:
            dbCreate: 更新
            网址: jdbc h mem testDb MVCC TRUE LOCK TIMEOUT DB关闭时退出假
    生产:
        数据源:
            dbCreate: 更新
            网址: jdbc h prodDb MVCC TRUE LOCK TIMEOUT DB CLOSE EXIT FALSE关闭
            属性:
               jmxEnabled: 真正
               initialSize: 5
        ...

上面可以用Groovy语法表示应用程序如下

合并的数据源driverClassName"org h驱动程序"用户名"她的"密码""环境开发数据源dbCreate"创建放置"网址"jdbc h mem devDb"测试数据源dbCreate"更新"网址"jdbc h mem testDb"生产数据源dbCreate"更新"网址"jdbc h prodDb"属性jmxEnabled真正initialSize5
            }
        }
    }
}

请注意,如何在顶层提供通用配置,然后环境块为每个环境设置指定dbCreate网址的属性数据源.

在不同环境下打包和运行

365bet地区命令行具有在特定环境的上下文中执行任何命令的内置功能,格式为

ils> <>

365bet地区此外,365bet地区还知道一些预设环境开发者, 产品测试对于发展, 生产测试例如,为测试您会运行的环境

格拉斯试战

要定位其他环境,您可以通过365bet地区环境任何命令的变量

365bet地区 Dgrails env UAT运行应用程序

程序环境检测

在代码中(例如在Gant脚本或引导类中),您可以使用环境

进口 免费环境开关环境电流案件环境开发configureForDevelopment打破
    案件环境PRODUCTION configureForProduction打破
}

每个环境引导

通常需要在每个环境中启动应用程序时运行代码。为此,您可以使用365bet地区应用程序初始化BootStrap常规对每个环境执行的文件支持

定义初始化ServletContext ctx环境生产ctx setAttribute"大约", "产品"开发ctx setAttribute"大约", "开发者"ctx setAttribute"", "酒吧")
}

通用的每个环境执行

以前的引导带示例使用免费环境在内部执行该类您也可以自己使用该类来执行您自己的环境特定逻辑

环境执行当前环境生产在生产中做某事发展只在开发中做某事
    }
}

数据源

由于365bet地区是基于Java技术建立的,因此设置数据源需要JDBC的一些知识,该技术代表Java数据库连接

如果使用H以外的数据库,则需要JDBC驱动程序。例如,对于MySQL,则需要连接器J.

驱动程序通常以JAR存档的形式出现。如果Maven存储库中提供了jar,则最好使用依赖项解析来解析jar,例如,您可以像这样为MySQL驱动程序添加依赖项

依赖运行时'MySQL连接器'
}

365bet地区解决JAR问题后,您需要熟悉365bet地区如何管理其数据库配置。grails应用配置会议应用程序要么grails应用配置会议应用yml这些文件包含dataSource定义,其中包括以下设置

  • driverClassNameJDBC驱动程序的类名

  • 用户名用于建立JDBC连接的用户名

  • 密码用于建立JDBC连接的密码

  • 网址数据库的JDBC URL

  • dbCreate是从域模型自动生成数据库还是创建,删除,创建更新或验证

  • 派对是否使用连接池默认为true

  • logSql启用S​​QL记录到标准输出

  • 格式化Sql格式化记录的SQL

  • 方言表示用于与数据库通信的Hibernate方言的String或Class。冬眠组织方言可用方言包

  • 只读如果真正使DataSource只读,从而导致连接池调用setReadOnly true在各个连接

  • 交易性的如果将DataSource的transactionManager Bean留在链式BE PC事务管理器实现的外部这仅适用于其他数据源

  • 持久性拦截器默认数据源将自动连接到持久性拦截器,其他数据源将不会自动连接,除非将其设置为真正

  • 属性要在DataSource bean上设置的其他属性,请参见Tomcat池文档还有一种Javadoc格式属性文档.

  • jmxExport如果将禁用所有数据源的JMX MBean注册。默认情况下,为具有以下内容的数据源添加JMX MBean:jmxEnabled是在属性中

  • 类型365bet地区连接池类,如果您想在有多个可用池时强制365bet地区使用它

MySQL中的典型配置应用程序可能像

合并的数据源真正dbCreate"更新"网址"jdbc mysql localhost我的数据库"driverClassName"com mysql jdbc驱动程序"方言组织休眠方言MySQL InnoDBDialect用户名"用户名"密码"密码"类型"这个m"属性jmxEnabled真正initialSize5maxActive50minIdle5最大闲置25最大等待10000最大年龄10 * 60000timeBetweenEvictionRunsMillis5000minEvictableIdleTimeMillis60000validationQuery"选择"validationQueryTimeout3validationInterval15000testOnBorrow真正testWhileIdle真正testOnReturnjdbcInterceptors"ConnectionState StatementCache最大"defaultTransactionIsolation java sql连接事务已提交读
在配置数据源时,在任何配置设置之前请勿包含type或def关键字,因为Groovy会将其视为本地变量定义,并且将不对其进行处理。例如,以下无效
数据源布尔值派对真正 类型声明导致忽略的局部变量
    ...
}

使用额外属性的高级配置示例

合并的数据源真正dbCreate"更新"网址"jdbc mysql localhost我的数据库"driverClassName"com mysql jdbc驱动程序"方言组织休眠方言MySQL InnoDBDialect用户名"用户名"密码"密码"类型"这个m"属性Tomcat JDBC Pool的文档
       http tomcat apache org tomcat doc jdbc池html通用属性
       https tomcat apache org tomcat doc api org apache tomcat jdbc池PoolConfiguration htmljmxEnabled真正initialSize5maxActive50minIdle5最大闲置25最大等待10000最大年龄10 * 60000timeBetweenEvictionRunsMillis5000minEvictableIdleTimeMillis60000validationQuery"选择"validationQueryTimeout3validationInterval15000testOnBorrow真正testWhileIdle真正testOnReturnignoreExceptionOnPreLoad真正
       http tomcat apache org tomcat doc jdbc pool html JDBC拦截器jdbcInterceptors"ConnectionState StatementCache最大"defaultTransactionIsolation java sql连接事务已提交读安全默认
       连接泄漏的控件完全放弃百分比100 设置仅在池满时才激活removeAbandonedTimeout120removeAbandoned真正
       使用JMX控制台在运行时更改此设置徽标放弃 导致堆栈跟踪记录开销仅用于调试
       JDBC驱动程序属性
       以mysql为例dbPropertiesMySQL特定的驱动程序属性
           http dev mysql com doc连接器j en连接器j参考配置属性html
           让Tomcat JDBC Pool处理重新连接自动重新连接
           截断行为jdbcCompliantTruncation
           mysql日期转换zeroDateTimeBehavior'convertToNull'
           改为使用Tomcat JDBC Pool的StatementCache,因此禁用mysql驱动程序的缓存cachePrepStmtscacheCallableStmts
           Tomcat JDBC Pool的StatementFinalizer保持跟踪dontTrackOpenResources真正
           性能优化可减少mysql驱动程序代码中引发的SQLException数量holdResultsOpenOverStatementClose真正
           使用服务器准备stmts启用MySQL查询缓存将禁用查询缓存useServerPrepStmts
           元数据缓存cacheServerConfiguration真正cacheResultSetMetadata真正metadataCacheSize100
           TCP IP超时connectTimeout15000socketTimeout120000
           计时器调整禁用maintainTimeStatsenableQueryTimeouts
           杂项调整Nodate Chime St Ring Syn c真正
       }
    }
}

有关dbCreate的更多信息

Hibernate可以自动创建域模型所需的数据库表。您可以控制何时以及如何执行此操作。dbCreate可以采用这些值的属性

  • 创建删除现有模式并在启动时创建模式,首先删除现有表的索引等

  • 创建放置如同创建而且在应用程序完全关闭时也会删除表

  • 更新创建丢失的表和索引,并在不删除任何表或数据的情况下更新当前模式,请注意,这无法正确处理许多模式更改,例如您使用包含现有数据的旧列保留了列重命名

  • 验证不更改数据库,将配置与现有数据库架构进行比较并报告警告

  • 任何其他值都无济于事

设置dbCreate建议在您的架构相对稳定之后(绝对是在将应用程序和数据库部署到生产环境中时)设置为none,然后通过使用SQL脚本或类似迁移工具的适当迁移来管理数据库更改飞路要么液基数据库迁移插件使用Liquibase

数据源和环境

前面的示例配置假定您要在所有环境,生产测试开发等中使用相同的配置

365bet地区365bet地区数据源定义是环境感知的,但是您可以这样做

合并的数据源真正driverClassName"com mysql jdbc驱动程序"方言组织休眠方言MySQL InnoDBDialect其他常用设置环境生产dataSource网址"jdbc mysql liveip com liveDb"
            其他特定于环境的设置
        }
    }
}

自动数据库迁移

dbCreate的属性数据源365bet地区定义很重要,因为它决定了365bet地区在运行时应如何从中自动生成数据库表。类这些选项在数据源部分

  • 创建

  • 创建放置

  • 更新

  • 验证

  • 没有价值

发展模式dbCreate默认情况下,它设置为创建删除,但是在开发的某个时刻,当然,一旦投入生产,您将需要在每次启动服务器时停止删除并重新创建数据库。

诱人的切换到更新因此,您保留了现有数据,仅在代码更改时才更新架构,但是Hibernate的更新支持非常保守,不会进行任何可能导致数据丢失的更改,并且不会检测到重命名的列或表,因此您将只剩下旧的一,也将有新的

365bet地区365bet地区通过插件支持Liquibase或Flyway的迁移

具有交易意识的数据源代理

实际上数据源bean被包装在一个可识别事务的代理中,因此将为您提供当前事务或Hibernate正在使用的连接届会如果一个活跃

如果不是这种情况,请从数据源将是一个新的连接,并且假设您具有明智的事务隔离设置,例如,您将无法看到尚未提交的更改读已提交或更好

数据库控制台

H数据库控制台是H的一项便利功能,它为您拥有JDBC驱动程序的任何数据库提供基于Web的界面,并且查看针对其开发的数据库非常有用。当针对内存数据库运行时,该功能尤其有用

您可以通过导航到控制台来访问控制台http localhost h控制台在浏览器中查看Spring Boot H控制台文档有关可用选项的更多信息

多个数据源

默认情况下,所有域类共享一个数据源和一个数据库,但您可以选择将域类划分为两个或多个数据源

配置其他数据源

默认值数据源在配置grails应用配置会议应用yml看起来像这样

数据源:
    派对: 真正
    jmxExport: 真正
    driverClassName: org h驱动程序
    用户名: 她的
    密码:

环境:
    发展:
        数据源:
            dbCreate: 创建放置
            网址: jdbc h mem devDb MVCC TRUE LOCK TIMEOUT DB EXIT FALSE关闭
    测试:
        数据源:
            dbCreate: 更新
            网址: jdbc h mem testDb MVCC TRUE LOCK TIMEOUT DB关闭时退出假
    生产:
        数据源:
            dbCreate: 更新
            网址: jdbc h prodDb MVCC TRUE LOCK TIMEOUT DB CLOSE EXIT FALSE关闭
            属性:
               jmxEnabled: 真正
               initialSize: 5

这将配置一个数据源带有命名为Spring bean的数据源要配置额外的数据源,请添加数据源屏蔽环境中的顶层或两者都像标准数据源具有自定义名称的定义例如,此配置添加了第二个数据源在开发环境中使用MySQL,在生产环境中使用Oracle

数据源:
    派对: 真正
    jmxExport: 真正
    driverClassName: org h驱动程序
    用户名: 她的
    密码:

数据源:
    抬头:
        方言: org休眠方言MySQLInnoDBDialect
        driverClassName: com mysql jdbc驱动程序
        用户名: 抬头
        密码: 秘密
        网址: jdbc mysql localhost查找
        dbCreate: 更新

环境:
    发展:
        数据源:
            dbCreate: 创建放置
            网址: jdbc h mem devDb MVCC TRUE LOCK TIMEOUT DB EXIT FALSE关闭
    测试:
        数据源:
            dbCreate: 更新
            网址: jdbc h mem testDb MVCC TRUE LOCK TIMEOUT DB关闭时退出假
    生产:
        数据源:
            dbCreate: 更新
            网址: jdbc h prodDb MVCC TRUE LOCK TIMEOUT DB CLOSE EXIT FALSE关闭
            属性:
                jmxEnabled: 真正
                initialSize: 5
                ...
        数据源:
            抬头:
                方言: 组织休眠方言Oracle gDialect
                driverClassName: oracle jdbc驱动程序OracleDriver
                用户名: 抬头
                密码: 秘密
                网址: jdbc oracle瘦本地主机查找
                dbCreate: 更新

您可以使用相同或不同的数据库,只要Hibernate支持它们即可

如果您需要注入抬头365bet地区365bet地区工件中的数据源,您可以像这样

数据源dataSource查找
在定义多个数据源时,其中之一必须365bet地区被命名为dataSource这是必需的,因为365bet地区通过确定哪个数据源被命名为dataSource来确定哪个数据源是默认的

配置域类

如果域类没有数据源默认配置为标准数据源设置数据源物业映射阻止配置非默认值数据源例如,如果您想使用邮政编码要使用的域抬头 数据源像这样配置

 邮政编码 {

   静态的映射数据源'抬头'
   }
}

域类也可以使用两个或多个数据源。数据源具有名称列表的属性,例如,可以配置多个名称

 邮政编码 {

   静态的映射数据源'抬头', '审核'])
   }
}

如果域类使用默认值数据源还有一个或多个其他使用特殊名称默认表示默认数据源:

 邮政编码 {

   静态的映射数据源'抬头', '默认'])
   }
}

如果域类使用所有已配置的数据源,请使用特殊值所有:

 邮政编码 {

   静态的映射数据源'所有'
   }
}

命名空间和GORM方法

如果一个域类使用多个数据源那么您可以使用每个隐含的名称空间数据源拨打特定电话的名称数据源例如,考虑使用两个数据源的此类

 邮政编码 {

   静态的映射数据源'抬头', '审核'])
   }
}

首先数据源当不使用显式命名空间时,指定为默认值,因此在这种情况下,我们默认为抬头但是您可以在审核中调用GORM方法数据源数据源例如名称

定义zipCode ZipCode审核获取42邮政编码审核保存

如您所见,您添加了数据源在静态情况和实例情况下都调用方法

休眠映射域类

您还可以将带注释的Java类划分为单独的数据源,使用默认数据源的类已注册在grails应用程序会议休眠cfg xml要指定带注释的类使用非默认数据源,请创建一个休眠cfg xml该数据源的文件,文件名以数据源名称为前缀

例如,如果类在默认数据源中,您可以在其中注册grails应用程序会议休眠cfg xml:




   
      <> ='org范例书'/>
   

如果图书馆该类在ds数据源中,您将在其中注册grails应用程序conf ds休眠cfg xml:




   
      <> ='组织示例库'/>
   

对于使用hbm xml文件映射的类,该过程相同,只是将它们列出在适当的hibernate cfg xml文件中

服务

默认情况下,像域类一样,服务使用默认值数据源PlatformTransactionManager配置服务以使用其他服务数据源使用静态数据源例如属性

 数据服务 {

   静态的数据源'抬头'

   虚空someMethod

交易服务只能使用一个数据源因此,请确保仅对其域类进行更改数据源与服务相同

请注意,服务中指定的数据源与域类所使用的数据源无关,该域类由其在域类本身中声明的数据源确定。它用于声明要使用哪个事务管理器

如果你有一个oo域类数据源还有一个酒吧域类数据源如果WahooService用途数据源一种保存新的服务方法oo和一个新的酒吧仅适用于oo由于它们共享相同的数据源,因此交易不会影响酒吧实例如果您希望两者都是事务性的,则需要使用两个服务和XA数据源通过Atomikos插件进行两阶段提交

跨多个数据源的事务

默认情况下,365bet地区不会尝试处理跨越多个数据源的事务

您可以使365bet地区使用尽力而为PC模式来处理跨多个数据源的事务。为此,您必须设置365bet地区启用了chainedTransactionManagerPostProcessor事务设置为真正yml应用程序:

:
  交易:
    chainedTransactionManagerPostProcessor:
      已启用: 真正

尽力而为的PC模式是相当笼统的,但在某些情况下可能会失败,开发人员必须意识到

这是一种非XA模式,涉及多个资源的同步单阶段提交,因为个人电脑不被使用,它永远不会像XA交易,但如果参与者意识到折衷方案,通常就足够了

基本思想是在事务中尽可能延迟所有资源的提交,以便唯一可能出错的是基础结构故障,而不是业务处理错误。他们可以承担风险以换取更高的吞吐量如果业务处理服务也被设计为幂等的,那么实践中几乎不会出错

365bet地区在365bet地区中添加了BE PC实现。在此更改之前,其他数据源未参与365bet地区中启动的事务。其他数据源中的事务基本上处于自动提交模式。在某些情况下,这可能是所需的行为。一个原因可能是启动时的性能。在每笔新交易中,BE PC交易管理器都会为每个数据源创建一个新交易。通过设置交易错误在其他dataSource数据源的相应配置块中readOnly是也将被排除在链式交易管理器之外,因为

默认情况下,BE PC实现将添加所有实现Spring的beanPlatformTransactionManager与链式BE PC事务管理器的接口例如可能JMSTransactionManager365bet地区365bet地区应用程序上下文中的bean将被添加到365bet地区 BE PC事务管理器的事务管理器链中

您可以使用此配置选项从BE PC实施中排除事务管理器bean

:
  交易:
    chainedTransactionManagerPostProcessor:
      已启用: 真正
      黑名单模式: '.*'

排除匹配是在事务管理器bean的名称上完成的。交易错误要么readOnly是将被跳过,在这种情况下不需要使用此配置选项

XA和两阶段提交

365bet地区当“尽力而为” PC模式不适合跨多个事务资源处理事务时,不仅有数据源,还有几个选项可用于向365bet地区应用程序添加XA PC支持

春季交易文档包含有关集成不同应用程序服务器的JTA XA事务管理器的信息。在这种情况下,您可以使用以下名称配置bean:transactionManager手动输入资源槽要么资源xml文件

版本控制

在运行时检测版本

您可以使用365bet地区对应用程序元数据的支持来检测应用程序版本,方法是使用365bet地区应用类例如在控制器有一个隐含的grails应用可以使用的变量

定义版本grailsApplication元数据getApplicationVersion

您可以检索运行的365bet地区版本

定义grailsVersion grails应用程序元数据get365bet地区Version

或者365bet地区Util

进口 365bet地区实用工具365bet地区Utildef grailsVersion 365bet地区Util grailsVersion

依赖解决

依赖关系解析由Gradle构建工具所有依赖项都在建立gradle文件请参阅Gradle用户指南了解更多信息

命令行

365bet地区365bet地区的命令行系统与365bet地区的早期版本有很大不同,并且具有用于调用Gradle进行构建相关任务以及执行代码生成的API

当您键入

ils>

365bet地区365bet地区搜索档案库基于当前应用程序的概要文件如果概要文件用于Web应用程序,则从Web概要文件及其继承的基本概要文件中读取命令

由于命令行为是特定于配置文件的,因此Web配置文件可能会为运行应用命令然后说出用于运行批处理应用程序的配置文件

当您键入以下命令时

grails运行应用

它将首先搜索应用程序,然后在配置文件中搜索命令

  • PROJECT HOME src主要脚本运行groovy应用程序

  • 轮廓命令运行应用程序groovy

  • 轮廓命令运行app yml

要获取所有命令的列表以及有关可用命令的一些帮助,请键入

grails的帮助

365bet地区它输出使用说明和365bet地区知道的命令列表

ils>* <> <365bet地区示例grails dev运行应用程序grails创建应用程序书籍可用命令类型grails help命令名称以获取更多信息命令名称命令描述clean清理365bet地区应用程序的已编译源编译编译365bet地区应用程序
有关各个命令的更多信息,请参考参考指南的“快速参考”菜单中的“命令行参考”。

争论

命令是前线摇动因此,调用可能会有意外的副作用,例如在执行时365bet地区 Dapp foo bar运行应用应用程式foo系统属性对您的应用程序将不可用,这是因为bootRun在你的建立gradle配置系统属性要完成这项工作,您可以简单地附加所有系统属性bootRun建立gradle喜欢

bootRun系统属性系统属性请注意不要使用,因为它将覆盖所有已配置的systemProperties。
}

或者,如果您只想传递有限的集合,则可以使用任意前缀为系统属性添加前缀并进行配置bootRun喜欢

bootRun bootRun系统属性系统属性注入acc项目item项startsWith'开机'acc项目密钥子字符串'开机'长度项目值acc

在此示例中,仅系统属性以开机通过

应在以下位置指定应用程序和JVM参数bootRun以及

bootRun引导运行jvmArgs'始终启用Dspring输出和ANSI输出'args'app foo bar','应用栏foo') 覆盖app foo和app bar配置选项grailsApplication config
    }
}

非互动模式

当您手动运行脚本并提示您输入信息时,您可以回答问题并继续运行脚本。但是,当您将脚本作为自动化过程的一部分运行(例如,持续集成构建服务器)时,则无法回答问题,因此你可以通过非互动切换到脚本命令以告诉365bet地区对任何问题(例如是否安装缺少的插件)接受默认答案

例如

格里尔斯战争非互动

互动模式

交互模式是365bet地区命令行的一项功能,可保持JVM运行并允许更快地执行命令。要激活交互模式,请在命令行中键入grails,然后使用TAB补全获取命令列表。

互动输出

如果您需要在交互模式下打开文件,则可以使用打开TAB将完成文件路径的命令

互动式开放cmd

更好的打开该命令了解逻辑别名测试报告和dep报告,这将分别打开最新的测试报告和依赖关系报告。换句话说,在浏览器中打开测试报告只需执行打开测试报告您甚至可以一次打开多个文件打开测试报告测试单元MyTests groovy将在您的浏览器中打开HTML测试报告,然后MyTests常规文本编辑器中的源文件

TAB补全也适用于创建命令

互动式完整班

如果需要在交互模式下运行时运行外部进程,可以通过使用以下命令启动命令

外部互动运行

请注意,使用bang命令,您将获得文件路径自动完成功能,非常适合在文件系统上运行的外部命令,例如ls cat git等。

要退出交互模式,请输入出口365bet地区命令请注意,如果365bet地区应用程序已与运行应用通常,它会在交互式模式控制台退出时终止,因为JVM将终止。这是一个例外,如果应用程序以分叉模式运行,则意味着该应用程序在其他JVM中运行。在这种情况下,应用程序将在之后运行交互模式控制台终止如果要退出交互模式并停止以分叉模式运行的应用程序,请使用放弃命令放弃命令将停止正在运行的应用程序,然后关闭交互模式

创建自定义脚本

您可以通过运行以下命令来创建自己的命令脚本创建脚本从项目根目录开始的命令例如,以下命令将创建一个名为src主要脚本hello world groovy:

grails创建脚本你好世界
365bet地区通常,应使用365bet地区脚本来编写基于Gradle的构建系统的脚本,并且代码生成脚本不能加载应用程序类,实际上不应该加载,因为Gradle是构建应用程序类路径所必需的

参见下面的示例脚本,它可以打印Hello World

描述"范例说明", "你好世界"打印"你好,世界"

描述方法用于定义由grails的帮助并帮助用户使用脚本下面是一个更完整的示例,提供了从全部产生命令

描述"生成执行CRUD操作和关联视图的控制器"用法"grails生成所有>"那么:'', 描述:"是否覆盖现有文件"论点那么:'域类', 描述:'域类的名称'
}

如您所见,此描述配置了用法说明,标志和参数。这允许按以下方式使用命令

grails生成所有MyClass力

模板生成

需要定义模板生成任务的插件和应用程序可以使用脚本来执行此操作。一个示例是Scaffolding插件,它定义了全部产生生成控制器命令

365bet地区每个365bet地区脚本都会实现TemplateRenderer界面,使向用户项目工作区呈现模板变得轻而易举

以下是一个示例创建脚本用Groovy编写的命令

描述"365bet地区创建一个365bet地区脚本"用法"grails创建脚本'

标签的强制编码

如果标签指定的默认编码与您的要求不同,则可以通过传递可选的encodeAs属性来强制对任何标签进行编码

<G讯息码"富吧"encodeAs"的JavaScript" />

所有输出的默认编码

365bet地区新应用程序的默认配置适用于大多数情况,并且可以与现有插件和标记库向后兼容。但是,您还可以通过配置365bet地区在响应结束时始终对所有输出进行编码来使您的应用程序更加安全。filterCodecForContentType在配置应用程序:

grails视图gspfilteringCodecForContentType'文字HTML' = 'html'

请注意,如果激活静态零件编解码器通常需要设置为生的这样就不会对静态标记进行编码

编解码器表达'html' 转义里面的值脚本'html' 转义GSP中scriptlet的输出标签库'没有' 转义taglibs的输出静态零件'生的' 转义静态模板零件的输出
    }

编码和解码对象

365bet地区365bet地区支持动态编码解码方法的概念365bet地区捆绑了一组标准编解码器365bet地区还支持一种简单的机制,供开发人员贡献自己的编解码器,这些编解码器将在运行时识别

编解码器类

365bet地区365bet地区编解码器类可以包含一个编码闭包和/或一个解码闭包,当365bet地区应用程序启动时,365bet地区框架会从其中动态加载编解码器。365bet地区应用程序实用程序目录

框架看起来像365bet地区应用程序实用程序用于以约定结尾的类名编解码器365bet地区例如,365bet地区附带的标准编解码器之一是HTMLCodec.

如果编解码器包含编码365bet地区关闭365bet地区将创建动态编码方法并将该方法添加到宾语类,其名称代表定义了编码闭包的编解码器,例如HTMLCodec类定义一个编码365bet地区关闭,因此365bet地区将其附加名称encodeAsHTML.

HTMLCodecURLCodec类还定义了一个解码365bet地区关闭,因此365bet地区会将名称附加解码HTML解码网址365bet地区动态编解码器方法可以分别从365bet地区应用程序中的任何地方调用。例如,考虑一种情况,即报表包含一个名为description的属性,该属性可能包含必须转义才能在HTML文档中显示的特殊字符。 GSP将使用动态编码方法对description属性进行编码,如下所示

$报告描述encodeAsHTML

解码使用值解码HTML句法

静态编译代码的编码器和解码器接口

使用编解码器的首选方法是使用codecLookup bean来获取编码器解码器实例

组织grails编码器上市 接口编解码器查找上市 编码器lookupEncoder编解码器名称上市解码器查找编解码器名称

使用示例编解码器查找编码器接口

进口 组织grails编码器CodecLookup

 自订TagLib编解码器编解码器定义myTag地图attrs主体输出编解码器Lookup lookupEncoder'的HTML'编码属性

标准编解码器

HTMLCodec

此编解码器执行HTML转义和转义,以便可以在HTML页面中安全地呈现值,而无需创建任何HTML标签或损坏页面布局。例如,给定一个值,您不知道您将无法在HTML中安全地显示此值。页面,因为它将看起来像它关闭了一个标签,如果您在诸如输入字段的value属性之类的属性中呈现此数据,则这特别糟糕

使用例

"消息如何""${评论消息encodeAsHTML}"/>
请注意,HTML编码不会重新编码单引号,因此您必须在属性值上使用双引号,以避免带有撇号的文本影响您的页面

365bet地区HTMLCodec默认为在365bet地区版本中转义传统HTMLCodec实现的HTML样式,在此之前转义非ascii字符

您可以通过在以下位置设置此配置属性来使用纯XML转义而不是HTML转义应用程序:

格里尔的观点疾驰鹰派'XML文件'

XML编解码器

此编解码器执行XML转义和反转义。它转义不间断空格u行分隔符u和段落分隔符u

HTMLJSCodec

此编解码器执行HTML和JS编码,用于防止某些DOM XSS漏洞,请参阅基于OWASP DOM的XSS预防备忘单有关防止基于DOM的XSS攻击的指南

URLCodec

在链接或表单操作中创建URL或使用数据创建URL的任何时间都需要URL编码。它可以防止非法字符进入URL并更改其含义,例如Apple Blackberry不能作为URL中的参数正常工作GET请求作为“&”号将破坏参数解析

使用例

"mycontroller查找searchKey${lastSearch encodeAsURL}"重复上一次搜索/一种

基本编解码器

执行基本编码解码功能用法示例

您的注册码: $用户注册代码encodeAsBase

JavaScript编解码器

转义字符串,以便将它们用作有效的JavaScript字符串,例如

元件更新'elementId',
    '呈现模板通用消息encodeAsJavaScript')

十六进制编解码器

将字节数组或整数列表编码为小写的十六进制字符串,并且可以将十六进制字符串解码为字节数组

已选颜色: #${[255,127,255encodeAsHex

MD编解码器

使用MD算法在默认系统编码中以小写十六进制字符串的形式提取字节数组或整数列表或字符串的字节。

您的API: $用户uniqueID encodeAsMD

MD字节编解码器

使用MD算法以默认系统编码形式将字节数组或整数列表或字符串的字节作为字节数组进行摘要

字节[]password哈希参数password encodeAsMD字节

SHA编解码器

使用SHA算法以默认系统编码的形式将字节数组,整数列表或字符串的字节作为小写的十六进制字符串进行摘要

您的API: $用户uniqueID encodeAsSHA

SHA字节编解码器

使用SHA算法以默认系统编码形式将字节数组或整数列表或字符串的字节作为字节数组进行摘要

字节[]password哈希参数password encodeAsSHA字节

SHA编解码器

使用SHA算法以默认系统编码的形式将字节数组,整数列表或字符串的字节作为小写的十六进制字符串进行摘要

您的API: $用户uniqueID encodeAsSHA

SHA字节编解码器

使用SHA算法以默认系统编码形式将字节数组或整数列表或字符串的字节摘要提取为字节数组

字节[]password哈希参数password encodeAsSHA字节

自定义编解码器

365bet地区应用程序可以定义自己的编解码器,365bet地区会将它们与标准编解码器一起加载。必须在自定义编解码器类中定义365bet地区应用程序实用程序目录和类名必须以结尾编解码器编解码器可能包含静态的 编码关闭静态的 解码闭包或两者都闭包必须接受一个参数,该参数将是在例如上调用动态方法的对象

 猪拉丁编解码器 {
  静态的编码str将字符串转换为猪拉丁语并返回结果
  }
}

使用上述编解码器后,应用程序可以执行以下操作

姓氏编码Rs PigLatin

认证方式

365bet地区365bet地区没有默认的身份验证机制,因为可以通过许多不同的方式实现身份验证。但是,使用以下方法实现简单的身份验证机制很容易拦截器这对于简单的用例就足够了,但是最好使用已建立的安全框架,例如通过使用春季安全或者插入

拦截器使您可以在所有控制器或URI空间上应用身份验证。例如,您可以在名为的类中创建一组新的过滤器grails应用程序控制器SecurityInterceptor groovy通过运行

grails创建拦截器安全性

并在那里实施拦截逻辑

 安全拦截器安全拦截器匹配控制者:'用户', 行动:'登录')
    }

    布尔值之前如果会话用户actionName"登录"重新导向控制者: "用户", 行动: "登录")
            返回 
        }
        返回 真正
    }

}

拦截器在这里拦截执行之前除了所有动作登录被执行,如果会话中没有用户,则重定向到登录行动

登录动作本身也很简单

定义 登录() {
    如果请求得到返回 呈现登录视图
    }

    定义u用户findByLogin参数登录如果如果u密码参数密码会话用户u重定向行动: "")
        }
        其他渲染视图: "登录", 模型: [信息: "密码错误"])
        }
    }
    其他渲染视图: "登录", 模型: [信息: "找不到使用者"])
    }
}

安全插件

如果您需要除简单身份验证之外的其他高级功能(例如授权角色等),则应考虑使用spring安全核心插件

春季安全

Spring Security插件基于春季安全365bet地区该项目提供了一个灵活的可扩展框架,用于构建各种身份验证和授权方案。这些插件是模块化的,因此您可以仅安装应用程序所需的功能。Spring Security插件是365bet地区的官方安全插件,并得到积极维护和支持

有一个核心插件它支持基于表单的身份验证,加密的加盐密码,HTTP基本身份验证等,并且依赖于次级的插件提供了替代功能,例如ACL支持, Jasig CAS单一登录, LDAP验证, Kerberos身份验证和一个插件提供用户界面扩展和安全工作流程

看到核心插件页面有关基本信息和用户指南有关详细信息

外挂程式

365bet地区365bet地区首先是Web应用程序框架,但它也是一个平台通过公开许多扩展点,这些扩展点使您可以将任何内容从命令行界面扩展到运行时配置引擎,可以自定义365bet地区以适应几乎所有需求。平台您需要做的就是创建一个插件

365bet地区扩展平台可能听起来很复杂,但是插件的范围从简单到强大,如果知道如何构建365bet地区应用程序,就会知道如何为该插件创建插件共享数据模型或一些静态资源

创建和安装插件

创建插件

365bet地区创建365bet地区插件是运行命令的简单问题

grails创建插件>

这将为您指定的名称创建一个Web插件项目,例如运行grails创建插件示例将创建一个新的Web插件项目,名为.

365bet地区在365bet地区中,您应该考虑创建的插件是否需要Web环境,或者该插件是否可以与其他配置文件一起使用。如果您的插件不需要Web环境,请使用插件配置文件而不是默认的Web插件配置文件。

grails创建插件个人资料插件

确保插件名称不能连续包含多个大写字母,否则无法正常使用Camel大小写

365bet地区作为常规的365bet地区项目,有很多好处,即如果插件针对Web配置文件,您可以通过运行立即测试您的插件

grails运行应用
默认情况下,插件项目不会提供索引gsp,因为大多数插件都不需要它。因此,如果您尝试在创建插件后立即查看在浏览器中运行的插件,则会收到找不到页面的错误消息,您可以轻松地创建一个365bet地区应用程序观看次数索引gsp为您的插件,如果你想

365bet地区365bet地区插件的结构与365bet地区应用程序项目几乎相同,只是在src主界面365bet地区在插件包结构下的目录中,您会找到一个插件描述符类,该类以365bet地区Plugin结尾。

进口 grails插件

 365bet地区示例365bet地区插件 延伸插入

所有插件必须在src主界面目录,否则将不被视为插件。plugin类定义有关插件的元数据,以及可选的各种钩入插件扩展点的钩子

您还可以使用几个特殊属性提供有关插件的其他信息

  • 标题插件的简短一句话描述

  • grails版本365bet地区插件支持的365bet地区的版本范围,例如指示或更高

  • 作者插件作者的名字

  • authorEmail插件作者的联系电子邮件

  • 开发商除上述作者以外的任何其他开发人员

  • 描述插件功能的完整多行描述

  • 文件资料插件文档的URL

  • 执照插件许可证

  • 问题管理插件的问题跟踪器

  • SCM插件的源代码管理位置

石英自我
 365bet地区Quartz 365bet地区插件 延伸插入365bet地区插件设计用于的365bet地区版本
    定义grails版本"内置快照"
    插件打包中排除的资源
    定义pluginExcludes"365bet地区应用程序查看错误gsp"
    ]
    定义标题"石英" 插件的标题显示名称
    定义作者"杰夫·布朗"
    定义authorEmail"电子邮件保护"
    定义描述'''\
添加了Quartz作业调度功能'''
    定义型材'网络']
    清单loadAfter'冬眠的', '冬眠的', '冬眠的', '服务']
    定义文件资料"http grails org插件石英"
    定义执照"亚太地区"
    定义问题管理系统: "Github问题", 网址: "http github com grails插件石英问题" ]
    定义开发商那么: "乔·德夫", 电子邮件: "电子邮件保护" ]
    ]
    定义SCM网址: "https github com grails插件石英"闭包doWithSpring

安装本地插件

365bet地区要使您的插件可用于365bet地区应用程序,请运行安装命令

grails安装

这会将插件安装到您的本地Maven缓存中。然后在应用程序中使用插件,请声明对插件的依赖建立gradle归档并包含mavenLocal在您的存储库哈希中

仓库mavenLocal编译"org grails插件quartz"
365bet地区在365bet地区 x中,插件打包为ZIP文件,但是在365bet地区 x中,插件是简单的JAR文件,可以将其添加到IDE的类路径中。

插件和多项目构建

如果您希望将插件设置为多项目构建的一部分,请按照以下步骤操作

步骤创建应用程序和插件

使用命令创建一个应用程序和一个插件

$grails创建应用程序myapp$grails创建插件myplugin

步骤创建设置gradle文件

在同一目录中创建一个设置gradle包含以下内容的文件

包括"myapp", "myplugin"

目录结构应如下

项目目录设置gradle myapp build gradle myplugin build gradle

步骤声明对插件的项目依赖

建立gradle的应用程序声明了对插件的依赖外挂程式

grails插件编译项目'myplugin')
    }
}
您也可以在依存关系阻止,但是如果执行此操作,将不会重新加载子项目

步骤配置插件以启用重新加载

在插件目录中添加或修改gradle属性归档新属性爆炸了需要设置以便插件将分解目录添加到类路径

步骤运行应用程序

现在,使用grails运行应用您可以使用应用程序目录根目录中的命令冗长的标志以查看Gradle输出

$cd myapp$grails运行应用程序冗长

您将从Gradle输出中注意到,插件源已构建并放置在应用程序的类路径中

:myplugincompileAstJava最新myplugincompileAstGroovy截至日期mypluginprocessAstResources截至日期mypluginastClasses截至日期myplugin编译Java至今mypluginconfigScript截止日期myplugin编译GroovymyplugincopyAssets截止日期myplugin截至日期的copyCommandsmyplugincopyTemplates截止日期mypluginprocessResourcesmyapp编译Java至今myapp编译GroovymyappprocessResources截止日期myappmyappfindMainClassmyapp365bet地区bootRun 365bet地区应用程序在以下位置运行http:环境开发中的本地主机

关于排除文物的注意事项

虽然创建插件365bet地区该命令会为您创建某些文件,以便可以在365bet地区应用程序中运行该插件,但在打包插件时不包括所有这些文件。以下是创建但未包含的人工制品的列表包插件:

  • grails应用程序构建gradle虽然它用来产生依赖关系)

  • grails应用配置会议应用yml重命名为yml插件

  • grails app conf春季资源groovy

  • 365bet地区应用程序配置会议日志回切

  • 内在的一切src测试

  • 内的SCM管理文件svnCVS

自定义插件内容

开发插件时,您可以创建测试类和源,这些类和源将在插件的开发和测试过程中使用,但不应导出到应用程序中

要排除测试源,您需要修改pluginExcludes插件描述符的属性,并排除您内部的资源建立gradle例如,假设您在带演示插件源代码树中的软件包,但不应将其打包在应用程序中

安装在应用程序中后应由插件加载的资源
  定义pluginExcludes'带演示'
  ]

在你的建立gradle您应该从JAR文件中排除已编译的类

罐排除"带演示"
}

365bet地区365bet地区中的内联插件

365bet地区在365bet地区 x中,可以在中指定嵌入式插件BuildConfig365bet地区在365bet地区 x中,此功能已被Gradle的多项目构建功能所取代

要设置多项目构建,请在父目录中创建一个应用程序和一个插件

$grails创建应用程序myapp$grails创建插件myplugin

然后创建一个设置gradle父目录中的文件,指定您的应用程序和插件的位置

包括'myapp', 'myplugin'

最后在您的应用程序中添加一个依赖项建立gradle在插件上

编译项目'myplugin')

365bet地区使用此技术,您已经获得了365bet地区 x的内联插件的等效功能。

插件存储库

365bet地区在365bet地区中央插件存储库中分发插件

365bet地区分发插件的首选方法是发布到官方的365bet地区中央插件存储库,这将使您的插件对列出插件命令

grails列表插件

其中列出了中央存储库中的所有插件。您的插件也可用于插件信息命令

grails插件信息插件名称

打印有关它的额外信息,例如它的描述是谁写的等等

365bet地区如果您已经创建了365bet地区插件,并希望将其托管在中央存储库中,则会找到有关在插件门户网站

提供基本文物

添加命令行命令

365bet地区插件可以通过以下两种方式之一将新命令添加到365bet地区交互式外壳:创建脚本您可以创建一个代码生成脚本,该脚本将对应用程序可用。创建脚本命令将在src主要脚本目录

src主要脚本这里的其他脚本grails应用控制器服务等

代码生成脚本可用于在项目树中创建工件,并自动执行与Gradle的交互

365bet地区如果您想创建一个与已加载的365bet地区应用程序实例进行交互的新Shell命令,则应使用创建命令命令

$grails创建命令MyExampleCommand

这将创建一个名为grails应用程序命令PACKAGE PATH MyExampleCommand groovy延伸应用命令:

进口 grails dev命令

 MyExampleCommand 实施应用命令布尔值处理ExecutionContext ctx println"你好,世界"
      返回 真正
  }
}

一个应用命令有权使用365bet地区应用实例,并且像其他任何Spring bean一样会自动装配

365bet地区您还可以通知365bet地区跳过执行Bootstrap常规命令中具有简单属性的文件

 MyExampleCommand 实施应用命令布尔值shipBootstrap真正

  布尔值处理ExecutionContext ctx

对于每个应用命令365bet地区当前的365bet地区将创建一个shell命令和一个Gradle任务来调用应用命令在以上示例中,您可以调用MyExampleCommand使用任一类

$用我的榜样

要么

$gradle myExample

365bet地区365bet地区版本是所有小写连字符,并且不包括命令后缀

代码生成脚本和应用命令365bet地区实例是后者具有对365bet地区应用程序状态的完全访问权限,因此可用于执行与数据库交互的任务,从而调用GORM等

365bet地区在365bet地区 x Gant中,可以使用脚本在365bet地区 x代码生成中执行这两项任务,并且与运行时应用程序状态的交互已明确分开

添加新的grails应用程序工件Controller Tag Library Service等

插件可以通过在插件中创建相关文件来添加新工件。365bet地区应用

grails应用控制器这里的其他控制器在这里提供其他服务,在这里等其他XXX

提供视图模板和视图分辨率

365bet地区当插件提供控制器时,它可能还会提供要呈现的默认视图。这是通过插件对应用程序进行模块化的绝佳方法,365bet地区视图解析机制将首先在其安装到的应用程序中查找视图,如果失败,则尝试在插件中查找视图这意味着您可以通过在应用程序的应用程序中创建相应的GSP来覆盖插件提供的视图grails应用程序视图目录

例如,考虑一个名为BookController由亚马逊插件提供如果执行的操作是清单365bet地区365bet地区首先会寻找一个名为grails应用程式观看次数清单gsp然后,如果失败,它将寻找相对于插件的相同视图

但是,如果视图使用插件也提供的模板,则可能需要以下语法

<G渲染模板"fooTemplate"插入"亚马逊"/>

请注意插入365bet地区属性,其中包含模板所在的插件的名称。如果未指定,则365bet地区将查找相对于应用程序的模板

排除文物

365bet地区默认情况下,365bet地区在打包过程中不包括以下文件

  • 365bet地区应用程序配置会议日志回切

  • grails应用配置会议应用yml重命名为yml插件)

  • grails app conf春季资源groovy

  • 内在的一切src测试

  • 内的SCM管理文件svnCVS

默认值UrlMappings常规文件不会被排除,因此删除插件正常工作不需要的任何映射。您也可以随意使用其他名称添加UrlMappings定义,包含在内,例如一个名为grails应用程序控制器BlogUrlMappings groovy很好

排除列表可通过以下方式扩展pluginExcludes属性

插件打包中排除的资源
定义pluginExcludes"365bet地区应用程序查看错误gsp"
]

例如,这对于将演示或测试资源包括在插件存储库中而不在最终发行版中包括它们很有用。

评估惯例

在查看基于约定的运行时配置之前,您首先需要了解如何从插件评估这些约定。每个插件都有一个隐式的应用变量,它是365bet地区应用接口

365bet地区应用界面提供了方法来评估项目中的约定,并在内部存储对应用程序中所有工件类的引用

神器实现了365bet地区Class365bet地区代表365bet地区资源(例如控制器或标签库)的接口,例如获取所有365bet地区365bet地区Class你可以做的事

对于grailsClass应用程序所有类println grails类名

365bet地区应用具有一些魔术特性,可以缩小您感兴趣的伪像的类型,例如访问可以使用的控制器

对于controllerClass应用程序控制器类println控制器类名称

动态方法约定如下

  • 班级检索特定工件名称的所有类,例如应用控制器类.

  • 上课检索特定人工制品的命名类,例如应用程序getControllerClass PersonController

  • 是班级退货真正如果给定的类别是给定的伪像类型,例如应用程序isControllerClass PersonController

365bet地区Class接口具有许多有用的方法,可让您进一步评估和使用约定,包括

  • getPropertyValue获取类上给定属性的初始值

  • hasProperty退货真正如果类具有指定的属性

  • newInstance创建此类的新实例

  • getName返回应用程序中类的逻辑名称,不包含尾随约定部分(如果适用)

  • getShortName返回没有包前缀的类的简称

  • getFullName返回带有尾随约定部分和包名称的应用程序中类的全名。

  • getPropertyName返回类的名称作为属性名称

  • getLogicalPropertyName返回应用程序中类的逻辑属性名称,不包含结尾约定部分(如果适用)

  • 自然的以自然术语返回属性的名称,例如lastName变为Last Name

  • getPackageName返回包名称

有关完整参考,请参阅给防火墙.

挂钩运行时配置

365bet地区365bet地区提供了许多挂钩来利用系统的不同部分并按照约定执行运行时配置

365bet地区与365bet地区 Spring配置挂钩

365bet地区首先,您可以挂钩365bet地区运行时配置,以覆盖doWithSpring的方法插入365bet地区类,并返回定义其他bean的闭包。例如,以下片段摘自提供以下功能的核心365bet地区插件之一:支持

进口 组织Springframework Web servlet在CookieLocaleResolver
进口 组织springframework Web servlet在LocaleChangeInterceptor
进口 org springframework上下文支持ReloadableResourceBundleMessageSource
进口 grails插件

 365bet地区我n365bet地区Plugin 延伸插入定义"0.1"关闭doWithSpring messageSource ReloadableResourceBundleMessageSource基本名称"WEB INF grails应用程序中的消息"localeChangeInterceptor LocaleChangeInterceptor paramName""localeResolver CookieLocaleResolver

365bet地区该插件配置365bet地区messageSourceBean和其他几个Bean来管理区域设置解析并使用春豆建造者这样做的语法

自定义Servlet环境

365bet地区在以前的365bet地区版本中,可以动态修改生成的veh km在365bet地区 x中没有veh km文件,因此无法以编程方式修改veh km不再归档

365bet地区但是,可以在365bet地区 x中执行最常见的修改Servlet环境的任务。

添加新的Servlet

如果要添加新的Servlet实例,最简单的方法就是在Bean中定义一个新的Spring bean。doWithSpring方法

关闭doWithSpring Servlet MyServlet

如果您需要自定义servlet,则可以使用Spring Boot。ServletRegistrationBean:

关闭doWithSpring myServlet ServletRegistrationBean我的Servlet"myServlet"loadOnStartup2
  }
}}

添加新的Servlet过滤器

就像Servlets一样,配置新过滤器的最简单方法是简单地定义一个Spring bean

关闭doWithSpring myFilter MyFilter

但是,如果您想控制过滤器注册的顺序,则需要使用Spring Boot。FilterRegistrationBean:

myFilter FilterRegistrationBean筛选器豆MyFilter urlPatterns'/*'订购订购的最高精密度
365bet地区365bet地区内部注册的过滤器365bet地区365bet地区WebRequestFilter, 隐藏的HttpMethodFilter等通过递增定义最高的精度365bet地区通过允许在365bet地区过滤器之前或之间插入几个过滤器

执行后期初始化配置

有时在Spring之后进行一些运行时配置会很有用ApplicationContext已建立在这种情况下,您可以定义doWithApplicationContext关闭属性

 简单插件 延伸插入定义那么"简单"
    定义"1.1"

    覆写
    虚空doWithApplicationContext定义sessionFactory applicationContext sessionFactory在这里使用会话工厂做某事
    }
}

在编译时添加方法

365bet地区365bet地区使得从插件向现有工件类型添加新特征变得容易,例如说您想向控制器添加用于操纵日期的方法,这可以通过在中定义特征来完成。src主界面:

myplugin增强("控制者"日期特征日期当前的日期返回  日期()
  }
}

增强批注定义了应将特征应用到的伪像的类型

作为使用增强上面的注释可以实现TraitInjector告诉365bet地区在编译时要将特征注入哪些伪像

myplugin静态编译
 控制器特质注入器 实施TraitInjector覆写
    getTrait SomeTrait覆写
    []getArtefactTypes'控制者']  []
    }
}

以上TraitInjector将添加SomeTrait给所有控制器getArtefactTypes方法定义了应将特征应用到的伪像的类型

有条件地应用特质

一种TraitInjector实现也可以实现SupportsClassNode接口将特征仅应用到满足自定义要求的人工制品的接口例如,如果仅在目标人工制品类具有特定注释的情况下才应用特征,则可以按以下方式进行操作

myplugin静态编译
 基于注释的特质注入器 实施TraitInjector支持ClassNode覆写
    getTrait SomeTrait覆写
    []getArtefactTypes'控制者']  []
    }

    布尔值支持ClassNode classNode返回365bet地区365bet地区ASTUtils具有Annotation类Node SomeAnnotation

以上TraitInjector将添加SomeTrait只给那些具有注释宣告

该框架通过以下方式发现特质注入者META INF 365bet地区工厂jar文件中的描述符该描述符是自动生成的为上面显示的代码生成的描述符如下所示

365bet地区365bet地区工厂文件grails编译器特征TraitInjector myplugin ControllerTraitInjector myplugin DateTraitTraitInjector
由于上述格式问题,代码段在等号后包含换行符

该文件会自动生成,并在构建时添加到jar文件中。365bet地区工厂归档于src主要资源META INF grails工厂在该文件中明确定义特征注入器非常重要。只有在应用程序未定义自己的元数据时,自动生成的元数据才是可靠的src主要资源META INF grails factores文件

在运行时添加动态方法

基础

365bet地区365bet地区插件使您可以在运行时向任何365bet地区托管的或其他类注册动态方法。doWithDynamicMethods方法

请注意,365bet地区 x具有较新的功能,例如可从使用编译的代码中使用的特征静态编译建议仅对特征无法实现的情况添加动态行为
 示例插件 延伸插入虚空doWithDynamicMethods对于controllerClassgrails应用程序controllerClasses controllerClass metaClass myNewMethod println"你好,世界" }
        }
    }
}

在这种情况下,我们使用隐式应用程序对象获取对所有控制器类MetaClass实例的引用,并添加一个名为myNewMethod到每个控制器如果您事先知道该类,则希望向其添加方法可以简单地引用其元类属性

例如,我们可以添加一个新方法swapCasejava长字符串:

 示例插件 延伸插入覆写
    虚空doWithDynamicMethods元类swapCase定义某人 StringBuilder委派每个人字符isUpperCase  四个) ?
                        字符降低大小写  四个) :
                        字符至大写  四个sb toString断言 "上和下" == "上和下"swapCase

与ApplicationContext交互

doWithDynamicMethods春季关闭ApplicationContext实例这很有用,因为它允许您与其中的对象进行交互。例如,如果您正在实现与Hibernate进行交互的方法,则可以使用会话工厂实例与HibernateTemplate:

进口 org springframework orm休眠HibernateTemplate

 示例Hibernate插件 延伸插入虚空doWithDynamicMethods对于domainClassgrailsApplication domainClasses domainClass metaClass静态负载longID定义sf applicationContext sessionFactory定义模板HibernateTemplate SF模板加载委托ID

另外,由于Spring容器具有自动装配和依赖项注入功能,因此您可以实现更强大的动态构造函数,这些构造函数使用应用程序上下文在运行时将依赖项连接到对象中

 MyConstructor插件 {

    虚空doWithDynamicMethods对于domainClassgrailsApplication domainClasses domainClass metaClass构造函数返回applicationContext getBean domainClass名称

在这里,我们实际上将默认构造函数替换为查找原型Spring bean的构造函数

参加自动重装活动

监控变更资源

365bet地区通常,监视资源以进行更改并在更改发生时执行一些操作很有价值。这就是365bet地区如何在运行时实现应用程序状态的高级重载。例如,考虑一下365bet地区的此简化代码段服务插件:

 服务365bet地区插件 延伸观看了插件的资源"文件grails应用服务服务常规"无效onChange地图<, 宾语事件如果事件来源定义serviceClass grailsApplication addServiceClass事件源定义服务名称"${serviceClass propertyName}"豆子"$服务名称"serviceClass getClazz bean bean自动装配真正
                }
            }
        }
    }
}

首先它定义watched资源作为包含要监视的资源的引用或模式的字符串或字符串列表,如果被监视的资源在更改时指定了Groovy文件,则它将自动重新加载并传递到onChange在关闭事件宾语

事件对象定义了许多有用的属性

  • 事件来源事件的来源或重新加载或春天资源资源

  • 事件ctx春天ApplicationContext实例

  • 事件插件通常管理资源的插件对象这个)

  • 活动申请365bet地区应用实例

  • 事件管理器365bet地区365bet地区插件管理器实例

这些对象可用于帮助您基于更改内容应用适当的更改。在上述“服务”示例中,新的服务bean被重新注册到服务对象中。ApplicationContext当其中一种服务类别更改时

影响其他插件

除了对更改做出反应之外,有时一个插件还需要影响另一个插件

以服务和控制器插件为例,当重新加载服务时,除非您重新加载控制器,否则当尝试将重新加载的服务自动连接到较旧的控制器类时,也会出现问题。

为了解决这个问题,您可以指定另一个插件会影响哪些插件。这意味着,当一个插件检测到更改时,它将重新加载自身,然后重新加载其影响的插件。例如,请考虑以下代码段:365bet地区服务365bet地区插件:

定义影响'控制器']

观察其他插件

如果有一个特定的插件,您想观察其变化,但不必监视它监视的资源,则可以使用observe属性

定义观察"控制器"]

在这种情况下,更改控制器后,您还将收到从控制器插件链接的事件

插件还可以使用通配符来观察所有已加载的插件

定义观察"*"]

Logging插件正是这样做的,因此可以添加日志财产回任何在应用程序运行时发生变化的伪像

了解插件加载顺序

控制插件依赖性

插件通常取决于其他插件的存在,并且可以根据其他插件的存在进行调整。这是通过两个属性实现的:第一个称为取决于例如,从Hibernate插件中查看此片段

 365bet地区Hibernate365bet地区插件 {

    定义"1.0"

    定义取决于数据源: "1.0",
                     domainClass: "1.0",
                     : "1.0",
                     核心: "1.0"]
}

Hibernate插件取决于四个插件的存在。数据源, domainClass, 核心外挂程式

依赖项将在Hibernate插件之前加载,如果所有依赖项均未加载,则插件将不会加载

取决于属性还支持一种用于指定版本范围的微型表达式语言。下面是一些语法示例:

定义取决于: "* > 1.0"]
定义取决于: "1.0 > 1.1"]
定义取决于: "1.0 > *"]

使用通配符时,它表示任何版本。表达式语法还排除任何后缀,例如BETA ALPHA等,因此该表达式将与以下任何版本匹配

  • 1.1

  • 1.0

  • 1.0.1

  • 快照

  • 测试版

控制装载顺序

使用取决于建立硬依赖关系,如果未解决依赖关系,则插件将放弃并不会加载。使用loadAfterloadBefore属性

定义loadAfter'控制器']

在这里,插件将在控制器插件(如果存在),否则将被加载。该插件可以适应其他插件的存在,例如Hibernate插件在其代码中包含此代码doWithSpring关闭

如果365bet地区经理has365bet地区Plugin"控制器"openSessionInViewInterceptor openSessionInViewInterceptor flushMode HibernateAccessor FLUSH MANUAL sessionFactory sessionFactory grailsUrlHandlerMapping拦截器openSessionInViewInterceptor

在这里,Hibernate插件只会注册一个OpenSessionInViewInterceptor如果控制器插件已加载经理变量是的实例365bet地区插件管理器界面,它提供了与其他插件进行交互的方法

您也可以使用loadBefore属性,用于指定您的插件应先加载的一个或多个插件

定义loadBefore'Rabbitmq']

范围和环境

不仅可以控制插件的加载顺序,还可以指定插件应加载的环境以及构建的作用域阶段,只需在插件描述符中声明其中一个或两个属性即可。

定义环境'发展', '测试', 'myCustomEnv']
定义范围排除:'战争']

在此示例中,该插件仅会在开发和测试环境中加载,也不会打包到WAR文件中,因为它已被排除在战争阶段之外。仅发展插件不得打包用于生产用途

可用范围的完整列表由枚举定义建筑范围但这是一个总结

  • 测试运行测试时

  • 功能测试运行功能测试时

  • 用于运行应用程序和进行战争

  • 战争将应用程序打包为WAR文件时

  • 所有插件适用于所有范围默认

这两个属性可以是以下之一

  • 唯一的字符串

  • 列出要包括的环境或范围的列表

  • 完全控制的映射,包含和/或排除键可以具有字符串或列表值

例如

定义环境"测试"

仅在测试环境中包含插件,而

定义环境"发展", "测试"]

将其包含在两个开发中最后的测试环境

定义环境包括: ["发展", "测试"]]

会做同样的事情

Artefact API

365bet地区您现在应该了解365bet地区拥有人工制品的特殊类型的概念,它知道并且可以与常规Groovy和Java类区别对待,例如通过使用额外的属性和方法对其进行增强,人工制品的示例包括域类和控制器。可能没有意识到的是365bet地区允许应用程序和插件开发人员访问人工制品的基础结构,这意味着您可以找出可用的人工制品,甚至自己对其进行增强,甚至可以提供自己的自定义人工制品类型

询问可用的文物

作为插件开发人员,重要的是要找出应用程序中可用的域类控制器或其他类型的人工制品,例如Elasticsearch插件需要知道存在哪些域类,以便可以检查它们是否存在可搜寻的属性并为适当的属性建立索引,那么它是如何做到的答案在于grails应用对象和实例365bet地区应用可以在控制器和GSP中自动使用,并且可以注入的其他地方

grails应用对象具有几种重要的属性和查询伪像的方法,最常见的可能是为您提供特定伪像类型的所有类别的对象

对于CLSgrails应用班级

在这种情况下artefactType365bet地区是人工制品类型的属性名称形式

  • 控制者

  • tagLib

  • 服务

  • 编解码器

  • 引导程序

  • urlMappings

因此,例如,如果您想遍历使用的所有域类

对于CLSgrails应用程序域类

和用于URL映射

对于CLSgrailsApplication urlMappingsClasses

您需要注意,这些属性返回的对象不是以下对象的实例相反,它们是365bet地区Class具有一些特别有用的属性和方法,包括用于基础:

  • 简称没有与之等效的包装的人工制品的类名类simpleName).

  • logicalPropertyName属性形式的伪像名称,不带类型后缀SoMyGreatController成为我的伟大

  • isAbstract指示artefact类是否为抽象的布尔值

  • getPropertyValue名称返回给定属性的值,无论它是静态的还是实例的。如果在声明e上初始化该属性,则效果最佳静态交易真.

artefact API还允许您按名称获取类,并检查类是否为人工制品

  • 得到类字符串名称

  • 班级爵士乐

第一种方法将检索365bet地区Class给定名称的实例e g MyGreatController第二个实例将检查类是否为特定类型的人工制品。例如,您可以使用grailsApplication isControllerClass组织示例MyGreatController检查是否MyGreatController实际上是控制者

添加您自己的文物类型

插件可以轻松提供自己的伪像,以便他们可以轻松找到可用的实现并参与重新加载。您所要做的就是创建一个ArtefactHandler实现并将其注册到您的主插件类中

 365bet地区My365bet地区插件 {
    定义Artefacts组织MyArtefactHandler

人工制品列表可以包含上述处理程序类或处理程序实例

那么,人工制品处理程序的外观是什么呢?简单地说,它是ArtefactHandler接口为了使生活更轻松,有一个可以轻松扩展的框架实现ArtefactHandlerAdapter.

除了处理程序本身之外,每个新工件都需要一个相应的包装器类,该包装器类实现365bet地区Class骨架实现再次可用,例如365bet地区AbstractInjectable365bet地区Class这特别有用,因为它将您的人工制品变成可以自动连线的Spring bean,就像控制器和服务一样

理解处理程序类和包装程序类如何工作的最好方法是查看Quartz插件

另一个例子是白p-杜松子酒这增加了一个领域的人工制品

365bet地区谷物和春天

365bet地区本部分适用于高级用户以及对365bet地区如何与之集成和构建感兴趣的人。春季框架这对于插件开发人员365bet地区考虑进行运行时配置365bet地区

配置其他Bean

使用Spring Bean DSL

您可以通过在中配置它们来轻松注册新的或覆盖现有的beangrails app conf春季资源groovy365bet地区使用365bet地区春季DSLBean定义在豆子闭包

豆子豆在这里
}

作为一个简单的示例,您可以使用以下语法配置Bean

进口 我的公司MyBeanImpl豆myBean MyBeanImpl someProperty42其他财产"蓝色"
    }
}

365bet地区配置完成后,可以将Bean自动连接到365bet地区工件和其他支持依赖项注入的类中。BootStrap常规在这种情况下,通过声明一个名称为您的bean名称的公共字段来进行集成测试myBean):

 ExampleController {

     定义myBean

使用DSL的优点是您可以混合bean声明和逻辑,例如基于环境:

进口 免费环境
进口 我的公司模拟MockImpl
进口 我的公司MyBeanImpl豆子开关环境电流案件生产环境myBean MyBeanImpl someProperty42其他财产"蓝色"
            }
            打破

        案件环境开发myBean MockImpl someProperty42其他财产"蓝色"
            }
            打破
    }
}

365bet地区应用可以使用应用365bet地区变量,可用于访问365bet地区配置等

进口 免费环境
进口 我的公司模拟MockImpl
进口 我的公司MyBeanImpl豆子如果应用程序配置我公司的mockService myBean MockImpl someProperty42其他财产"蓝色"
        }
    } 其他myBean MyBeanImpl someProperty42其他财产"蓝色"
        }
    }
}
如果您在其中定义一个bean资源槽365bet地区与先前由365bet地区注册的名称相同或已安装插件的名称相同,您的bean将替换先前的注册。这是一种自定义行为的简便方法,而无需诉诸于编辑插件代码或其他会影响可维护性的方法

使用XML

Bean也可以使用grails应用程序conf春季资源xml365bet地区在较早版本的365bet地区中,此文件是由您自动生成的运行应用脚本,但DSL在资源槽现在是首选方法,因此现在不会自动生成,但是仍然支持您只需要自己创建它

该文件是典型的Spring XML文件,Spring文档中有一个优秀的参考关于如何配置Spring Bean

myBean我们使用DSL配置的bean将在XML文件中使用此语法进行配置

<> ID="myBean" ="我的公司MyBeanImpl">
    <> 那么="someProperty" ="42" />
    <> 那么="其他财产" ="蓝色" />

像其他bean一样,它可以自动连接到任何支持依赖项注入的类中

 ExampleController {

     定义myBean

引用现有的Bean

声明的豆资源槽要么资源xml可以按照约定引用其他bean,例如,如果您有一个图书服务该类的Spring bean名称将是bookService所以您的bean会在DSL中像这样引用它

豆myBean MyBeanImpl someProperty42其他财产"蓝色"bookService参考"bookService")
    }
}

或类似的XML

<> ID="myBean" ="我的公司MyBeanImpl">
    <> 那么="someProperty" ="42" />
    <> 那么="其他财产" ="蓝色" />
    <> 那么="bookService" 参考="bookService" />

该bean需要一个公共setter作为bean的引用,还需要在Groovy中定义的两个简单属性,如下所示:

我的公司 MyBeanImpl {
    整数someProperty其他属性BookService bookService或只是def bookService
}

或像这样的Java

我的公司 MyBeanImpl {

    私人的BookService bookService私人的 整数someProperty私人的 其他财产上市 虚空setBookService BookService theBookService这个bookService theBookService上市 虚空setSomeProperty整数someProperty这个someProperty someProperty上市 虚空setOtherProperty其他财产这个其他财产其他财产

使用参考XML或DSL中的XML是非常强大的,因为它配置了运行时引用,因此被引用的Bean不必存在,只要在最终应用程序上下文配置发生时它就位,就可以正确解决所有问题。

有关可用bean的完整参考,请参见参考指南中的插件参考。

Bean DSL的运行时Spring

365bet地区365bet地区中的这个Bean构建器旨在提供一种简化的将依赖项连接在一起的方式,该方式以Spring为核心

365bet地区另外,Spring通过XML和注释进行配置的常规方法是静态的,并且在运行时很难修改和配置,而编程性XML创建则容易出错且冗长。BeanBuilder的通过在运行时以编程方式将组件连接在一起,从而改变了所有这些情况,从而使您能够根据系统属性或环境变量来调整逻辑

这使代码能够适应其环境,并避免了不必要的重复代码,这些代码具有不同的Spring配置用于测试开发和生产环境

BeanBuilder类

365bet地区365bet地区提供了365bet地区 Spring BeanBuilder使用动态Groovy构造bean定义的类基础知识如下

进口 组织apache commons dbcp BasicDataSource
进口 org grails orm休眠ConfigurableLocalSessionFactoryBean
进口 org springframework上下文ApplicationContext
进口 365bet地区 Spring BeanBuilder

定义bbBeanBuilder BB豆dataSource BasicDataSource driverClassName"org h驱动程序"网址"jdbc h mem grailsDB"用户名"她的"密码""sessionFactory ConfigurableLocalSessionFactoryBean数据源引用'数据源'hibernate属性"休眠hbm ddl自动": "创建放置",
                               "休眠显示SQL":     "真正"ApplicationContext appContext bb createApplicationContext
外挂程式grails app conf春季资源groovy您不需要创建新实例的文件BeanBuilder的相反,DSL可以在doWithSpring豆子分别块

本示例说明了如何使用具有以下功能的数据源配置Hibernate:BeanBuilder的

这种情况下的每个方法调用数据源sessionFactory在Spring中,调用将映射到bean的名称。该方法的第一个参数是bean的类,而最后一个参数是一个块。在块体内,您可以使用标准Groovy语法在bean上设置属性

可以使用Bean的名称自动解析Bean引用。在上例中,通过sessionFactory豆解决数据源参考

生成器还可以设置与bean管理相关的某些特殊属性,如以下代码所示

sessionFactory ConfigurableLocalSessionFactoryBean bean自动装配行为另一个选项是byType>豆自动线'借名'
    将初始化方法设置为init init方法bean的init方法'在里面'
    设置销毁方法销毁销毁方法豆类破坏方法'破坏'
    设置bean的范围>豆范围'请求'数据源参考'数据源'hibernate属性"休眠hbm ddl自动": "创建放置",
                           "休眠显示SQL":     "真正"]
}

方括号中的字符串是Spring的XML定义中等效bean属性的名称。

在Spring MVC中使用BeanBuilder

包括格莱斯春天类路径中的文件以在常规Spring MVC应用程序中使用BeanBuilder,然后添加以下内容您的价值观BEB INF beb公里文件


    contextConfigLocation
    WEB INF applicationContext groovy



    contextClass
    365bet地区grails Web servlet上下文365bet地区WebApplicationContext

然后创建一个WEB INF applicationContext groovy其余的文件

进口 组织apache commons dbcp BasicDataSourcebean数据源BasicDataSource driverClassName"org h驱动程序"网址"jdbc h mem grailsDB"用户名"她的"密码""
    }
}

从文件系统加载Bean定义

您可以使用BeanBuilder的类,以加载使用此处定义的相同路径匹配语法定义Bean的外部Groovy脚本,例如

定义bbBeanBuilder bb loadBeans"类路径SpringBeans groovy")

定义applicationContext bb createApplicationContext

在这里BeanBuilder的将所有Groovy文件加载到以.s结尾的类路径上SpringBeans常规并将其解析为bean定义下面是一个示例脚本

进口 组织apache commons dbcp BasicDataSource
进口 org grails orm休眠ConfigurableLocalSessionFactoryBeanbean数据源BasicDataSource driverClassName"org h驱动程序"网址"jdbc h mem grailsDB"用户名"她的"密码""sessionFactory ConfigurableLocalSessionFactoryBean数据源数据源hibernateProperties"休眠hbm ddl自动": "创建放置",
                               "休眠显示SQL":     "真正"]
    }
}

将变量添加到绑定上下文

如果从脚本重新加载bean,则可以通过创建Groovy来设置要使用的绑定捆绑:

定义捆绑 捆绑绑定maxSize10000绑定产品组'金融'

定义bbBeanBuilder bb绑定绑定bb loadBeans"类路径SpringBeans groovy")

定义ctx bb createApplicationContext

然后您可以访问maxSize产品组DSL文件中的属性

BeanBuilder DSL说明

使用构造函数参数

可以使用每个bean定义方法的参数来定义构造函数参数。将它们放在Class的第一个参数之后

bb bean exampleBean MyExampleBean"firstArgument", 2someProperty1, 2, 3]
    }
}

此配置对应于MyExampleBean与一个看起来像这样的构造函数

MyExampleBean整型酒吧

使用工厂方法配置BeanDefinition

闭包的第一个参数是对Bean配置实例的引用,您可以使用该实例配置工厂方法并在该实例上调用任何方法。AbstractBean定义

bb bean exampleBean MyExampleBean bean bean bean工厂方法"getInstance"豆单身someProperty1, 2, 3]
    }
}

或者,您也可以使用bean定义方法的返回值来配置bean

bb豆定义示例exampleBean MyExampleBean someProperty1, 2, 3示例factoryMethod"getInstance"
}

使用工厂bean

Spring定义了工厂bean的概念,通常不是直接从Class的新实例中创建而是从这些工厂之一创建bean。在这种情况下,bean没有Class参数,而必须将工厂bean的名称传递给bean定义方法

bb bean myFactory ExampleFactoryBean someProperty1, 2, 3myBean myFactory名称"等等"
    }
}

另一种常见方法是提供要在工厂bean上调用的工厂方法的名称,这可以使用Groovy的命名参数语法来完成。

bb bean myFactory ExampleFactoryBean someProperty1, 2, 3myBeanmyFactory: "getInstance"那么"等等"
    }
}

在这里getInstance上的方法ExampleFactoryBeanbean将被调用来创建myBean豆角,扁豆

在运行时创建Bean引用

有时直到运行时才知道要创建的Bean的名称。在这种情况下,可以使用字符串插值来动态调用Bean定义方法

定义女人名字""bb豆"${女人名字}豆角,扁豆"MyExampleBean someProperty1, 2, 3]
    }
}

在这种情况下女人名字调用bean定义方法时使用先前定义的变量。该示例具有硬编码的值,但与基于配置系统属性等以编程方式生成的名称一起使用时,也可以正常工作。

此外,由于有时Bean名称直到运行时才知道,因此在这种情况下,使用参考方法

定义女人名字""bb豆"${女人名字}豆角,扁豆"MyExampleBean someProperty1, 2, 3anotherBean AnotherBean示例参考"${女人名字}豆角,扁豆")
    }
}

这里的示例属性AnotherBean使用运行时引用来设置exampleBean参考方法也可以用来从父级引用beanApplicationContext在构造函数中提供的BeanBuilder的:

ApplicationContext父级//
定义bbBeanBuilder父bb Bean anotherBean AnotherBean示例参考"${女人名字}豆角,扁豆", 真正)
    }
}

这里第二个参数真正指定引用将在父上下文中查找Bean

使用匿名内豆

您可以通过将bean的属性设置为带有参数的块来使用匿名内部bean,该参数为bean类型

bb beans marge人名"保证金"丈夫人p名"荷马"年龄45道具超重: 真正, 高度: ""儿童参考'巴特'参考'附件'巴特人名"巴特"年龄11丽莎人名"新增"年龄9
    }
}

在上面的示例中,我们将保证金bean的丈夫属性到创建内部bean引用的块中;或者,如果您有工厂bean,则可以省略类型,而只需使用指定的bean定义来设置工厂

bb beans personFactory PersonFactory marge人名"保证金"老公豆豆工厂"personFactory"豆工厂方法"newInstance"那么"荷马"年龄45道具超重: 真正, 高度: ""儿童参考'巴特'参考'附件')]
    }
}

抽象Bean和父Bean定义

要创建抽象bean定义,请定义一个没有参数

 圣杯任务 {
    定义 开始打印"让我们开始" }
}
 圆桌骑士 {

    那么领袖HolyGrailQuest任务KnightRoundTable那么这个名字定义 embarkOnQuest任务开始
进口 365bet地区 Spring BeanBuilder

定义bbBeanBuilder BB豆abstractBean领导者"兰斯洛"
    }
    ...
}

在这里,我们定义了一个具有领导值为的属性兰斯洛要使用抽象bean,请将其设置为子bean的父对象

bb豆任务HolyGrailQuest骑士KnightOfTheRoundTable"卡米洛特"Bean Bean父abstractBean任务ref'寻求')
    }
}
使用父bean时,必须先设置bean的父属性,然后再设置bean上的任何其他属性。

如果您想要一个具有指定您可以这样做

进口 365bet地区 Spring BeanBuilder

定义bbBeanBuilder BB豆abstractBean KnightOfTheRoundTable豆Bean'抽象' = 真正领导"兰斯洛"任务HolyGrailQuest骑士"卡米洛特"bean bean父对象abstractBean任务quest

在这个例子中,我们创建一个类型为抽象的bean圆桌骑士并使用bean参数将其设置为抽象。稍后,我们定义一个没有定义但继承来自父bean

使用Spring命名空间

由于Spring的Spring用户可以更轻松地通过XML名称空间访问关键功能,因此可以通过以下语法在BeanBuilder中使用Spring名称空间来声明它:

xmlns语境:"http www springframework组织架构上下文"

然后调用与Spring名称空间标签名称及其关联属性匹配的方法

语境'组件扫描'('基本包装': "我的公司域名")

您可以使用Spring命名空间执行一些有用的操作,例如查找JNDI资源

xmlnsJEE:"http www springframework组织架构jee"JEE'jndi查找'(ID: "数据源", 'jndi名称': "java comp env myDataSource")

这个例子将创建一个带有标识符的Spring bean数据源通过在给定的JNDI名称上执行JNDI查找,使用Spring命名空间,您还可以从BeanBuilder完全访问Spring中所有强大的AOP支持。例如,给定这两个类

  {

    整型年龄那么虚空生日年龄
 生日贺卡发件人 {

    清单人民发卡[]

    虚空生日人人人发卡人

您可以定义一个方面,该方面使用切入点检测何时生日方法被称为

xmlns哎呀:"http www springframework组织架构aop"姓名"弗雷德"年龄45BirthdayCardSenderAspect BirthdayCardSender aop配置"代理目标类别": 真正方面ID: "sendBirthdayCard", 参考: "BirthdayCardSenderAspect"方法: "生日",
            切入点: "处决作废人生日和这个人"
        }
    }
}

属性占位符配置

365bet地区365bet地区通过Spring的扩展版本支持属性占位符配置的概念PropertyPlaceholderConfigurer.

在其中定义的设置ConfigSlurper脚本或Java属性文件可用作Spring配置中的占位符值grails应用程序conf春季资源xmlgrails app conf春季资源groovy例如,给定以下条目grails应用配置会议应用程序或外部配置

数据库驱动程序"com mysql jdbc驱动程序"数据库dbname"mysql mydb"

然后,您可以在中指定占位符资源xml使用熟悉的语法如下

<> ID="数据源"
      ="org springframework jdbc数据源DriverManagerDataSource">
    <> 那么="driverClassName">
        数据库驱动程序
    
    <> 那么="网址">
        jdbc数据库dbname
    
 

在中指定占位符资源槽您需要使用单引号

dataSource组织springframework jdbc数据源DriverManagerDataSource driverClassName'数据库驱动程序'网址'jdbc数据库dbname'
}

这会将属性值设置为文字字符串,稍后由Spring的PropertyPlaceholderConfigurer根据配置解析

一个更好的选择资源槽是通过访问属性grails应用变量

dataSource org springframework jdbc datasource DriverManagerDataSource driverClassName grailsApplication配置数据库驱动程序URL"数据库\:${grailsApplication配置数据库dbname}"
}

使用这种方法将保持配置中定义的类型

属性覆盖配置

365bet地区365bet地区支持通过以下方式设置bean属性组态.

您定义一个豆子用bean的名称和它们的值来阻止

豆bookService webServiceURL"http www亚马逊com"
    }
}

通用格式为

<>.<> = <>

Java属性文件中的相同配置为

豆bookService webServiceURLhttp:www.amazon.com

弹簧靴执行器

Spring Boot执行器端点允许您监视和与应用程序交互Spring Boot包含许多内置端点,例如健康端点提供基本的应用程序运行状况信息

365bet地区由于365bet地区,这些端点默认为禁用

您可以在yml应用程序如下

grails应用配置会议应用yml
管理:
  终点:
    默认启用: 真正

脚手架

脚手架使您可以为域类生成一些基本的CRUD接口,包括

  • 必要意见

  • 用于创建读取更新的控制器操作删除CRUD操作

应用程序表达对脚手架插件的依赖性的方法是通过在建立gradle.

依存关系// ...编译"org grails插件脚手架"
        // ...
    }

动态脚手架

开始使用脚手架的最简单方法是通过设置脚手架控制器中特定域类的属性

 BookController {
    静态的脚手架  或任何其他域类,例如Author Publisher
}

通过在启动应用程序时配置此功能,操作和视图将在运行时自动生成。默认情况下,运行时脚手架机制动态实施以下操作

  • 指数

  • 节目

  • 编辑

  • 删除

  • 创建

  • 保存

  • 更新

也将生成一个CRUD接口以访问此打开的http本地主机书在浏览器中

注意定义的旧方法脚手架属性

 BookController {
    静态的脚手架真正
}

365bet地区在365bet地区上不再受支持

如果您希望将域模型保持在Java和映射与休眠您仍然可以使用脚手架,只需导入域类并将其名称设置为脚手架论点

例如,您可以将新操作添加到脚手架控制器

 BookController {

    静态的脚手架

    定义 changeAuthor() {
        定义b获取参数id b作者作者获取参数"作者编号"b保存重定向到脚手架动作重新导向行动节目

您还可以覆盖支架操作

 BookController {

    静态的脚手架

    覆盖脚手架的动作以同时返回作者和书籍
    定义 指数() {
        [bookInstanceList: 清单bookInstanceTotal: 计数authorInstanceList作者名单定义 节目() {
        定义获取参数id日志错误"{}"书book实例书

所有这些就是所谓的动态脚手架,其中CRUD接口在运行时动态生成

默认情况下,脚手架视图中文本区域的大小在CSS中定义,因此添加行和cols属性将无效

此外,标准支架视图还需要以下形式的模型变量:实例列表用于收藏和实例对于单个实例,使用诸如book和book之类的属性是很诱人的,但是这些属性不起作用

静态脚手架

365bet地区365bet地区允许您生成一个控制器,以及用于从命令行创建上述界面的视图。生成控制器类型

grails生成控制器

或生成视图

grails产生视图

或产生一切

grails生成所有

如果您在包中包含域类,或者是从休眠映射类记住要包含标准的软件包名称

grails生成所有com书店Book

自定义生成的视图

意见适应验证约束例如,您只需更改构建器中的约束顺序,即可更改字段在视图中显示的顺序

定义约束标题发布日期

如果您使用以下命令,也可以让生成器生成列表而不是文本输入inList约束

定义约束标题类别inList: ["小说", "非小说", ""发布日期

或者,如果您使用范围对数字的约束

定义约束年龄范围:18..65)
}

使用约束来限制大小也会影响在d视图中可以输入多少个字符

定义约束名称尺寸:0..30)
}

字段插件

365bet地区365bet地区脚手架模板利用了字段插件生成支架视图后,您可以使用标签库由插件提供,请参见字段插件文档详情

<从bookInstanceList生成一个HTML表,仅显示标题和类别列>
<> 采集="bookInstanceList" 属性="标题类别"/>

自定义脚手架模板

365bet地区365bet地区用于生成控制器和视图的模板可以通过以下方式安装:安装模板命令

部署方式

365bet地区365bet地区应用程序可以通过多种方式进行部署,每种方式各有利弊

单机版

grails运行应用

您现在应该已经非常熟悉这种方法,因为它是在开发阶段运行应用程序的最常用方法。嵌入式Tomcat服务器启动了,该服务器从开发源加载Web应用程序,从而允许其对应用程序进行任何更改档案

您可以使用以下命令在生产环境中运行应用程序:

grails prod运行应用

您可以使用bootRunGradle任务下一条命令使用摇篮包装.

gradlew bootRun

您可以指定环境供应365bet地区环境系统属性

gradlew Dgrails env prod bootRun

可运行的WAR或JAR文件

365bet地区在365bet地区或更高版本中进行部署的另一种方法是对可运行的JAR或WAR文件使用新的支持。套餐:

套餐

或者,您可以使用组装摇篮任务

gradlew组装

然后,您可以使用Java安装程序运行WAR文件或JAR

java Dgrails env prod jar build libs mywar0.1战争或罐子

TAR ZIP发行版

365bet地区注意TAR ZIP发行程序集已从365bet地区中删除

容器部署和Tomcat

365bet地区365bet地区应用程序可以部署到Servlet容器或应用程序服务器

WAR文件

365bet地区在生产中部署365bet地区应用程序的常见方法是通过WAR文件部署到现有Servlet容器中。容器允许将多个应用程序部署在具有不同路径的同一端口上

创建WAR文件就像执行以下操作一样简单战争命令

战争

这将产生一个WAR文件,该文件可以部署到建立库目录

365bet地区请注意,默认情况下,365bet地区会在WAR文件中包括Tomcat的可嵌入版本,以便它可以运行。请参见上一节,如果您部署到其他版本的Tomcat可能会导致问题。如果您不打算使用嵌入式容器,则您可以应该将Tomcat依赖项的范围更改为提供部署到您的生产容器之前建立gradle:

提供"org springframework boot spring boot starter tomcat"

应用服务器

365bet地区理想情况下,您应该能够简单地将365bet地区创建的WAR文件拖放到任何应用程序服务器中,并且应该可以立即工作。365bet地区Gryll的网站365bet地区包含经过365bet地区测试的应用程序服务器列表,以及使365bet地区 WAR文件正常工作所需的任何其他步骤

部署配置任务

设置HTTPS和SSL证书以进行独立部署

要配置SSL证书并侦听HTTPS端口而不是HTTP,请将以下属性添加到yml应用程序:

服务器:
    港口: 8443                                             #监听的端口:
        已启用: 真正                                      #在服务器端口密钥上激活HTTPS模式商店:          #是先生/等等/tomcat密钥库tomcat密钥库密钥库密码:       #例如变更键别名:                         #e tomcat键密码: <>您的密钥库密码

这些设置控制用于生产部署的嵌入式Tomcat容器。另外,可以在命令行上指定属性。Dserver ssl已启用true Dserver ssl密钥库到密钥库的路径.

不支持通过应用程序属性同时配置HTTP和HTTPS连接器如果要同时拥有两者,则需要以编程方式配置它们中的一个。有关如何执行此操作的更多信息,请参见下面的指南

还有其他相关设置进一步参考

365bet地区为365bet地区做贡献

365bet地区365bet地区是一个具有活跃社区的开源项目,我们在很大程度上依赖于该社区来帮助使365bet地区变得更好。因此,人们可以通过多种方式为365bet地区做出贡献。编写有用的插件并使其公开可用在本章中,我们将介绍其他一些选择

在Github的问题跟踪器中报告问题

365bet地区365bet地区使用Github跟踪核心框架同样,其文档也有一个单独的跟踪器如果您发现了错误或希望看到添加的特定功能,那么这些都是开始的地方。您将需要创建一个免费的github帐户,以便在其中任何一个中提交问题或对现有问题发表评论

365bet地区提交问题时,请提供尽可能多的信息,如果出现错误,请确保您解释了所使用的Groovy 365bet地区版本和各种插件。其他环境详细信息操作系统版本JDK Gradle等也应包括在内也很可能出现问题如果您将可复制的示例应用程序上载到github存储库并在问题中提供链接,则需要处理

审查问题

github中有很多旧问题,其中一些可能不再有效。核心团队无法单独追踪这些问题,因此,您可以做出的一个非常简单的贡献就是偶尔验证一两个问题

哪些问题需要验证问题追踪器将显示所有尚未解决的问题

验证问题后,只需添加一条简短注释,说明发现的内容,请务必提及您的环境详细信息和grails版本

从源构建并运行测试

如果您有兴趣为grails的任何部分提供修补程序和功能,则必须学习如何掌握项目的源代码,并使用自己的应用程序对其进行测试,然后再开始确保

  • JDK或以上

  • git客户端

365bet地区一旦安装了所有必备软件包,下一步就是下载365bet地区源代码,该源代码托管在的GitHub在其拥有的几个存储库中365bet地区 GitHub用户这是克隆您感兴趣的存储库的简单案例,例如,使核心框架运行

去克隆http:github com grails grails核心git

365bet地区这将在当前工作目录中创建一个grails核心目录,其中包含所有项目源文件。下一步是从源代码中获取365bet地区安装。

365bet地区创建365bet地区安装

如果您查看项目结构,将会发现它看起来不太像一个标准网格首页安装,但是将其变成一个非常简单,只需从项目的根目录运行

./gradlew安装

365bet地区这将获取365bet地区所需的所有标准依赖项,然后构建一个网格首页365bet地区安装请注意,此目标跳过了广泛的365bet地区测试类集合,这可能需要一些时间才能完成

上述命令完成后,只需设置网格首页环境变量添加到checkout目录,并将bin目录添加到您的路径。下次键入时运行您的命令将使用您刚刚构建的版本

如果您正在使用开发人员然后也可以通过以下方式将此文件用于此本地安装

sdk install grails dev到grails核心的路径

您还需要将本地安装发布到本地Maven

Gradlew pTML

现在,您将在本地拥有一个开发版本,可用于测试功能

运行测试套件

运行全套测试所需要做的就是

./Gradlew测试

这将花费一些时间,因此请考虑使用命令行运行单个测试,例如,运行测试规范BinaryPluginSpec只需执行以下命令

./gradlew grails核心测试测试BinaryPluginSpec

请注意,您需要指定测试用例所在的子项目,因为顶级测试目标将无法正常工作

在IntelliJ IDEA中进行开发

您需要运行以下gradle任务

./gradlew的想法

然后打开在IDEA Simple中生成的项目文件

在STS Eclipse中开发

您需要运行以下gradle任务

./gradlew cleanEclipse月食

在将项目导入STS之前,请执行以下操作

  • 编辑grails脚本classpath并删除该行".

使用“将常规项目导入到工作区”将所有项目导入到STS中。会有一些构建错误。要解决这些问题,请执行以下操作

  • 在GRAILS HOME lib org springsource中将springloaded核心JAR文件添加到grails core的classpath中

  • 从365bet地区插件测试的源路径GRECLIPSE中删除src test groovy

  • 将GRAILS HOME lib javax servlet jsp jsp api jars中的jsp api JAR文件添加到grails web的类路径中

  • 修复grails脚本的源路径添加链接到脚本的源文件夹如果在grails脚本中出现构建错误,请在该目录中执行gradlew cleanEclipse eclipse并再次编辑classpath文件,删除该行如果您无法添加链接的文件夹,请删除grails脚本下的可能的空脚本目录

  • 对整个工作区进行干净的构建

  • 要使用Eclipse GIT scm团队提供者,请在导航中选择“服务器”以外的所有项目,然后右键单击“团队共享”而不是“共享项目”。选择Git,然后选中“使用或在项目的父文件夹中创建存储库”,然后单击“完成”。

  • 从中获取推荐的代码样式设置邮件列表线程最终风格目前尚未决定配置文件xml365bet地区在Window Preferences中将代码样式xml文件导入STS Java代码样式格式化程序Import 365bet地区代码使用空格而不是制表符进行缩进

365bet地区调试365bet地区或365bet地区应用程序

启用调试运行

grails运行应用程序调试jvm

365bet地区默认情况下,365bet地区会分叉JVM以在调试JVM参数使调试器与派生的JVM关联。为了将调试器附加到将派生JVM的构建系统,请使用调试选项

365bet地区调试运行应用程序

365bet地区将补丁提交给365bet地区 Core

如果您想向项目提交补丁,则只需将存储库分叉到GitHub上,而不是直接克隆它即可。然后,您将所做的更改提交给分叉并发送请求请求,以供核心团队成员进行审核

分叉和拉取请求

的好处之一的GitHub是您可以轻松地为项目做出贡献的方式分叉存储库发送请求请求随着你的改变

以下是一些准则,可帮助确保快速处理您的请求,并提供我们所需的信息,它们还将使您的生活更轻松

确保您的叉子是最新的

对过时的来源进行更改不是一个好主意,可能已经有人进行了更改

git pull上游大师

为您的更改创建本地分支

如果创建一个本地分支来进行更改,那么您的生活将大大简化,例如,您在分叉存储库并在本地克隆该分叉后立即执行

git checkout b问题

这将基于master分支创建一个名为issue的新本地分支。当然,您可以根据自己的喜好命名该分支,但一个好主意是引用GitHub的发行号,该变更与每个Pull Request都有自己的分支相关

创建Github问题以进行不重要的更改

365bet地区对于任何不重要的更改,如果尚不存在,则会在github上引发一个问题,这有助于我们跟踪每个新版本的365bet地区中进行了哪些更改

在提交消息中包含github问题ID

这似乎不是特别重要,但是在提交消息中具有github问题ID意味着我们可以稍后查找进行更改的原因,如果与提交无关,则在与该问题相关的任何和所有提交中都包含ID问题,则无需包含问题ID

确保您的货叉再次保持最新状态并重新设置基准

由于核心开发人员必须将您的提交合并到主存储库中,因此如果在发送拉取请求之前在GitHub上的fork是最新的,则将使工作变得更加轻松

假设您已将主存储库设置为称为上游的远程数据库,并且要提交拉取请求,而且所有更改当前都在本地问题分支上,但不在主数据库上。第一步是从主存储库中提取所有更改自您上一次获取和合并以来已添加

git checkout master git pull上游master

这应该可以完成,而不会出现任何问题或冲突。接下来,使用最新的master重新建立本地分支的基础

git checkout问题git rebase master

这样做是为了重新排列提交内容,使您的所有更改都紧跟在master的最新更改之后,然后再将一些卡片添加到卡座的顶部,而不是将它们拖入包装中

将您的分支推送到GitHub并发送请求请求

最后,您必须将所做的更改推送到GitHub上的fork中,否则核心开发人员将无法进行选择

git push起源问题
您不应该将分支合并到fork母版中如果不接受Pull Request,那么您的母版将永远与上游不同步

现在您已经准备好从GitHub用户界面发送拉取请求

说出您的拉取要求是什么

拉取请求可以包含任意数量的提交,并且可能与任何数量的问题有关。在拉取请求消息中,请指定请求所涉及的所有问题的ID。还简要说明您所做的工作,例如I重构了数据绑定器并增加了对自定义数字编辑器的支持修复了xxxx

365bet地区将补丁提交给365bet地区文档

做出简单的改变

用户指南是使用酸辛酸提交修补程序的最简单方法是,只需单击文档各部分右侧的“改进此文档”链接。

这将链接到Github编辑屏幕,您可以在其中进行更改以预览更改并创建请求请求

建立指南

如果您要进行重大更改(例如更改目录的结构等),那么我们建议您构建用户指南。为此,只需从github查看源代码即可。

git clone https github com grails grails doc cd grails doc

可以在以下位置找到源文件src指南目录TOC是在目录中定义的src指南目录yml文件

每个YAML键都指向一个Asciidoc模板。例如,考虑以下YAML

介绍:
  标题: 介绍
  什么是新的:
    标题: 365bet地区365bet地区的新功能
  ...

介绍关键点src zh指南介绍adoc标题键定义在目录中显示的标题,因为什么是新的钥匙嵌套在介绍它指向的关键src zh指南介绍whatsNew adoc嵌套在名为介绍.

基本上使用不久之后文件和目录结构,您可以操作用户指南的结构

要生成文档,请运行publishGuide任务

gradlew publishGuide x apiDocs
在上面的示例中,我们跳过了apiDocs加快指南构建的任务,否则所有Groovydoc文档也将被构建

建立指南后,只需打开构建文档索引html浏览器中的文件以查看您的更改