{"id":23659441,"url":"https://github.com/cloudnetservice/juppiter","last_synced_at":"2026-01-10T04:48:26.698Z","repository":{"id":103587329,"uuid":"390466738","full_name":"CloudNetService/juppiter","owner":"CloudNetService","description":"Juppiter - a Gradle plugin that generates the module.json for CloudNet modules based on the Gradle project.","archived":false,"fork":false,"pushed_at":"2025-06-14T04:59:38.000Z","size":205,"stargazers_count":1,"open_issues_count":4,"forks_count":3,"subscribers_count":0,"default_branch":"nightly","last_synced_at":"2025-06-14T05:33:12.780Z","etag":null,"topics":["cloudnet-module-util","cloudnet-v3","gradle-plugin"],"latest_commit_sha":null,"homepage":"https://cloudnetservice.eu","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/CloudNetService.png","metadata":{"files":{"readme":".github/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":"2021-07-28T18:48:24.000Z","updated_at":"2025-06-06T20:07:14.000Z","dependencies_parsed_at":null,"dependency_job_id":"4a29531f-ab8b-4219-a3c3-8adff5e6118b","html_url":"https://github.com/CloudNetService/juppiter","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/CloudNetService/juppiter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CloudNetService%2Fjuppiter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CloudNetService%2Fjuppiter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CloudNetService%2Fjuppiter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CloudNetService%2Fjuppiter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/CloudNetService","download_url":"https://codeload.github.com/CloudNetService/juppiter/tar.gz/refs/heads/nightly","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/CloudNetService%2Fjuppiter/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265106015,"owners_count":23712249,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["cloudnet-module-util","cloudnet-v3","gradle-plugin"],"created_at":"2024-12-29T02:54:29.496Z","updated_at":"2026-01-10T04:48:26.647Z","avatar_url":"https://github.com/CloudNetService.png","language":"Kotlin","readme":"# Juppiter ![workflow status](https://github.com/CloudNetService/juppiter/actions/workflows/build.yml/badge.svg)\n\n**Juppiter** is a simple Gradle plugin for CloudNet 3 which automatically generates the module.json file for your\nCloudNet module. Properties can automatically get detected as well as being specified in the build.gradle of your module\nproject.\n\n## Usage\n\nSimply add the Juppiter plugin to your build.gradle as follows:\n\n```groovy\nplugins {\n  id 'eu.cloudnetservice.juppiter' version '0.2.0'\n}\n```\n\nand configure it at least like this:\n\n```groovy\nmoduleJson {\n  main = 'eu.cloudnetservice.cloudnet.ext.signs.node.CloudNetSignsModule'\n}\n```\n\nNow just run your build using gradle and the module.json will be generated and added to your output jar file.\n\n## Full configuration\n\nHere is a full overview of all configuration options and their default settings:\n\n```groovy\nmoduleJson {\n  // main is the only setting which can not get automatically set\n  // you have to define it yourself\n  main = 'eu.cloudnetservice.cloudnet.ext.signs.node.CloudNetSignsModule'\n  // Sets whether is module is a runtime module or not. Runtime modules\n  // will not get reloaded when using 'reload confirm'. For changing their\n  // configuration you have to restart CloudNet or provide a custom config\n  // reload command.\n  runtimeModule = false\n  // Sets if this module stores sensitive data. If this is set to true\n  // the module configuration will for example not get appended to the\n  // output of a node report module paste.\n  storesSensitiveData = false\n  // Sets the name of this module. This defaults to the project name\n  // if not specified.\n  name = 'CloudNet-Signs'\n  // Specifies the group of this module. This default to the project\n  // group if not specified.\n  group = 'eu.cloudnetservice.cloudnet.modules'\n  // Specified the author of this module. This defaults to 'Anonymous'\n  // if not specified.\n  author = 'CloudNetService'\n  // Specified the version of this module. This defaults to the project\n  // version if not specified.\n  version = '2.0'\n  // Specified the website of this module. This can for example be your\n  // wiki page for this module. If not specified this setting defaults\n  // to 'https://cloudnetservice.eu'\n  website = 'https://cloudnetservice.eu'\n  // Specifies the data folder of this module. This will override the\n  // default data folder configuration of CloudNet which is based on the\n  // base path of the module provider and the name of the module. In this\n  // case it would be 'modules/CloudNet-Signs' for the default module provider.\n  dataFolder = 'modules/IWantMyCustomDataFolder'\n  // Specified the description of this module. This defaults to the\n  // project description and if the project description is not set\n  // it will fall back to 'Just another CloudNet3 module'\n  description = 'CloudNet extension which adds sign connector support for Bukkit, Nukkit and Sponge'\n  // Specifies the minimum java version required in the runtime in order to \n  // run this module. If this property is not set it's assumed that the module\n  // can run on every version starting from java version 8. The same rule applies\n  // if the module defines a version which is older than version 8. If the runtime\n  // version does not support the provided java version, a warning will be printed\n  // and the module will not get loaded.\n  minJavaVersionId = JavaVersion.VERSION_11\n  // You can define custom properties for your module which will be accessible\n  // in the runtime in a seperated JsonDocument: ModuleConfiguration#getProperties.\n  // The properties object is a map, all keys must be a string the values can be\n  // anything you want (in this case a string and a boolean).\n  properties.put(\"Build-Number\", System.getenv('BUILD_NUMBER').toString())\n  properties.put(\"Development-Build\", project.version.endsWith('-SNAPSHOT'))\n  // You can define custom dependencies which will get added to your\n  // module.json. However any dependency in the dependency block\n  // which uses the configuration 'moduleLibrary' will be resolved against\n  // all repositories defined and added when a matching repository is found.\n  // If the repository is not yet defined, it will be added automatically\n  // to the build output. Below is an example how to add a custom dependencies.\n  dependencies {\n    // This case demonstrates how to depend on the bridge module without putting it \n    // into the dependency handler block of your build.gradle (See below for more \n    // information on this). The bridge module now gets loaded before this module.\n    // No repository is defined, so the module must be loaded already for this to work.\n    // The module version which runs in the runtime must match the following convention:\n    //    - the major version must match exactly the defined version major\n    //    - the minor version must be higher or equal to the defined version minor\n    //    - the patch version is ignored as it should never contain breaking changes\n    // Note that this version checking only works for modules which follow the semantic\n    // versioning 2: https://semver.org/\n    'CloudNet-Bridge' {\n      version = '1.2'\n      group = 'de.dytanic.cloudnet.modules'\n    }\n    // This case demonstrates how to depend on the rest module which now gets \n    // loaded before this module. The download url of the module is defined\n    // so it will be loaded from there if the dependency is not yet available\n    // on the local machine. The url property will always force the node\n    // by default to use this url, so defining a repo has no effect. Note\n    // that in this example the rest module is not dependency as a module\n    // but as a normal maven dependency (so the rest module will not get loaded\n    // before this module but downloaded and added to the module ucp).\n    'CloudNet-Rest' {\n      version = '1.0'\n      group = 'de.dytanic.cloudnet.modules'\n      url = 'https://cloudnetservice.eu/cloudnet/updates/versions/3.4.0-RELEASE/cloudnet-rest.jar'\n    }\n    // This case demonstrates how to depend on gson without putting it into the\n    // dependency handler block of your build.gradle (See below for more information\n    // on this). Please note that for this example to work a repository with the\n    // name 'Maven-Central' has to be added to the project. If the repository is\n    // not defined the node will just silently ignore the dependency. If the\n    // repository is present the dependency will be downloaded like a normal\n    // maven dependency. For more information on this please check out the docs:\n    // https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html\n    'Gson' {\n      version = '2.8.7'\n      group = 'com.google.code.gson'\n      repo = 'Maven-Central'\n    }\n  }\n  // On the other hand you are able to configure custom repositories if\n  // you need them. And repository needed by your defined dependencies\n  // will be added as well.\n  repositories {\n    'Another Jitpack Repo' {\n      url = 'https://jitpack.io'\n    }\n  }\n}\n```\n\n## Defining dependencies\n\nYou can still define any dependency you need for your build. However, any dependency notated as `moduleLibrary` will be\nautomatically added the `compileOnly` class path and later added to the dependencies in the generated module.json. Here\nis an example:\n\n```groovy\ndependencies {\n  // will be added to the fat jar by for example the shadow plugin\n  implementation group: 'com.zaxxer', name: 'HikariCP', version: '5.0.0'\n  // these are only available during the compile and will be added to the\n  // module.json file and loaded in the runtime. These dependencies must be\n  // resolvable in a repository in order to work.\n  moduleLibrary group: 'io.netty', name: 'netty-handler', version: '4.1.66.Final'\n  moduleLibrary group: 'com.github.juliarn', name: 'npc-lib', version: 'development-SNAPSHOT'\n  // This defines a dependency on another module. These will not be associated with\n  // any repository during the build but must be present for the module provider in\n  // the runtime in order to work. There is no way that CloudNet loads module dependencies\n  // automatically. The classes of the module are available during the compile process\n  // and will not get shaded into the jar. See above for information about strict\n  // module version checking.\n  moduleDependency group: 'de.dytanic.cloudnet.modules', name: 'CloudNet-Bridge', version: '1.2'\n  moduleDependency group: 'eu.cloudnetservice.cloudnet.modules', name: 'CloudNet-Signs', version: '2.0'\n  // other dependencies you may need\n  testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'\n  testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'\n}\n```\n\nThese files are coming from the maven central repo. The plugin will find any transitive dependency and their\nrepositories and adds all of them to the module.json file.\n\n## Customize the generation task\n\nIn the [Full configuration](#full-configuration) section the configuration of the module extension was explained. Below\nis a small description on how to modify the generation task. By default, there is no need to configure any property of\nthe task settings.\n\n```groovy\ngenModuleJson {\n  // Sets the output file name. By default this is set to 'module.json' as\n  // the default CloudNet module loader will only recognize this type of\n  // module configuration.\n  fileName.set(\"module.yml\")\n  // There is another option which allows you do set the module configuration\n  // class instance which gets generated. By default you should only use the\n  // extension which allows you to configure the module configuration. This\n  // is only here because it exists.\n  moduleConfiguration.set(ModuleConfigration.newInstance(project))\n  // The output directory property defines the output directory of the generated\n  // file and the inclusion point for the jar task. Please note this comment of\n  // the gradle documentation: \"This will cause the task to be considered \n  // out-of-date when the directory path or task output to that directory has \n  // been modified since the task was last run.\". This property defaults to\n  // a sub directory of the build directory named 'generated/module-json'.\n  outputDirectory.set(project.layout.buildDirectory.dir(\"generated/module-yaml\"))\n}\n```\n\n## Support \u0026 Issues\n\nIf you need help using this plugin or found an issue feel free to join\nour [Discord Server](https://discord.cloudnetservice.eu/) or open\nan [issue](https://github.com/CloudNetService/juppiter/issues/new) on GitHub.\n\n**Happy developing!**\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloudnetservice%2Fjuppiter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcloudnetservice%2Fjuppiter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloudnetservice%2Fjuppiter/lists"}