Несколько дней назад 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 вручную. init — это новая папка в Grails 3. Она содержит Bootstrap.groovy (тот же контент, что и в предыдущих версиях Grails) и новый основной класс Application (мы рассмотрим это в разделе Spring Boot). Структура папки src была изменена в соответствии с соглашениями Gradle. Дополнительные файлы Java и 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 , AsyncController , RestResponder , Controller .
Отличительной особенностью 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.