{"id":18020884,"url":"https://github.com/rm3l/datanucleus-gradle-plugin","last_synced_at":"2026-03-07T12:03:38.788Z","repository":{"id":35374454,"uuid":"156130714","full_name":"rm3l/datanucleus-gradle-plugin","owner":"rm3l","description":"Unofficial Gradle Plugin for the DataNucleus JPA/JDO Provider","archived":false,"fork":false,"pushed_at":"2025-06-28T14:19:09.000Z","size":837,"stargazers_count":4,"open_issues_count":53,"forks_count":5,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-06-28T15:31:39.631Z","etag":null,"topics":["datanucleus","enhancement","gradle-plugin","java","javax-persistence","jdo","jpa","jpa-datanucleus","orm","persistence","persistence-unit","weaving"],"latest_commit_sha":null,"homepage":"https://datanucleus-gradle-plugin.rm3l.org/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rm3l.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-11-04T22:20:08.000Z","updated_at":"2023-10-21T09:45:26.000Z","dependencies_parsed_at":"2023-10-11T13:53:08.976Z","dependency_job_id":"e0c65699-0e10-410f-b59b-9bb1d8fcc7f5","html_url":"https://github.com/rm3l/datanucleus-gradle-plugin","commit_stats":null,"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/rm3l/datanucleus-gradle-plugin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rm3l%2Fdatanucleus-gradle-plugin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rm3l%2Fdatanucleus-gradle-plugin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rm3l%2Fdatanucleus-gradle-plugin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rm3l%2Fdatanucleus-gradle-plugin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rm3l","download_url":"https://codeload.github.com/rm3l/datanucleus-gradle-plugin/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rm3l%2Fdatanucleus-gradle-plugin/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30212491,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T09:02:10.694Z","status":"ssl_error","status_checked_at":"2026-03-07T09:02:08.429Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["datanucleus","enhancement","gradle-plugin","java","javax-persistence","jdo","jpa","jpa-datanucleus","orm","persistence","persistence-unit","weaving"],"created_at":"2024-10-30T06:08:09.437Z","updated_at":"2026-03-07T12:03:36.413Z","avatar_url":"https://github.com/rm3l.png","language":"Java","funding_links":["https://paypal.me/rm3l"],"categories":[],"sub_categories":[],"readme":"[![Gradle Plugins Portal](https://img.shields.io/maven-metadata/v/https/plugins.gradle.org/m2/org/rm3l/datanucleus-gradle-plugin/maven-metadata.xml.svg?label=Gradle%20Plugins%20Portal)](https://plugins.gradle.org/plugin/org.rm3l.datanucleus-gradle-plugin)\n\n[![GitHub Workflow](https://github.com/rm3l/datanucleus-gradle-plugin/workflows/Java%20CI/badge.svg)](https://github.com/rm3l/datanucleus-gradle-plugin/actions?query=workflow%3A%22Java+CI%22)\n[![Language grade: Java](https://img.shields.io/lgtm/grade/java/g/rm3l/datanucleus-gradle-plugin.svg?logo=lgtm\u0026logoWidth=18)](https://lgtm.com/projects/g/rm3l/datanucleus-gradle-plugin/context:java)\n[![Code Coverage](https://codecov.io/gh/rm3l/datanucleus-gradle-plugin/branch/master/graph/badge.svg)](https://codecov.io/gh/rm3l/datanucleus-gradle-plugin)\n[![Known Vulnerabilities](https://snyk.io/test/github/rm3l/datanucleus-gradle-plugin/badge.svg?targetFile=buildSrc%2Fbuild.gradle)](https://snyk.io/test/github/rm3l/datanucleus-gradle-plugin?targetFile=buildSrc%2Fbuild.gradle)\n\n[![License](https://img.shields.io/badge/license-MIT-green.svg?style=flat)](https://github.com/rm3l/datanucleus-gradle-plugin/blob/master/LICENSE)\n\n[![GitHub watchers](https://img.shields.io/github/watchers/rm3l/datanucleus-gradle-plugin.svg?style=social\u0026label=Watch)](https://github.com/rm3l/datanucleus-gradle-plugin)\n[![GitHub stars](https://img.shields.io/github/stars/rm3l/datanucleus-gradle-plugin.svg?style=social\u0026label=Star)](https://github.com/rm3l/datanucleus-gradle-plugin)\n[![GitHub forks](https://img.shields.io/github/forks/rm3l/datanucleus-gradle-plugin.svg?style=social\u0026label=Fork)](https://github.com/rm3l/datanucleus-gradle-plugin)\n\n\u003c!-- START doctoc generated TOC please keep comment here to allow auto update --\u003e\n\u003c!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --\u003e\n\n\n- [Getting Started](#getting-started)\n- [Tasks](#tasks)\n  - [Bytecode Enhancement](#bytecode-enhancement)\n  - [SchemaTool](#schematool)\n- [Contribution Guidelines](#contribution-guidelines)\n  - [Source Code Layout](#source-code-layout)\n  - [Building from source](#building-from-source)\n  - [Publishing the plugin](#publishing-the-plugin)\n- [Credits / Inspiration](#credits--inspiration)\n- [Developed by](#developed-by)\n- [License](#license)\n\n\u003c!-- END doctoc generated TOC please keep comment here to allow auto update --\u003e\n\nUnofficial Gradle Plugin for [DataNucleus](http://www.datanucleus.org/) [JPA](https://en.wikipedia.org/wiki/Java_Persistence_API) and [JDO](https://en.wikipedia.org/wiki/Java_Data_Objects) Provider.\n\nThis is a follow-up to a [blog post](https://rm3l.org/datanucleus-jpa-enhancement-with-gradle/) talking about performing build-time enhancement with both DataNucleus and Gradle Ant Tasks.\n\nHeavily inspired by the official DataNucleus Maven Plugin, this one defines a Gradle plugin for introducing DataNucleus specific tasks and capabilities into an end-user Gradle Project build.\n\nCurrently the only capabilities added are for bytecode enhancement of the user domain model and schema operations, although other capabilities are planned.\n\n## Getting Started\n\nThis plugin is published to the [Gradle Plugin Portal](https://plugins.gradle.org/plugin/org.rm3l.datanucleus-gradle-plugin).\n\n* Build script snippet for plugins DSL for Gradle 2.1 and later:\n\nGrab via Gradle, by applying the plugin (and configure it) in your `build.gradle`:\n\n```groovy\nplugins {\n  id \"org.rm3l.datanucleus-gradle-plugin\" version \"2.0.0\"\n}\n```\n\n* Build script snippet for use in older Gradle versions or where dynamic configuration is required:\n\n```groovy\nbuildscript {\n  repositories {\n    maven {\n      url \"https://plugins.gradle.org/m2/\"\n    }\n  }\n  dependencies {\n    classpath \"org.rm3l:datanucleus-gradle-plugin:2.0.0\"\n  }\n}\n\napply plugin: \"org.rm3l.datanucleus-gradle-plugin\"\n```\n\nNote that this plugin automatically applies the Gradle [JavaPlugin](https://docs.gradle.org/current/userguide/java_plugin.html), as\nthis is a prerequisite here.\n\n## Tasks\n\nThis plugin aims at supporting the same set of operations provided\nby the official [DataNucleus Maven Plugin](https://github.com/datanucleus/datanucleus-maven-plugin):\n\n* Bytecode Enhancement\n* SchemaTool\n\nApplying this plugin automatically applies the [Java Plugin](https://docs.gradle.org/current/userguide/java_plugin.html) (if not already the case)\nand adds the following tasks to your project:\n\n- Enhancement tasks\n  - `enhance` : to enhance classes from the main source set. Run automatically during the build since the [`classes`](https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_tasks) task depends on it.\n  - `testEnhance` : to enhance classes from the test source set. Run automatically during the build since the [`testClasses`](https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_tasks) task depends on it.\n  - `enhanceCheck` : to check the main classes for enhancement status\n  - `testEnhanceCheck` : to check the test classes for enhancement status\n\n- Schema Tool tasks\n  - `createDatabase` : to create the specified database (catalog/schema) if the datastore supports that operation\n  - `deleteDatabase` : to delete the specified database (catalog.schema) if the datastore supports that operation\n  - `createDatabaseTables` : to create all database tables required for the classes defined by the input data\n  - `deleteDatabaseTables` : to delete all database tables required for the classes defined by the input data\n  - `validateDatabaseTables` : to validate all database tables required for the classes defined by the input data\n  - `deleteThenCreateDatabaseTables` : delete all database tables required for the classes defined by the input data, then create the tables\n  - `dbinfo` : provide detailed information about the database, its limits and datatypes support. Only for RDBMS currently\n  - `schemainfo` : provide detailed information about the database schema. Only for RDBMS currently\n\nYou can see the exhaustive list of tasks by issuing the following command from the root of your project:\n\n```bash\n./gradlew tasks\n```\n\nTo see the runtime options of a particular tasks (say `createDatabaseTables`):\n```bash\n./gradlew -q help --task createDatabaseTables\n```\n\n### Bytecode Enhancement\n\nA noteworthy behavior of most JPA providers is to \"enhance\" the domain JPA classes.\nThis technique, also known as weaving, allows to modify the resulting bytecode of your domain classes,\nin order to essentially add the following capabilities:\n\n* lazy state initialization\n* object dirty state tracking, i.e. the ability to track object updates (including collections/maps mutations),\nand translate such updates into JPQL DML queries, which are translated into database-specific SQL queries\n* automatic bi-directional mapping, i.e., ensuring that both sides of a relationship are set properly\n* optionally, performance optimizations\n\nSome providers have chosen to require all domain classes to be enhanced before any use.\nThis means that enhancement has to be done beforehand at build time, or at any time between compile time and packaging time.\nIt is still possible to do it at run-time, but this requires using an appropriate ClassLoader to make sure\nthe enhanced classes are effectively being used.\n\nOn the other hand, other JPA providers do not make enhancement a mandatory prerequisite,\nand can do it on-the-fly at run-time.\nThey still allow to perform enhancement at build time, but this may not be the default behavior.\n\nPerforming bytecode enhancement at build time clearly has a performance benefit\nover the use of slow proxies or reflection that might be done at run-time.\n\nThis plugin supports build-time enhancement by providing Gradle tasks wrapped around the official DataNucleus enhancer. The benefit is that the enhanced classes are what gets added to the final built Jar artifact.\n\nTo use the plugin in your Gradle project, after applying it as depicted above,\nyou need to configure it, e.g.:\n\n```groovy\ndatanucleus {\n  enhance {\n    api 'JPA'\n    persistenceUnitName 'myPersistenceUnit'\n    //... other options are possible\n  }\n\n  //\n  testEnhance { //'testEnhance' task has exactly the same options as the 'enhance' one above\n    api 'JPA'\n    persistenceUnitName 'myTestPersistenceUnit'\n    //...\n  }\n}\n```\n\nThis provides you with the following set of additional tasks:\n- `enhance` : to enhance classes from the main source set. Run automatically during the build since the [`classes`](https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_tasks) task depends on it.\n- `testEnhance` : to enhance classes from the test source set. Run automatically during the build since the [`testClasses`](https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_tasks) task depends on it.\n- `enhanceCheck` : to check the main classes for enhancement status\n- `testEnhanceCheck` : to check the test classes for enhancement status\n\nAll those tasks support the same set of enhancement options as in\nthe official datanucleus-maven-plugin, i.e.:\n\n| Property        | Default value           | Description  |\n|-----------------|-------------------------|--------------|\n| `persistenceUnitName`      | - | Name of the persistence-unit to enhance. **Mandatory** |\n| `log4jConfiguration`      | - | Config file location for Log4J (if using it) |\n| `jdkLogConfiguration`      | - | Config file location for JDK1.4 logging (if using it) |\n| `api`      | `JDO` | API to enhance to (`JDO` or `JPA`). **Mandatory** |\n| `verbose`      | `false` | Verbose output? |\n| `quiet`      | `false` | No output? |\n| `targetDirectory`      | - | Where the enhanced classes are written (default is to overwrite them) |\n| `generatePK`      | `true` | Generate a PK class (of name `{MyClass}_PK`) for cases where there are multiple PK fields yet no *IdClass* is defined. |\n| `generateConstructor`      | `true` | Generate a default constructor if not defined for the class being enhanced. |\n| `detachListener`      | `false` | Whether to enhance classes to make use of a detach listener for attempts to access an un-detached field. |\n| `ignoreMetaDataForMissingClasses`      | `false` | Whether to ignore when we have metadata specified for classes that are not found (e.g in *orm.xml*) |\n| `skip`      | `false` | Whether to skip execution |\n\n\nNote that by default, the [`classes`](https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_tasks) task\nis automatically marked as depending on the `enhance` task, so that the latter is automatically run when you run a build.\n\nSimilarly, the [`testClasses`](https://docs.gradle.org/current/userguide/java_plugin.html#sec:java_tasks) task\nis automatically marked as depending on the `testEnhance` task.\n\nThis way, your resulting artifacts will contain the enhanced classes.\n\nYou can also perform enhancement at runtime by running the task and passing its various options. For example, below is the help menu of the `enhance` task:\n```bash\n❯ ./gradlew -q help --task enhance\n\nDetailed task information for enhance\n\nPath\n     :enhance\n\nType\n     EnhanceTask (org.rm3l.datanucleus.gradle.tasks.enhance.EnhanceTask)\n\nOptions\n     --api     API to enhance to (JDO or JPA). Mandatory. Default is JDO.\n               Available values are:\n                    JDO\n                    JPA\n\n     --detach-listener     Whether to enhance classes to make use of a detach listener for attempts to access an un-detached field.\n\n     --generate-constructor     Whether to generate a default constructor if not defined for the class being enhanced.\n\n     --generate-pk     Whether to generate a PK class (of name {MyClass}_PK) for cases where there are multiple PK fields yet no IdClass is defined.\n\n     --ignore-metadata-for-missing-classes     Whether to ignore when we have metadata specified for classes that are not found (e.g in orm.xml)\n\n     --jdk-log-conf     Config file location for JDK logging (if using it)\n\n     --log4j-conf     Config file location for Log4J (if using it)\n\n     --persistence-unit-name     Name of the persistence-unit to enhance. Mandatory\n\n     --quiet     Whether to be quiet or not\n\n     --skip     Whether to skip execution\n\n     --target-directory     Where the enhanced classes are written (default is to overwrite them)\n\n     --verbose     Whether to be verbose or not\n\nDescription\n     Performs enhancement of the main classes.\n\nGroup\n     DataNucleus Enhancement\n```\n\nSo for example, we can issue the following command to enhance classes part of a given persistence unit (named 'myPersistenceUnit'):\n```bash\n./gradlew enhance --api JPA --persistence-unit-name myPersistenceUnit\n```\n\n### SchemaTool\n\nThis plugin works hand-by-hand with DataNucleus SchemaTool, which currently works with\nRDBMS, HBase, Excel, OOXML,  ODF, MongoDB, Cassandra datastores.\n\nTo use the plugin in your Gradle project, after applying it as depicted above,\nyou need to configure it, e.g.:\n\n```groovy\ndatanucleus {\n  schemaTool {\n    api 'JPA'\n    persistenceUnitName 'myPersistenceUnit'\n    //... other options are possible\n  }\n}\n```\n\nConfiguring the DSL provides you with the following set of SchemaTool tasks:\n- `createDatabase` : to create the specified database (catalog/schema) if the datastore supports that operation\n- `deleteDatabase` : to delete the specified database (catalog.schema) if the datastore supports that operation\n- `createDatabaseTables` : to create all database tables required for the classes defined by the input data\n- `deleteDatabaseTables` : to delete all database tables required for the classes defined by the input data\n- `validateDatabaseTables` : to validate all database tables required for the classes defined by the input data\n- `deleteThenCreateDatabaseTables` : delete all database tables required for the classes defined by the input data, then create the tables\n- `dbinfo` : provide detailed information about the database, its limits and datatypes support. Only for RDBMS currently\n- `schemainfo` : provide detailed information about the database schema. Only for RDBMS currently\n\nAll those tasks support the same set of options as in the official DataNucleus Maven Plugin, i.e.:\n\n| Property        | Default value           | Description  |\n|-----------------|-------------------------|--------------|\n| `persistenceUnitName`      | - | Name of the persistence-unit to enhance. **Mandatory** |\n| `log4jConfiguration`      | - | Config file location for Log4J (if using it) |\n| `jdkLogConfiguration`      | - | Config file location for JDK1.4 logging (if using it) |\n| `api`      | `JDO` | API to enhance to (`JDO` or `JPA`). **Mandatory** |\n| `catalogName`      | - | Name of the catalog. **Mandatory** when using `createDatabase` or `deleteDatabase` options |\n| `schemaName`      | - | Name of the schema. **Mandatory** when using `createDatabase` or `deleteDatabase` options |\n| `verbose`      | `false` | Verbose output? |\n| `quiet`      | `false` | No output? |\n| `completeDdl`      | `false` | Whether to generate DDL including things that already exist? (for RDBMS)|\n| `ddlFile`      | - | Name of an output file to dump any DDL to (for RDBMS) |\n| `ignoreMetaDataForMissingClasses`      | `false` | Whether to ignore when we have metadata specified for classes that are not found (e.g in *orm.xml*) |\n| `skip`      | `false` | Whether to skip execution |\n\n\nLike for the Enhancement tasks depicted above, you can also perform SchemaTool operations at runtime by running the task and passing its various options.\nFor example, below is the help menu of the `createDatabaseTables` task:\n\n```bash\n./gradlew -q help --task createDatabaseTables\n\nDetailed task information for createDatabaseTables\n\nPath\n     :createDatabaseTables\n\nType\n     CreateDatabaseTablesTask (org.rm3l.datanucleus.gradle.tasks.schematool.CreateDatabaseTablesTask)\n\nOptions\n     --api     API to enhance to (JDO or JPA). Mandatory. Default is JDO.\n               Available values are:\n                    JDO\n                    JPA\n\n     --catalog-name     Catalog Name\n\n     --complete-ddl     Whether to consider complete DDL or not\n\n     --ddl-file     Path to DDL file\n\n     --ignore-metadata-for-missing-classes     Whether to ignore when we have metadata specified for classes that are not found (e.g in orm.xml)\n\n     --jdk-log-conf     Config file location for JDK logging (if using it)\n\n     --log4j-conf     Config file location for Log4J (if using it)\n\n     --persistence-unit-name     Name of the persistence-unit to enhance. Mandatory\n\n     --schema-name     Schema Name\n\n     --skip     Whether to skip execution\n\n     --verbose     Whether to be verbose or not\n\nDescription\n     Creates all database tables required for the classes defined by the input data.\n\nGroup\n     DataNucleus SchemaTool\n```\n\n## Contribution Guidelines\n\nContributions and issue reporting are more than welcome. So to help out, do feel free to fork this repo and open up a pull request.\nI'll review and merge your changes as quickly as possible.\n\nYou can use [GitHub issues](https://github.com/rm3l/datanucleus-gradle-plugin/issues) to report bugs.\nHowever, please make sure your description is clear enough and has sufficient instructions to be able to reproduce the issue.\n\n### Source Code Layout\n\nSource Code is organized as much as possible per the official Gradle conventions, as follows:\n\n* `buildSrc` : the actual code of the Plugin, along with its own unit, integration and functional tests\n* `sample-jdo` : sample JDO project serving as a reference project that can be used to test and play with the plugin\n* `sample-jpa` : sample JPA project serving as a reference project that can be used to test and play with the plugin\n* `sample-jpa-multiproject` : sample multi-module Gradle project serving as a reference project that can be used to test and play with the plugin\n\nPlease note that Jacoco coverage metrics displayed here are reported against the plugin code solely.\n\n### Building from source\n\nThis can be built as a standard Gradle Project, by issuing the following command:\n\n```bash\n./gradlew build\n```\n\nThis command automatically builds the plugin code (from the `buildSrc` folder) and then continues with the sample project.\n\n### Publishing the plugin\n\nAll releases of this plugin ought to be published to the [Gradle Plugin Portal](https://plugins.gradle.org/plugin/org.rm3l.datanucleus-gradle-plugin).\n\nTo publish the plugin, you must have the appropriate rights on the Gradle Plugin Portal.\nAdditionally, the key and secret credentials for publishing are recommended to be put on your \nlocal machine in your `${HOME}/.gradle/gradle.properties`, which should contain the following two properties:\n\n- `gradle.publish.key` : the API key for publishing, which you can grab from the Gradle Plugin Portal \"API Keys\" section\n- `gradle.publish.secret` : the API secret for publishing, which you can grab from the Gradle Plugin Portal \"API Keys\" section\n\nPublishing the plugin is then as easy as calling the `publishPlugins` task **from the `buildSrc` folder**:\n\n```bash\n../gradlew publishPlugins\n```\n\nAlternatively, you may publish the plugin right from the command-line:\n\n```bash\n../gradlew publishPlugins -Pgradle.publish.key=\u003capiKey\u003e -Pgradle.publish.secret=\u003capiSecret\u003e\n```\n \nDo not forget to make and push the corresponding tag afterwards if needed. \n\n## Credits / Inspiration\n\n* [Gradle Build Tool](https://gradle.org/)\n* [DataNucleus Maven Plugin](https://github.com/datanucleus/datanucleus-maven-plugin)\n* [Hibernate Gradle Plugin](https://github.com/hibernate/hibernate-orm/tree/master/tooling/hibernate-gradle-plugin)\n\n## Developed by\n\n* Armel Soro\n  * [keybase.io/rm3l](https://keybase.io/rm3l)\n  * [rm3l.org](https://rm3l.org) - \u0026lt;armel+dn_gradle_plugin@rm3l.org\u0026gt; - [@rm3l](https://twitter.com/rm3l)\n  * [paypal.me/rm3l](https://paypal.me/rm3l)\n  * [coinbase.com/rm3l](https://www.coinbase.com/rm3l)\n\n## License\n\n    The MIT License (MIT)\n\n    Copyright (c) 2018-2021 Armel Soro\n\n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n\n    The above copyright notice and this permission notice shall be included in all\n    copies or substantial portions of the Software.\n\n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frm3l%2Fdatanucleus-gradle-plugin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frm3l%2Fdatanucleus-gradle-plugin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frm3l%2Fdatanucleus-gradle-plugin/lists"}