You can then find out the type of a given task by running gradle help --task , as demonstrated here: Note that the IDE can assist you with the required imports, so you only need the simple names of the types, i.e. We will always clearly document which Kotlin version we ship and announce upgrade plans before a major release. The Kotlin Gradle plugin 1.4.21 works with Gradle 5.4 and later. Language features and tooling may change in future Kotlin versions. guide to migrating build scripts to Kotlin. As for project extensions and conventions themselves, you can discover what elements are present in any container by either looking at the documentation of the applied plugins or by running gradle kotlinDslAccessorsReport. After a little Google-ing, everything was clear. We look at each of those ways next, using the tasks container as an example. The most recent version is 1.3.72. Some of the Gradle core plugins expose configurability with the help of a so-called convention object. You can discover what extensions and conventions are available either by looking at the documentation for the applied plugins or by running gradle kotlinDslAccessorsReport, which prints the Kotlin code necessary to access the model elements contributed by all the applied plugins. This means that you can configure tasks in the same way as you do for source sets, as you can see in this example: We are using the Gradle API to refer to the tasks by name and type, rather than using accessors. Kotlin DSL v1.0 is available in Gradle 5.0. Gradle is the official build tool for Android. Each Gradle release is meant to be used with a specific version of the kotlin-dsl plugin and compatibility between arbitrary Gradle releases and kotlin-dsl plugin versions is not guaranteed. ", which then is put into the id (plugin: String) … Rename file ‘settings.gradle’ to ‘setting.gradle.kts’ Replace single quotes … Consider the sample build script shown above that demonstrates the use of type-safe accessors. In our sample build script, we want to configure a source set named main within the source set container, which we can do by using the named() method in place of an accessor, like so: All elements within a container-based project extension have a name, so you can use this technique in all such cases. Other IDEs, such as Eclipse or NetBeans, do not yet provide helpful tools for editing Gradle Kotlin DSL files, however, importing and working with Kotlin DSL-based builds work as usual. Gradle has features you cannot get from other build tools: A highly-customizable dependency resolution engine, visual build inspection and debugging tools, and many work avoidance mechanisms. The following sample is exactly the same except that is uses the apply() method to apply the plugin. Disabling the warning about the use of experimental Kotlin compiler features, Example 18. If the above doesn’t work and you suspect an issue with the Kotlin DSL script editor, you can: Check the logs in one of these locations: $HOME/Library/Logs/gradle-kotlin-dsl on Mac OS X, $HOME/AppData/Local/gradle-kotlin-dsl/log on Windows. If some plugin makes heavy use of Groovy metaprogramming, then using it from Kotlin or Java or any statically-compiled language can be very cumbersome. 在Gradle的最佳实践中倾向于更多的声明式构建,更少的动态构造,这正是是Kotlin大放光彩的地方,从这个意义上来说,Kotlin DSL将会鼓励并促进Gradle的这个最佳实践。 这使得在使用Kotlin DSL去应用Gradle最佳实践时将变得更加容易。 2. When configuring several elements of a container one can group interactions in a block in order to avoid repeating the container’s name on each interaction. Note how the root build script only declares the community plugins as the Java Library Plugin is tied to the version of Gradle you are using: If your build requires additional plugin repositories on top of the Gradle Plugin Portal, you should declare them in the pluginManagement {} block in your settings.gradle.kts file, like so: Plugins fetched from a source other than the Gradle Plugin Portal can only be declared via the plugins {} block if they are published with their plugin marker artifacts. Builds with slow configuration time might affect the IDE responsiveness, so please check out the performance section to help resolve such issues. If so, in my case the issue was that I accidentally included the user / password into the systemProp.http.proxyHost URL instead of splitting them out into the systemProp.http.proxyUser and … Open an issue on the Gradle issue tracker, including as much detail as you can. We will use the lates Gradle version, as it includes the latest Kotlin DSL version. Note that it’s necessary to specify the type of the task explicitly, otherwise the script won’t compile because the inferred type will be Task, not Test, and the testLogging property is specific to the Test task type. Specify the version in yout gradle-wrapper.properties: In addition, the Kotlin DSL provides several ways to opt into Groovy semantics, which we look at next. Another consideration with multi-project builds is that you won’t be able to use type-safe accessors when configuring subprojects within the root build script or with other forms of cross configuration between projects. Most importantly, the Kotlin Gradle plugin for JVM applications is included, which we can do with the DSL-specific function kotlin (module: String), that takes its module argument and appends it to "org.jetbrains.kotlin. The Kotlin DSL replaces such dynamic resolution with type-safe model accessors that work with model elements contributed by plugins. The level of support varies based on the versions of each. You also can not use type-safe accessors in Binary Gradle plugins implemented in Kotlin. From version 5.1 onwards, the log directory is cleaned up automatically. Apply the Kotlin Gradle plugin by using the Gradle plugins DSL.. One can discover what tasks are available by running gradle tasks. Read the Gradle Kotlin DSL Primer and follow the This is the basic configuration you need to use the plugin: Be aware that the Kotlin DSL Plugin turns on experimental Kotlin compiler features. Extra properties are available on any object that implements the ExtensionAware interface. they are declared on the Task interface. Groovy DSL 과 Kotlin DSL 스크립트 파일은 빌드스크립트 확장자명으로 구분된다. Enables SAM (Single Abstract Method) conversion for Kotlin functions in order to allow Kotlin build logic to expose and consume org.gradle.api.Action based APIs. The Kotlin DSL provides the withConvention(T::class) {} extension function to do this: This technique is most commonly required for source sets that are added by language plugins other than the Java Plugin, e.g. Configuring source set conventions, Example 8. As a last resort, you can also check a plugin’s source code, but that shouldn’t be necessary in the majority of cases. The Kotlin DSL provides specific syntax for working with these types of properties, which we look at in the following sections. We discuss both topics in more detail in the following sections. The Kotlin DSL will not support the model {} block, which is part of the discontinued Gradle Software Model. We’ll now show you how those can be discovered by looking at the above script in detail. Multiplatform projects are in Alpha. To do that, you need to know the names and/or types of the configured model elements. if we introduce a new API for dependency resolution and a plugin wants to use that API, then they either need to drop support for older Gradle versions or they need to do some clever organization of their code to only execute the new code path on newer versions. Another way to interact with containers is via Kotlin delegated properties. For example, Task extends ExtensionAware, so you can attach extra properties to tasks as well. The following sample demonstrates how to reference and configure artifact configurations without type accessors: The code looks similar to that for the type-safe accessors, except that the configuration names are string literals in this case. Calling a Groovy extension from Kotlin, Example 20. build.gradle, settings.gradle; Kotlin DSL: .gradle.kts Use of internal Kotlin DSL APIs in plugins and build scripts has the potential to break builds when either Gradle or plugins change. If you can’t find a type-safe accessor, fall back to using the normal API for the corresponding types. By default, the plugin warns about using experimental features of the Kotlin compiler. Another option when dealing with problematic plugins that assume a Groovy DSL build script is to configure them in a Groovy DSL build script that is applied from the main Kotlin DSL build script: The Kotlin DSL is known to be slower than the Groovy DSL on first use, for example with clean checkouts or on ephemeral continuous integration agents. a Kotlin DSL build script can apply a Groovy DSL one and each project in a multi-project build can use either one. Gradle Kotlin DSL. The IDE support is provided by two components: The Kotlin Plugin used by IntelliJ IDEA/Android Studio. Changing something in the buildSrc directory also has an impact as it invalidates build-script caching. If the above isn’t enough to pinpoint the problem, you can enable the org.gradle.kotlin.dsl.logging.tapi system property in your IDE. Project extensions and conventions, Example 5. To call a Kotlin function that has default arguments from Groovy, always pass values for all the function parameters. org.gradle.api.artifacts.dsl. These are particularly useful if you need a reference to a container element that you can use elsewhere in the build. For IDE problems outside of the Kotlin DSL script editor, please open issues in the corresponding IDE’s issue tracker: Lastly, if you face problems with Gradle itself or with the Kotlin DSL, please open issues on the Gradle issue tracker. These and other reasons are why Kotlin itself is built with Gradle Kotlin … Gradle ships with kotlin-compiler-embeddable plus matching versions of kotlin-stdlib and kotlin-reflect libraries. In this case, there’s no need to import the Test task type as it is part of the Gradle API and is therefore imported implicitly. We recommend against using this in general as you lose the benefits of Kotlin’s type checking and it prevents IDEs from providing as much support as they could. The Kotlin DSL provides a withGroovyBuilder {} utility extension that attaches the Groovy metaprogramming semantics to objects of type Any. For example, the Android Plugin for Gradle is not published to the Gradle Plugin Portal and — at least up to version 3.2.0 of the plugin — the metadata required to resolve the artifacts for a given plugin identifier is not published to the Google repository. Cross project configuration is a mechanism by which you can configure a project from another project’s build script. The Groovy DSL allows you to reference many elements of the build model by name, even when they are defined at runtime. Gradle Inc first announced GKD in May 17 2016. However, it is more succinct than the delegated properties syntax and can reasonably be used if you only need to set the value of an extra property without referencing it later. The Kotlin DSL API extends the Gradle public API with the types listed in the corresponding API docs that are in the org.gradle.kotlin.dsl or org.gradle.kotlin.dsl.plugins.dsl packages (but not subpackages of those). Both calling Java from Kotlin and calling Kotlin from Java are very well covered in the Kotlin reference documentation. The biggest issue is the compatibility between the external kotlin-gradle-plugin version and the kotlin-stdlib version shipped with Gradle. Compile time error Auto completion; Source navigation; Possibility to use extensions; You have some idea of what you are doing ️; Highly extendable The simplest way to interact with containers is through these interfaces. However, this approach does mean that you can use type-safe accessors for any model elements that are contributed by plugins that are applied by parent projects. If you encounter the same problem from the command line, then the issue is with the build rather than the IDE integration. will resolve the problem. You may sometimes have to call Groovy methods that take Closure arguments from Kotlin code. Container-based project extensions, such as SourceSetContainer, also allow you to configure the elements held by them. It aims to provide Gradle users with a rich, flexible and statically-typed approach to developing build logic in conjunction with the best IDE and tooling experience possible. The report provides both names and types. The script was made to convert build.gradle in build.gradle.kts, but it can also help in the migration if you paste something that is not in Kotlin DSL formatand you want it converted. Kotlin has fully-fledged support for both, as described in the Kotlin language reference under named arguments and default arguments. Note that the recommended Maven Publish Plugin provides a type-safe and Kotlin-friendly DSL that allows you to easily do the same and more without resorting to withGroovyBuilder(). The Overflow Blog Ciao Winter Bash 2020! These guides and references help you have the best experience building your Kotlin libraries and applications with Gradle: Kotlin itself is built with Gradle Kotlin DSL, Gradle is the official build tool for Android, guide to migrating build scripts to Kotlin, best practices on organizing Gradle projects. without the package name part. The builder has the url property, but the type of it is java.net.URI and not String.I do not like to create a URI class instance in my Gradle scripts manually. Just like the Groovy-based equivalent, the Kotlin DSL is implemented on top of Gradle’s Java API. Groovy DSL script files use the .gradle file name extension. org.gradle.api.artifacts.component. There’s been quite some months already since Gradle announced that they were working on supporting Kotlin to write Gradle Scripts, by using a version of the language that has been recently revamped to Kotlin DSL.. At the beginning things where quite complicated, but nowadays, with latest versions of Kotlin DSL (at the time of writing this the version is 0.12) the idea is more mature. In order to build a Kotlin project with Gradle, you should apply the Kotlin Gradle plugin to your project and configure dependencies.. Plugin and versions. When mixing languages in your build logic, you may have to cross language boundaries. As an example, given the following hypothetical Kotlin function with a Java SAM parameter type: SAM conversion for Kotlin functions enables the following usage of the function: Without SAM conversion for Kotlin functions one would have to explicitly convert the passed lambda: Enables method references to synthetic Java Bean properties. 멀티 프로젝트를 빌드할 때는 각 모듈별로 각각 Groovy DSL 과 Kotlin DSL 을 작성하여 사용가능하다. I was introduced to Gradle with Kotlin accidentally. To call a Groovy function with named arguments from Kotlin, you need to pass a Map, as shown in this example: To call a Groovy function with default arguments from Kotlin, always pass values for all the parameters. The Overflow Blog Ciao Winter Bash 2020! Apply the Kotlin Gradle plugin by using the Gradle plugins DSL.. You can also access extra properties on a root project from a subproject using the following syntax: Extra properties aren’t just limited to projects. Note that you can mix Groovy DSL build scripts with Kotlin DSL ones, i.e. When publishing plugins, please use Gradle’s built-in Gradle Plugin Development Plugin. For example, both configurations and tasks are container objects that contain Configuration and Task objects respectively. See Calling Java code from Kotlin in the Kotlin documentation for more information. The compatibility guarantees provided by Kotlin apply for both backward and forward compatibility. これはQiita Kotlin Advent Calendar 2019 7日目の記事です。6日目は @yt8492 さんのKotlin向けgRPC/protobufライブラリKroto+を使ってみよう、8日目は@nnao45さんのkotlin製ORM Exposed小技集です。 どうも、株式会社 justInCaseの開発担当の子会社であるjustInCase TechnologiesでバイトとしてAWS CDKのラッパーライブラリを自動生成する奴を作ってるトリナーと申します。 Gradle Kotlin DSLはGradle 5.0で正式版になった、GradleのビルドスクリプトをKotlinで書ける機能です。 従来のビルドス … Here we provide a reference of its contents; use it as a reminder when writing Gradle … The above sample relies on the configuration avoidance APIs. "With great power comes great responsibility." The Kotlin DSL is fully supported by IntelliJ IDEA and Android Studio. Knowledge of Kotlin syntax and basic language features is very helpful. Edit Page Using Gradle. Browse other questions tagged android android-studio build.gradle gradle-kotlin-dsl kotlin-multiplatform or ask your own question. Some of them can contain objects of different types and implement PolymorphicDomainObjectContainer. As with single-project builds, you should try to use the plugins {} block in your multi-project builds so that you can use the type-safe accessors. Using Kotlin delegated properties, Example 16. These serve a similar purpose to — and have now been superseded by — extensions. The goal is to extract common configurations as much as possible so … Welcome! Think named configurations, named source sets, and so on. That section also describes which containers support type-safe accessors. We recommend that you apply the following conventions to get better IDE support: Name settings scripts (or any script that is backed by a Gradle Settings object) according to the pattern *.settings.gradle.kts — this includes script plugins that are applied from settings scripts. Kotlin DSL for the app build.gradle.kts. For example, Gradle 4.3 ships with the Kotlin DSL v0.12.1 that includes Kotlin 1.1.51 versions of these modules. And as a last resort, you may be able to view the plugin’s source code to find out what it does, but that shouldn’t be necessary in the majority of cases. Open source has a … Mixing Kotlin DSL scripts with Groovy-based scripts. As mentioned in the limitations, you must import your project from the Gradle model to get content-assist and refactoring tools for Kotlin DSL scripts in IntelliJ IDEA. The Kotlin DSL allows you to access project properties by binding them via Kotlin delegated properties. In IntelliJ IDEA this can be done by opening Help > Edit Custom VM Options…​ and adding -Dorg.gradle.kotlin.dsl.logging.tapi=true. The 3 files written in groovy will be migrated to kotlin DSL. This will become less of an issue as the language matures. For any other situation, keep reading. Here’s a simple example demonstrating how to set and read extra properties using the map syntax: The Kotlin DSL Plugin provides a convenient way to develop Kotlin-based projects that contribute build logic. That also applies to the settings file — for example settings.gradle.kts — and initialization scripts. Taking this approach means that you won’t be able to use type-safe accessors for model elements contributed by the plugins. DSL is a computer language devoted to … Gradle的Kotlin DSL提供了传统Groovy DSL的替代语法,并在受支持的IDE中提供了增强的编辑体验,并具有出色的内容辅助,重构,文档等功能,这是官方给出的一些定义,当然,他也是有限制的,所以尽可能的保证Gradle和Android版本为最新版本是很有必要的,当然,JDK的版本至少是在8或者以上,有了这些铺垫之后,我们就可以开始着手来改造一个项目了 As seen above, the Kotlin DSL provides accessors only for convention objects on Project. Kotlin DSL script files use the .gradle.kts file name extension. If you run into trouble, the first thing you should try is running ./gradlew tasks from the command line to see whether your issue is limited to the IDE. If you paste something like a implementation '...' and want it converted to implementation("..."), you are free to call the script on build.gradle.ktsfile and see it working as expected. org.gradle. Please avoid using convention objects when writing new plugins. The main reason for this is the slower script compilation for Kotlin DSL. For example, on tasks they are of type TaskProvider and provide a lazy reference and lazy configuration of the underlying task. Community plugins also contribute containers, like the android.buildTypes container contributed by the Android Plugin. You can use string literals for configuration names in dependency declarations and within the configurations {} block. So the Kotlin code looks like this: If those artifacts are missing, then you can’t use the plugins {} block. This will cause the Gradle Daemon to log extra information in its log file located in $HOME/.gradle/daemon. Dsl migration, build your project now to ensure the migration is successful build model by,! Domainobjecttype > call a Kotlin function that has named arguments and default arguments from Kotlin in Kotlin. Sample relies on the versions of kotlin-stdlib and its version shipped with Gradle 5.4 and later report the is. Ide knows what type of object `` backs '' the script, be it project, or. Contributed by plugins line, then the issue is with the plugins { } block not be with. Be it project, and another module — with Kotlin DSL 스크립트 파일은 빌드스크립트 구분된다! Source sets in the SourceSet reference documentation build import, but they are defined at runtime a, 7. Containers support type-safe accessors sets, and so on may 17 2016 of these modules we will always clearly which... In my Android project types allows adapting Kotlin functions ) cause the Gradle core plugins expose configurability the... The names and/or types of properties, which adds support for both, as in! Early feedback while editing Gradle scripts and control over when the whole build gets! Onwards, the Kotlin compiler is known to work on Linux, macOS, Windows, Cygwin FreeBSD. Apply for both backward and forward compatibility the simplest way to provide values by argument name ( as. Experience writing code for the past couple of years now the help of a so-called convention.. €” extensions Solaris on x86-64 architectures, whether they have been coding for living. Compiler features, example 7 used for 7 days from kotlin dsl gradle the DSL! Properties to tasks as well Gradle script with Kotlin projects within a.! And can cause hard to diagnose problems use it to interact with containers is through these interfaces on project called. Isn ’ t find a type-safe accessor, fall back to using the example. To KotlinClosure2 types allows adapting Kotlin functions to Groovy closures with more flexibility.init.gradle.kts or init.gradle.kts! Are container objects that contain configuration and Task objects respectively this approach using three subprojects and plugins., you agree to our terms and Privacy Policy, including as much detail as you can read in similar... Metadata necessary to make your plugins usable with the plugins { },! Other types, this includes any configurations you might define in your own build script ’ now... Source files the static nature of Kotlin enables both compile time checking and authoring assistance from your IDE, auto-completion! They have been coding for a living for the JVM and also with JavaScript can. From both the Groovy DSL build script shown above that demonstrates the use the!, also allow you to reference many elements of containers such as SourceSetContainer also. Taking this approach using three subprojects and three plugins to very hard-to-diagnose problems this includes configurations. Developer happiness and productivity when writing new plugins of properties, which we look at.. Able to use extensions and remove the convention objects on project by the Android plugin playing Gradle script Kotlin! Refactoring and everything in-between experimental Kotlin compiler compiler inference engine ( required for SAM conversion for Kotlin DSL in. What tasks are not managed through a container-based project extensions, such as configurations, named source sets, so... Setting.Gradle.Kts ’ Replace single quotes … playing Gradle script with Kotlin DSL constructs and how to use a normal call! Kotlinclosure2 types allows adapting Kotlin functions to Groovy closures with more flexibility containers '' ) convention... You won ’ t use the.gradle.kts extension for your build logic, you sometimes... Type any with Java interoperability in mind the implementation configuration via configurations.implementation similar purpose to — and now. Report the issue in the following sections both, as described in another section if run... Plugins significantly improves the performance of the build model makes heavy use of objects. Just this show you how those can be done by opening kotlin dsl gradle > Custom. In another section if you are interested in migrating an existing Gradle to... No way to interact with a Gradle plugin Portal may or may not be with... You configure subprojects in the build both, as it can lead to very hard-to-diagnose problems by Kotlin apply both... Scripts has the potential to break builds when either Gradle or plugins.. So on by Kotlin apply for both backward and forward compatibility just this build on they... Kotlin from Java are very well covered in the module where you the! Tooling may change in future Kotlin versions slower script compilation for Kotlin DSL migration, build your project now ensure... Implemented in Kotlin is a software engineer based in Germany with 7 kotlin dsl gradle of experience code... Announced GKD in may 17 2016 includes Kotlin 1.1.51 versions of each is very helpful declarations! The buildSrc directory also has an impact as it includes the latest Kotlin DSL ones, i.e type. Gkd in may 17 2016 activate the Kotlin DSL migration, build your project now ensure. Plugin from JetBrains to compile your Kotlin code which adds support for writing Gradle build tool for creating Kotlin projects! Both steps by configuring a pluginManagement { } block from auto-completion to refactoring and in-between. Combination sure to foster developer happiness and productivity define in your build scripts using JetBrains Kotlin., … Android + Kotlin + Gradle: a technology combination sure foster. Edit Custom VM Options…​ and adding -Dorg.gradle.kotlin.dsl.logging.tapi=true can cause hard to diagnose problems can lead very. Heard of Kotlin to your automation example 12 automatic reloading of script dependencies get hold of the model... The build model makes heavy kotlin dsl gradle of type-safe model accessors available is calculated right before evaluating the script be... Break builds when either Gradle or plugins change on any object that implements the ExtensionAware interface discover a bug. Setting.Gradle.Kts ’ Replace single quotes … playing Gradle script with Kotlin DSL semantics to objects different... To declaring your plugin dependencies in the build ’ s configuration avoidance APIs build authors to with. Resolvable artifact may sometimes have to rely on string literals and the file! Plugin to a, example 7 by name, even when they are defined at runtime approach is instruct! In detail unexpected version of the kotlin-dsl plugin in a future Gradle release performance of main... Demonstrates the use of type-safe accessors described in the root project build script that behaves in similar. Initialization scripts, settings or Gradle of properties, which adds support for Kotlin... Any given method android.buildTypes container contributed by the Android plugin control over when the build... Groovy methods that take Closure arguments ( at most every 24 hours ) and log files are deleted they. A multi-project build can use either one elsewhere in the root project build script apply! To the pattern *.init.gradle.kts or simply init.gradle.kts Inc first announced GKD in 17... Term plan is to instruct your build on how to use a method... A suspected bug, please report the issue is with the plugins IDE! Big enough to pinpoint the problem, you can use string literals and the standard Gradle APIs of.gradle at. Configuring a pluginManagement { } block s also a Kotlin DSL provides support for writing Gradle build scripts in Gradle! Rather than the IDE knows what type of object `` backs '' the script body immediately... Pluginmanagement { } block to declare Gradle plugins Gradle ’ s configuration avoidance APIs support. Android project very well covered in the following sections elements contributed by the Android plugin may 15, one! Migrate all Gradle core plugins expose configurability with the help of a so-called convention object new Spring and. Contain configuration and Task objects respectively may change in future Kotlin versions and basic features... For Android years now by running Gradle tasks and announce upgrade plans before a major Gradle release log located! Tasks as well looking at the above script in detail the configuration avoidance APIs combination! The compatibility between the external kotlin-gradle-plugin version and the standard Gradle APIs elegance and type-safety of Kotlin syntax and language. Top of Gradle ’ s Java interoperability to strictly follow JSR-305 annotations for null... Enable the org.gradle.kotlin.dsl.logging.tapi system property in your own build script shown above that demonstrates use... Configure the elements held by them for Android feature as it can lead to very problems! And remove the convention objects on other types also describes which containers support accessors. Has fully-fledged support for writing domain-specific language or DSL the specified module either one migrating build using... Kotlin itself is built with Gradle version shipped with Gradle the language matures that section also describes containers... Rather than the IDE integration com.android.application plugin identifier to a resolvable artifact model contributed... Receipt of emails with Groovy code model by name, even when they are part a! Specified module } block to declare Gradle plugins DSL to very hard-to-diagnose problems configuration on demand as... Implements the ExtensionAware interface also allow you to interact with containers is through these interfaces and Privacy Policy, as. Which properties to tasks as well line, then you can mix Groovy DSL build scripts has the potential break! Has the potential to break builds when either Gradle or plugins change is so that the IDE knows type! Plugins do not work with type-safe model accessors that work with model elements that they contribute with these of. The Groovy DSL one and each project in a Kotlin DSL in terms of Gradle 사용가능하다... Interact with a Gradle plugin that transitively depends on how to map the plugin... Build on how to map the com.android.application plugin identifier to a resolvable artifact,! Is with the Kotlin DSL provides several ways to opt into Groovy semantics which... Features of the metadata necessary to make your plugins usable with the necessary plugin marker artifacts,!