Статьи

Что нового в Grails 3

Несколько дней назад  Grails 3.0 был официально выпущен . Grails теперь основан на  Spring Boot , система сборки изменена с Gant на  Gradle,  и значительная часть фреймворка была переписана. В этой статье мы рассмотрим все основные изменения, внесенные в Grails 3.

Обновленная файловая структура.
Мы начнем со скриншота, который показывает свежий проект Grails 3, созданный из командной строки Grails с использованием

grails create-app hello

Первые две папки ( build  и  gradle ) относятся к Gradle, новой системе сборки в Grails 3. Как следует из названия,  build  — это каталог, в котором находятся файлы, связанные со сборкой, такие как скомпилированные классы и собранные пакеты.  Gradle  каталог содержит Gradle Wrapper ,  который позволяет построить проект без локального Gradle установки.

Содержимое   папки conf также было изменено. Формат по умолчанию для файлов конфигурации теперь  YAML . Если вы предпочитаете писать свою конфигурацию в Groovy, вы все равно можете создать   файл конфигурации grails-app / conf / application.groovy вручную.
Logback теперь является поставщиком журналов по умолчанию. Конфигурация регистрации (ранее входившая в  Config.groovy ) была перемещена в conf / logback.groovy .
Обратите внимание, что   папка conf больше не является исходной папкой.

init  — это новая папка в Grails 3. Она содержит  Bootstrap.groovy  (тот же контент, что и в предыдущих версиях Grails) и новый основной класс Application (мы рассмотрим это в разделе Spring Boot).

Структура   папки src была изменена в соответствии с соглашениями Gradle. Дополнительные файлы Java и Groovy теперь находятся в:
src / main / java
src / main / groovy
src / test / java
src / test / groovy

build.gradle и  gradle.properties  содержат конфигурацию сборки. BuildConfig.groovy  из предыдущих версий Grails больше не существует.

Spring 4.1 и Spring Boot
Spring Boot — новая основа для Grails. По словам Грэма Роше, Grails 3  — это не что иное, как переписанный текст поверх Spring Boot .

Как и приложения Spring Boot, проекты Grails 3 поставляются с классом Application, который имеет стандартный метод main (). Это означает, что вы можете запустить приложение Grails 3, просто запустив основной класс из вашей IDE.

Класс Application по умолчанию выглядит следующим образом:

class Application extends GrailsAutoConfiguration {
  static void main(String[] args) {
    GrailsApp.run(Application)
  }
}

Обратите внимание, что файл war, который вы получаете при упаковке приложения, теперь может быть выполнен с использованием java -jarcommand:

java -jar build / libs / myApplication-0.1.war.

Этот метод запускает метод main, который запускает приложение с использованием встроенного сервера Tomcat. Конечно, вы все равно можете развернуть файл war на сервере приложений по вашему выбору, как в предыдущих версиях Grails.

Класс Application действует как  класс конфигурации Spring . Таким образом, мы можем использовать аннотацию Spring @Bean для определения пользовательских bean-компонентов. Такие методы, как onStartup () или onShutdown () могут быть перезаписаны, если вы хотите выполнить пользовательский код при определенных событиях приложения.

class Application extends GrailsAutoConfiguration {
 
  ...
  
  @Bean
  MyBean myBeanId() {
    return new MyBeanImpl();
  }
  
  @Override
  void onStartup(Map<String, Object> event) {
    super.onStartup(event)
   // custom startup code..
  }
} 


Компоненты Traits In Grails, такие как Controllers или Domain, всегда имели некоторые  магические  функции. Например, в контроллерах вы можете использовать такие методы, как render (), redirect () или getParams () без создания подкласса другого класса. В Grails 3 эти функции были переписаны для использования T- raits, представленных в Groovy 2.3
Определенные черты автоматически присоединяются к контроллерам, службам, библиотекам тегов и т. Д., Чтобы сделать доступными методы инфраструктуры. Например, Контроллер автоматически получает следующие черты:  TagLibraryInvoker , AsyncControllerRestResponderController .

Отличительной особенностью Traits является то, что вы можете легко добавлять их в свои классы.
Например: предположим, что вы хотите получить доступ к объектам request и params вне Grails Controller. Все, что вам нужно сделать сейчас, это добавить черту WebAttributes в ваш класс:

class MyCustomComponent implements WebAttributes {
 
  public MyCustomComponent() {
 
    // make use of WebAttributes methods like getWebRequest() or getParams()
    println "base url: " + webRequest.baseUrl
    println "params: " + params
    ...
  }
}

Перехватчики
Grails 3 представил автономные перехватчики. Перехватчики могут перехватывать входящие запросы для выполнения общих задач (например, ведение журнала, аутентификация и т. Д.).

Новый Interceptor может быть создан с помощью команды create-interceptor:

grails create-interceptor MyInterceptor

Недавно созданный Interceptor выглядит следующим образом:

class MyInterceptor {
 
  boolean before() { 
    // executed before a request is processed by a controller
    true 
  }
 
  boolean after() {
    // executed after a request is processed by a controller
    true
  }
 
  void afterView() { 
    // executed after the view has been rendered
  }
 
}

Interceptors replace Filters used by previous Grails versions. Filters still work in Grails 3 for backwards compatibility. However, they are considered deprecated now.

If you are aware of Spring web MVC, you can easily see the similarities to Springs Handler Interceptor

Gradle
As mentioned before, Grails 3 uses Gradle instead of Gant as build system. Gradle is used for tasks like compilation, running tests and packaging the application.
When a Grails command like grails clean is executed, the job is delegated to the corresponding Gradle task (e.g. gradle clean). The Gradle-Wrapper shipped with Grails 3 is used for this.
If you want to use a local installation of Gradle you can execute the Gradle task directly with your own Gradle version. Gradle 2.2 or newer is recommended.

The following table shows Grails commands and their corresponding Gradle tasks:

Grails command  Gradle Task
clean clean
compile classes
package assemble
run-app run
test-app test
war assemble

BuildConfig.groovy from previous Grails versions has been completely replaced by the Gradle configuration (build.gradle). Third party dependencies are now defined in build.gradle:

dependencies {
  compile 'org.grails.plugins:hibernate' 
  compile 'org.grails.plugins:cache' 
  compile 'org.hibernate:hibernate-ehcache'
  runtime 'org.grails.plugins:asset-pipeline' 
  runtime 'org.grails.plugins:scaffolding'
  ...
}

For more details, you can have a look at Dependency Management Guide in the Gradle documentation.

Profiles
Whenever you run the create-app command Grails 3 will use a Profile to create a new app. 
A Profile encapsulates project structure, commands, templates and plugins. By default Grails 3 uses the webProfile, which creates an app like shown in the screenshot above.

To create a project with a different Profile, you can use the —profile parameter:

grails create-app myapp —profile=web-plugin

Grails 3 comes with three different Profiles:

  • web for standard Grails web applications
  • web-plugin for web application plugins
  • web-micro a minimal micro service application

Short summary
Grails 3 comes with major changes. The code basis changed to Spring Boot, Gant was replaced with Gradle, existing features were reimplemented using Traits and new features like Profiles and Interceptors were added.
With all those changes it can become quite challenging to upgrade an existing Grails 2.x application to Grails 3 (all Plugins need to be updated first). If you plan to Upgrade to Grails 3, you should have a look at theGrails 3 upgrade guide