With the release of Grails 3.1 we can use features, defined in a profile, when we create a new application. Features will add certain dependencies to our Grails project, so we can start quickly. To see which features are available we use the profile-info command. This command lists available features for an application. We can choose the features we want to be included and pass them via the --features command line option of the create-app command.

When we look at the features available for the rest-api profile we see the following list:

$ grails profile-info rest-api ... Provided Features: -------------------- * asset-pipeline - Adds Asset Pipeline to a Grails project * hibernate - Adds GORM for Hibernate to the project * json-views - Adds support for JSON Views to the project * markup-views - Adds support for Markup Views to the project * mongodb - Adds GORM for MongoDB to the project * neo4j - Adds GORM for Neo4j to the project * security - Adds Spring Security REST to the project $

Let's create a new Grails application with the rest-api profile and use the mongodb, json-views and security features:

$ grails create-app --profile rest-api --features mongodb,json-views,security api | Application created at /Users/mrhaki/Projects/mrhaki.com/blog/posts/samples/grails31/api $

When we look at the contents of the generated build.gradle we can see dependencies for the features we have selected:

// File: build.gradle buildscript { ext { grailsVersion = project.grailsVersion } repositories { mavenLocal() maven { url "https://repo.grails.org/grails/core" } } dependencies { classpath "org.grails:grails-gradle-plugin:$grailsVersion" classpath "org.grails.plugins:views-gradle:1.0.0" } } version "0.1" group "api" apply plugin:"eclipse" apply plugin:"idea" apply plugin:"org.grails.grails-web" apply plugin:"org.grails.plugins.views-json" ext { grailsVersion = project.grailsVersion gradleWrapperVersion = project.gradleWrapperVersion } repositories { mavenLocal() maven { url "https://repo.grails.org/grails/core" } } dependencyManagement { imports { mavenBom "org.grails:grails-bom:$grailsVersion" } applyMavenExclusions false } dependencies { compile "org.springframework.boot:spring-boot-starter-logging" compile "org.springframework.boot:spring-boot-autoconfigure" compile "org.grails:grails-core" compile "org.springframework.boot:spring-boot-starter-actuator" compile "org.springframework.boot:spring-boot-starter-tomcat" compile "org.grails:grails-plugin-url-mappings" compile "org.grails:grails-plugin-rest" compile "org.grails:grails-plugin-codecs" compile "org.grails:grails-plugin-interceptors" compile "org.grails:grails-plugin-services" compile "org.grails:grails-plugin-datasource" compile "org.grails:grails-plugin-databinding" compile "org.grails:grails-plugin-async" compile "org.grails:grails-web-boot" compile "org.grails:grails-logging" compile "org.grails.plugins:cache" compile "org.grails.plugins:views-json" compile "org.grails.plugins:mongodb" compile "org.grails:grails-plugin-gsp" compile "org.grails.plugins:spring-security-rest:2.0.0.M1" console "org.grails:grails-console" profile "org.grails.profiles:rest-api:3.1.0" testCompile "org.grails:grails-plugin-testing" testCompile "org.grails.plugins:geb" testCompile "org.grails:grails-datastore-rest-client" testRuntime "org.seleniumhq.selenium:selenium-htmlunit-driver:2.47.1" testRuntime "net.sourceforge.htmlunit:htmlunit:2.18" } task wrapper(type: Wrapper) { gradleVersion = gradleWrapperVersion }

Written with Grails 3.1.