You can use this template to develop your own high quality Spigot plugins using Gradle with ease.
See the minecraft-server-template for quick starting your Minecraft network in under 30 seconds.
- Features
- Quickstart setup
- Releasing a new version of your plugin
- Publishing your maven package
- Debugging your plugin
- References
The template or better boilerplate comes with a lot of features that are useful if you want to develop high quality plugins. However you don't need to use all of them, you can simply remove the features you don't need.
- Ready to use Gradle project with lots of utility tasks
- Automatic generation of
plugin.yaml
based of project properties with SpiGradle - Integrated Spigot test server with a one click build, copy plugin and start debugging in IntelliJ task
- Gradle shadow plugin to easily ship your needed dependencies with your plugin
- Example integrations including tests for the Annotation Command Framework and Vault.
- JUnit 5 test setup including MockBukkit and AssertJ
- Jacoco code coverage report including an upload task to codecov
- Fully integrated semantic-release release pipeline
- Automatic changelog generation based on conventional commit messages
- Github Actions workflow for build and release
- Publishing of maven artifacts to GitHub Packages
no more need for self hosted nexus or artifactory server
- GitHub issue templates for bug and feature requests
- Contributing and Code of Conduct guidelines
- Nice badges to show of your project
- Create a new Github project using this template.
- Clone the new repository and open it in IntelliJ.
- Update the gradle.properties file and change the following variables:
group
: your-maven-group-id (e.g.: io.github.silthus)pluginName
: YourPluginNameauthor
: YourName
- Update the
root.projectName
inside settings.gradle. This will be yourartifactId
. - Delete the
CHANGELOG.md
. It will be generated on your first release. - Update the
README
to point to your project and spigot resource id. - Rename the java package and plugin to match your project.
- Then execute the
prepareSpigotPlugins
gradle task this will try to download all plugin denpendencies and puts them intodebug/spigot/plugins/
. - Start the Minecraft server by executing the
debugPaper
task. This will start the server in the background and you can connect to it using thelocalhost:25565
address. - Code away :) - and once you are ready, push your commit (in conventional commit style) to master.
Please read the Contributing Guidelines before submitting any pull requests or opening issues.
NOTE
You might need to run thegradle clean
task after renaming the packages and reimport the gradle project to resolve errors with generating theplugin.yml
.
One of the major benefits of this template is the fact that it will automatically release a new version on every push to master
based on your commit messages. This makes sure your plugin is released following the semantic versioning guidelines. For this to work you have to follow a few simple rules:
- Commit only working and tested code to the master branch. Use Pull Requests to work on bigger features or bug fixes and merge them when you are ready.
- Every bugfix, feature and change should have one commit associated with it. Do not mix multiple bugs, features, etc. into one huge commit message. Keep your commit size small and commit often.
- Your commit messages must follow the conventional commit rules.
See the conventional commit homepage for more details and examples on the topic. But here is a quick summary to get you started.
The Conventional Commits specification is a lightweight convention on top of commit messages. It provides an easy set of rules for creating an explicit commit history; which makes it easier to write automated tools on top of. This convention dovetails with SemVer, by describing the features, fixes, and breaking changes made in commit messages.
The commit message should be structured as follows:
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
The commit contains the following structural elements, to communicate intent to the consumers of your library or plugin:
fix:
a commit of the type fix patches a bug in your codebase (this correlates with PATCH in semantic versioning).feat:
a commit of the type feat introduces a new feature to the codebase (this correlates with MINOR in semantic versioning).BREAKING CHANGE:
a commit that has a footer BREAKING CHANGE:, or appends a ! after the type/scope, introduces a breaking API change (correlating with MAJOR in semantic versioning). A BREAKING CHANGE can be part of commits of any type.- types other than fix: and feat: are allowed, for example @commitlint/config-conventional (based on the the Angular convention) recommends
build:
,chore:
,ci:
,docs:
,style:
,refactor:
,perf:
,test:
, and others. - footers other than
BREAKING CHANGE: <description>
may be provided and follow a convention similar to git trailer format. Additional types are not mandated by the Conventional Commits specification, and have no implicit effect in semantic versioning (unless they include a BREAKING CHANGE).
A scope may be provided to a commit’s type, to provide additional contextual information and is contained within parenthesis, e.g., feat(parser): add ability to parse arrays
.
Here are some examples:
Commit message with description and breaking change footer
feat: allow provided config object to extend other configs
BREAKING CHANGE: `extends` key in config file is now used for extending other config files
Commit message with no body
docs: correct spelling of CHANGELOG
Commit message with scope
feat(lang): add polish language
Commit message with multi-paragraph body and multiple footers
fix: correct minor typos in code
see the issue for details
on typos fixed.
Reviewed-by: Z
Refs #133
Your plugin will be automatically published as a maven package on Github packages as soon as you release a new version.
The group
appended by your artifactId
is used to uniquely identify your project when importing it in other projects. When you import spigot in your project you use the group org.spigotmc
followed by the artifactId spigot-api
and the version.
The following was taken from the offical maven naming guide.
groupId
uniquely identifies your project across all projects. A group ID should follow Java's package name rules. This means it starts with a reversed domain name you control. For example:org.apache.maven
,org.apache.commons
.
If you dont't own a domain, you can use the github domainio.github
appended by your Github username, e.g.io.github.silthus
artifactId
is the name of the jar without version. If you created it, then you can choose whatever name you want with lowercase letters and no strange symbols. For example: `maven, commons-math
You need to configure authentication for Github Packages if you want to use your maven package in other projects.
- Create a Github Personal Access Token
- Create or update the
gradle.properties
insideC:\Users\%username%\.gradle
with the following and replaceYOUR_GITHUB_USERNAME
with your Github username andYOUR_PERSONAL_ACCESS_TOKEN
with the access token from step 1.
gpr.user=YOUR_GITHUB_USERNAME
gpr.key=YOUR_PERSONAL_ACCESS_TOKEN
You can export your plugin to the plugins directory from your working directory with the Gradle prepareSpigotPlugins task. The task will build and copy your plugin automatically into the plugins/
directory.
You can run or debug your plugin using the Server
run configuration from within IntelliJ to automatically download the Minecraft server, built it, copy your and dependent plugins into it and start it in debugging mode.
This is due to the awesome power of Spigradle's debug tasks. Find out more on the Spigradle Github page.
- Spigradle: provides awesome gradle tasks that make your live a lot easier
- semantic-release: in my opinion every project should use this!
- conventional commit messages: do commit message the right way