<?xml version="1.0" encoding="UTF-8" ?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel><title>Chojo - Dev Blog and Portfolio</title><description>Welcome to my website. You can find information about my projects and myself here or dive into my blog</description><link>https://chojo.dev/</link><atom:link href="https://chojo.dev/feed_rss_created.xml" rel="self" type="application/rss+xml" /><docs>https://github.com/rainbowdashlabs/chojodev/</docs><language>en</language> <pubDate>Wed, 13 May 2026 23:32:16 -0000</pubDate> <lastBuildDate>Wed, 13 May 2026 23:32:16 -0000</lastBuildDate> <ttl>1440</ttl> <generator>MkDocs RSS plugin - v1.13.1</generator> <item> <title>Let&#39;s Craft Code - Eine Buchrezension</title> <author>chojo</author> <description>&lt;h1 id=&#34;lets-craft-code-eine-buchrezension&#34;&gt;Let&#39;s Craft Code - Eine Buchrezension&lt;/h1&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;Sorry guys and gals. That&#39;s a review for a german book, so no english here.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Keine Sorge, dieser Blog bleibt weiterhin technisch und wird nicht zum Buchblog, aber diesem Buch würde ich hier gern etwas Aufmerksamkeit widmen.&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;Oh nein, noch ein Buch, das Programmieren beibringt. Das ist bestimmt wieder super trocken und ich verliere die Motivation.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Wenn du das denkst, könnte dieses Buch jedoch genau das richtige sein.&lt;/p&gt;&lt;!-- more --&gt;&lt;p&gt;Wenn das nicht das erste Mal auf meinem Blog ist, weißt du, wer ich bin.Ich bin Nora und dieses Buch kenne ich vermutlich fast genauso gut, wie der Author selbst. Denn ich habe dieses Buch auf technische Fehler geprüft, während es geschrieben wurde.Gemeinsam mit dem Author Max oder auch BiVieh (oder Schloool) haben wir dafür gesorgt, dass sich in den Beispielen und Aufgaben im Buch keine Fehler eingeschlichen haben.Vor allem haben wir darauf geachtet, dass du mitkommst, die Beispiele nicht zu schwer sind und du Stück für Stück an das Programmieren herangeführt wirst.&lt;/p&gt;&lt;p&gt;Es mag jetzt natürlich super biased sein, wenn jemand, der am Buch selbst mitgearbeitet hat, eine Rezension schreibt, aber wer, wenn nicht ich, hat vermutlich den besten Block von außen?&lt;/p&gt;&lt;p&gt;Max ist es gelungen, mit dem Buch &#34;Let&#39;s Craft Code&#34; ein Buch zu schreiben, dass ich wirklich guten Gewissens auch Anfängern and Herz legen kann.Mein größtes Problem mit Programmierbüchern ist nahezu immer die endlose Erklärung mit Beispielen, bei denen ich zwar am Ende einen Haufen Code habe, aber wirklich etwas sehen tue ich nicht abgesehen von einer Konsolenausgabe.&lt;/p&gt;&lt;p&gt;Mit Minecraft hat hier Max vermutlich wirklich die beste Platform gefunden den geschriebenen Code sichtbar zu machen. Wir können ihn zwar immer noch nicht anfassen, aber sehen funktioniert wirklich wunderbar.&lt;/p&gt;&lt;p&gt;Nun aber mal zu dem Inhalt selbst. Java erschlägt einen super gerne mit vielen Dingen. Es ist nun mal eine komplexe Sprache, die einfach grenzenlose Möglichkeiten eröffnet.Max hat es hier aber geschafft, eine wirklich sinnvolle Reihenfolge zu finden und die Konzepte anschaulich an praktischen Beispielen zu demonstrieren. Natürlich wird von Anfang an nicht alles erklärt. Aber genau das hält die Komplexität erstmal gering und wir können uns auf kleinere Abschnitte konzentrieren, die wir verändern und anpassen für das, was wir erreichen wollen.Stück für Stück kommt so mehr Sinn in unseren Code und wir verstehen immer mehr der Bezeichnungen, die wir bisher lediglich verwendet haben, ohne sie zu verstehen.Zur besseren Verinnerlichung gibt es nicht nur zu jedem Konzept ein Code Beispiel, sondern auch Praxisbeispiele und zwei Große Parts mit komplexeren Beispielen, die schon fast vollständig funktionale Plugins darstellen.Den ganzen Code musst du natürlich auch nicht abtippen. Alles ist in einem GitHub Repo verfügbar. Solltest du doch einmal feststecken, kannst du dich jederzeit in Discord melden.&lt;/p&gt;&lt;p&gt;Ziel des Buches ist es aber natürlich nicht, aus dir einen professionellen Entwickler zu machen, der morgen bereits anfangen kann zu arbeiten. Es ersetzt natürlich auch kein Studium. Auch wird es dir nicht alle Funktionen erklären, die Java zu bieten hat.Aber das ist auch gar nicht das Ziel des Buches. Es gibt dir die Werkzeuge in die Hand, dich selbst weiterzuentwickeln. Es führt dich in eine Welt ein, die so grenzenlos ist wie die Welt von Minecraft.&lt;/p&gt;&lt;p&gt;Um mal einen Vergleich zu haben: &#34;Let&#39;s Craft Code&#34; umfasst etwas mehr als 400 Seiten. Super viele praktische Beispiele und detaillierte Erklärungen. &#34;Java ist auch eine Insel&#34; ein wirklich sehr gutes Fachbuch für Java, das wirklich nahezu alle Funktionen von Java abdeckt, hat 1200 Seiten. Hier wurde vor allem gut und sinnvoll gekürzt, um viel Platz für praktische Beispiele zu schaffen.&lt;/p&gt;&lt;p&gt;Am Ende bist du auf jeden Fall in der Lage eigene Plugins zu entwickeln. Und vor allem verstehst du jetzt alle wichtigen Grundkonzepte von Java und kannst dich basierend auf diesen weiterentwickeln und dein Wissen erweitern.Und wer weiß, mit etwas Glück schenkt uns BiVieh noch einen weiteren Teil, in dem Bereiche, die es leider nicht in dieses Buch geschafft haben, auch noch Erwähnung finden.&lt;/p&gt;&lt;p&gt;Ich freue mich auf jeden Fall, dass wir endlich ein Buch haben, dass ich wirklich guten Gewissens anderen Menschen empfehlen kann, die Minecraft lieben und Programmieren lernen wollen.&lt;/p&gt;&lt;p&gt;Neugierig geworden? Das Buch ist im Rheinwerk verlag erschienen und in nahezu jedem Buchladen erhältlich und natürlich auch als E-Book.Die physische Printversion ist aber auch schön anzusehen.&lt;/p&gt;&lt;p&gt;&lt;a href=&#34;https://www.rheinwerk-verlag.de/lets-craft-code-wie-du-deine-minecraft-welt-mit-plugins-erweiterst/&#34;&gt;Weitere Infos gibts hier&lt;/a&gt;&lt;/p&gt;</description><link>https://chojo.dev/blog/2025/12/18/lets-craft-code---eine-buchrezension/</link> <pubDate>Sun, 21 Dec 2025 20:49:24 +0100</pubDate><source url="https://chojo.dev/feed_rss_created.xml">Chojo - Dev Blog and Portfolio</source><guid isPermaLink="true">https://chojo.dev/blog/2025/12/18/lets-craft-code---eine-buchrezension/</guid> </item> <item> <title>Gradle Basics</title> <author>chojo</author> <description>&lt;h1 id=&#34;gradle-basics&#34;&gt;Gradle Basics&lt;/h1&gt;&lt;p&gt;This blog post is about the basics of gradle. It is part of a longer series focusing on different build approaches using gradle. I will link further in depth posts for specific topics at the end of the post. During the Blog post I will show a lot of snippets. Those snippets will be mostly shorted and previously added stuff will not be shown. You will find spoilers sometimes that include the full files. Check those if you get lost on how your build file should look like.&lt;/p&gt;&lt;p&gt;This blogpost will mainly cover the general structure of gradle files, more precisely the &lt;code&gt;gradle.build&lt;/code&gt; and &lt;code&gt;gradle.settings&lt;/code&gt; files.&lt;/p&gt;&lt;!-- more --&gt;&lt;h2 id=&#34;what-is-gradle&#34;&gt;What is Gradle&lt;/h2&gt;&lt;p&gt;Before we start with using Gradle, we should clear up what Gradle is.&lt;/p&gt;&lt;p&gt;Gradle is a so-called project management system. Some refer to is as build tool as well.Both are technical right. Gradle manages your project by allowing you to define your dependencies. In the end gradle will build your project depending on your build definition.&lt;/p&gt;&lt;p&gt;To manage your project gradle uses a so-called &lt;strong&gt;domain specific language&lt;/strong&gt; or &lt;strong&gt;DSL&lt;/strong&gt; in short form.This language can be currently Groovy or Kotlin. While Groovy is older, Kotlin gains more and more popularity as a DSL and is considered the way to go today. You can see that you are using Kotlin as your DSL if your &lt;code&gt;gradle.build&lt;/code&gt; file ends with &lt;code&gt;.kts&lt;/code&gt;. The same goes for your &lt;code&gt;gradle.settings&lt;/code&gt; file. So if your files are named &lt;code&gt;gradle.build.kts&lt;/code&gt; and &lt;code&gt;gradle.settings.kts&lt;/code&gt; you are on the right track.&lt;/p&gt;&lt;p&gt;It is also important that the DSL has nothing to do with the language you use for your project. You can use Kotlin as your DSL and still write your programm with Java or any other supported language&lt;/p&gt;&lt;p&gt;Since gradle uses a DLS to define your build logic, you are much more flexible compared to Maven. Where you would need a ton of xml or plugins in Maven, Gradle usually just needs a couple of Kotlin or Groovy code.&lt;/p&gt;&lt;p&gt;The general approach of gradle is that we use plugins to allow certain actions, which are named tasks. Those tasks usually depend on each other and are executed in a predefined order. We as the user can usually configure the plugin itself and the tasks, that the plugin added. We can also define own tasks, that for example depend on some other task or that are run as a standalone task.&lt;/p&gt;&lt;p&gt;But that&#39;s enough for now. Time to actually set up our gradle project.&lt;/p&gt;&lt;h2 id=&#34;install-gradle&#34;&gt;Install Gradle&lt;/h2&gt;&lt;p&gt;If you are using Intellij, you actually don&#39;t need to worry about this step.Gradle is already bundled in IntelliJ, and you don&#39;t need to install it. You will simply use the wrapper, which will be explained in the next section.&lt;/p&gt;&lt;p&gt;If you are using other IDEs I strongly suggest switching to intellij. Most projects will have a gradle wrapper in it, so installing gradle locally isn&#39;t usually necessary anymore, unless you don&#39;t use IntelliJ and want to set up a new Project.&lt;/p&gt;&lt;p&gt;So if you for any reason need to install Gradle, you should refer to their official &lt;a href=&#34;https://gradle.org/install/&#34;&gt;documentation&lt;/a&gt; or install with the package manager of your choice.&lt;/p&gt;&lt;h2 id=&#34;the-gradle-wrapper&#34;&gt;The Gradle Wrapper&lt;/h2&gt;&lt;p&gt;The Gradle wrapper is essentially a portable Gradle installation.It does not require a Gradle installation on the system and can be used to build anywhere.Gradle releases frequent updates and the wrapper should ideally be updated to the latest version. To update this version you only need one command:&lt;/p&gt;&lt;div class=&#34;language-shell highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;./gradlew&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;wrapper&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--gradle-version&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;9&lt;/span&gt;.5.1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--distribution-type&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;bin&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This works on Unix systems as well as in Windows PowerShell or git bash.If you are using windows cmd, you will need to use &lt;code&gt;gradlew.bat&lt;/code&gt; instead.&lt;/p&gt;&lt;p&gt;Check the &lt;a href=&#34;https://gradle.org/releases/&#34;&gt;Gradle website&lt;/a&gt; for the latest version.&lt;/p&gt;&lt;p&gt;If you have a gradle project that lacks a wrapper, the command above will create it for you. But for that you will need to have some gradle version installed on your system and use &lt;code&gt;gradle&lt;/code&gt; instead of &lt;code&gt;./gradlew&lt;/code&gt; at the start of the command.&lt;/p&gt;&lt;h2 id=&#34;setting-up-a-gradle-project&#34;&gt;Setting up a Gradle Project&lt;/h2&gt;&lt;div class=&#34;tabbed-set tabbed-alternate&#34; data-tabs=&#34;1:3&#34;&gt;&lt;input checked=&#34;checked&#34; id=&#34;__tabbed_1_1&#34; name=&#34;__tabbed_1&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_1_2&#34; name=&#34;__tabbed_1&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_1_3&#34; name=&#34;__tabbed_1&#34; type=&#34;radio&#34; /&gt;&lt;div class=&#34;tabbed-labels&#34;&gt;&lt;label for=&#34;__tabbed_1_1&#34;&gt;Using IntelliJ&lt;/label&gt;&lt;label for=&#34;__tabbed_1_2&#34;&gt;Using Eclipse&lt;/label&gt;&lt;label for=&#34;__tabbed_1_3&#34;&gt;Using CLI&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-content&#34;&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;&lt;img alt=&#34;img.png&#34; src=&#34;../../../../../assets/images/gradle_setup.png&#34; /&gt;&lt;/p&gt;&lt;p&gt;We will look at the marks one after another. Most of the settings will be set by default already.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;We select &lt;strong&gt;New Project&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;We add our project id aka name.&lt;br /&gt;This name is your &lt;strong&gt;plugin name in lower case&lt;/strong&gt; with &lt;code&gt;-&lt;/code&gt; where a space would be.&lt;br /&gt;So &lt;code&gt;MyPlugin&lt;/code&gt; becomes &lt;code&gt;my-plugin&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Make sure that a &lt;strong&gt;git repository&lt;/strong&gt; will be created&lt;/li&gt;&lt;li&gt;Select &lt;strong&gt;Java&lt;/strong&gt; as language or &lt;strong&gt;Kotlin&lt;/strong&gt; if you like this more, but I will only use Java here.&lt;/li&gt;&lt;li&gt;Select &lt;strong&gt;Gradle as build system&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Select &lt;strong&gt;Kotlin as Gradle DSL&lt;/strong&gt; &lt;/li&gt;&lt;li&gt;Let intellij add some sample code.&lt;br /&gt;This will be removed later, but will create the most important directories.&lt;/li&gt;&lt;li&gt;Select the wrapper as your Gradle distribution&lt;/li&gt;&lt;li&gt;Enter the latest Gradle version, as mentioned on the &lt;a href=&#34;https://gradle.org/releases/&#34;&gt;Gradle website&lt;/a&gt;.&lt;br /&gt;This may not be available to select in the drop down menu, but you can enter it yourself.&lt;/li&gt;&lt;li&gt;Enter your group id here.If you don&#39;t know what to write here have a log at my other &lt;a href=&#34;../../../../2023/08/03/the-plugin-main-class-a-constant-naming-discussion/#1-namespace-conflicts&#34;&gt;post&lt;/a&gt;If you don&#39;t have a domain, see &lt;a href=&#34;../../../../2023/08/03/the-plugin-main-class-a-constant-naming-discussion/#i-dont-have-a-domain&#34;&gt;here&lt;/a&gt;&lt;/li&gt;&lt;li&gt;This is the same as your name in &lt;strong&gt;2.&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;Sorry Eclipse users.Time to use an actually good IDE.Switch to IntelliJ c:&lt;/p&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;If you already have a project, you can easily set it up from the command line.If your project is currently a Maven project, Gradle will offer to convert it to a Gradle project.&lt;/p&gt;&lt;p&gt;We will look at how to set up a new Gradle project without importing anything from Maven.&lt;/p&gt;&lt;p&gt;First we start by initialising Gradle with &lt;code&gt;Gradle init&lt;/code&gt;.We&#39;re using the installed version of Gradle for this, so you need to have it installed.&lt;/p&gt;&lt;p&gt;You will end up with this dialogue&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-1-1&#34;&gt;&lt;a id=&#34;__codelineno-1-1&#34; name=&#34;__codelineno-1-1&#34; href=&#34;#__codelineno-1-1&#34;&gt;&lt;/a&gt;Select type of project to generate:&lt;/span&gt;&lt;span id=&#34;__span-1-2&#34;&gt;&lt;a id=&#34;__codelineno-1-2&#34; name=&#34;__codelineno-1-2&#34; href=&#34;#__codelineno-1-2&#34;&gt;&lt;/a&gt; 1: basic&lt;/span&gt;&lt;span id=&#34;__span-1-3&#34;&gt;&lt;a id=&#34;__codelineno-1-3&#34; name=&#34;__codelineno-1-3&#34; href=&#34;#__codelineno-1-3&#34;&gt;&lt;/a&gt; 2: application&lt;/span&gt;&lt;span id=&#34;__span-1-4&#34;&gt;&lt;a id=&#34;__codelineno-1-4&#34; name=&#34;__codelineno-1-4&#34; href=&#34;#__codelineno-1-4&#34;&gt;&lt;/a&gt; 3: library&lt;/span&gt;&lt;span id=&#34;__span-1-5&#34;&gt;&lt;a id=&#34;__codelineno-1-5&#34; name=&#34;__codelineno-1-5&#34; href=&#34;#__codelineno-1-5&#34;&gt;&lt;/a&gt; 4: Gradle plugin&lt;/span&gt;&lt;span id=&#34;__span-1-6&#34;&gt;&lt;a id=&#34;__codelineno-1-6&#34; name=&#34;__codelineno-1-6&#34; href=&#34;#__codelineno-1-6&#34;&gt;&lt;/a&gt;Enter selection (default: basic) [1..4]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;Choose 1 here by simply typing &lt;code&gt;1&lt;/code&gt;, or just hit enter since &lt;code&gt;basic&lt;/code&gt; is the default.This will create a basic Gradle project.&lt;/p&gt;&lt;p&gt;If you want to create a library instead, you can choose &lt;code&gt;3&lt;/code&gt;.However, all this does is to apply some basic plugins beforehand, which we will get through later anyway.&lt;/p&gt;&lt;p&gt;The next step is to select the language for our Gradle DSL&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-2-1&#34;&gt;&lt;a id=&#34;__codelineno-2-1&#34; name=&#34;__codelineno-2-1&#34; href=&#34;#__codelineno-2-1&#34;&gt;&lt;/a&gt;Select build script DSL:&lt;/span&gt;&lt;span id=&#34;__span-2-2&#34;&gt;&lt;a id=&#34;__codelineno-2-2&#34; name=&#34;__codelineno-2-2&#34; href=&#34;#__codelineno-2-2&#34;&gt;&lt;/a&gt; 1: Kotlin&lt;/span&gt;&lt;span id=&#34;__span-2-3&#34;&gt;&lt;a id=&#34;__codelineno-2-3&#34; name=&#34;__codelineno-2-3&#34; href=&#34;#__codelineno-2-3&#34;&gt;&lt;/a&gt; 2: Groovy&lt;/span&gt;&lt;span id=&#34;__span-2-4&#34;&gt;&lt;a id=&#34;__codelineno-2-4&#34; name=&#34;__codelineno-2-4&#34; href=&#34;#__codelineno-2-4&#34;&gt;&lt;/a&gt;Enter selection (default: Kotlin) [1..2]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;Again, choose 1 by typing &lt;code&gt;1&lt;/code&gt; or just hit enter since Kotlin is the default.&lt;/p&gt;&lt;p&gt;Now we need to enter our project name.I recommend using your plugin name in lower case and adding &lt;code&gt;-&lt;/code&gt; where there would be spaces.So &lt;code&gt;MyPlugin&lt;/code&gt; becomes &lt;code&gt;my-plugin&lt;/code&gt;.&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-3-1&#34;&gt;&lt;a id=&#34;__codelineno-3-1&#34; name=&#34;__codelineno-3-1&#34; href=&#34;#__codelineno-3-1&#34;&gt;&lt;/a&gt;Project name (default: directory): &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;&lt;p&gt;Next is a question about Gradle stuff. &lt;br /&gt;&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-4-1&#34;&gt;&lt;a id=&#34;__codelineno-4-1&#34; name=&#34;__codelineno-4-1&#34; href=&#34;#__codelineno-4-1&#34;&gt;&lt;/a&gt;Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no] &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;I recommend using the default no. So just press enter or type &lt;code&gt;no&lt;/code&gt;.And you&#39;re done.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2 id=&#34;gradle-files&#34;&gt;Gradle files&lt;/h2&gt;&lt;p&gt;Now you have a bunch of new files and directories.Let&#39;s go through them one by one.&lt;/p&gt;&lt;h3 id=&#34;gradle&#34;&gt;.gradle&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;.gradle&lt;/code&gt; directory contains internal gradle data.It should be added to your gitignore if not done already.&lt;/p&gt;&lt;h3 id=&#34;gradle-directory&#34;&gt;gradle directory&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;gradle&lt;/code&gt; directory contains the wrapper directory, which in turn contains a &lt;code&gt;gradle-wrapper.jar&lt;/code&gt;, which is your Gradle wrapper.This is your portable Gradle installation as mentioned earlier.&lt;/p&gt;&lt;p&gt;The &lt;code&gt;gradle-wrapper.properties&lt;/code&gt; contains the settings of the wrapper.The most important part is the version.You can also change it here if you forgot to use the command shown in the previous &lt;a href=&#34;#the-gradle-wrapper&#34;&gt;section&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;This directly should always be pushed to git&lt;/p&gt;&lt;h3 id=&#34;gradlew-and-gradlewbat&#34;&gt;gradlew and gradlew.bat&lt;/h3&gt;&lt;p&gt;These are the Gradle wrapper files. You use them to execute your gradle wrapper.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;gradlew&lt;/code&gt; for Unix systems, Windows powershell and git bash on Windows.&lt;/li&gt;&lt;li&gt;&lt;code&gt;gradlew.bat&lt;/code&gt; for the windows cmd&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&#34;buildgradlekts&#34;&gt;build.gradle.kts&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;build.gradle.kts&lt;/code&gt; is the heart of our project.Almost all the configuration of our project is done in this file.It contains dependencies, repositories and lots of other stuff.We will go over the sections in here in depth,&lt;/p&gt;&lt;h3 id=&#34;settingsgradlekts&#34;&gt;settings.gradle.kts&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;settings.gradle.kts&lt;/code&gt; can be used to apply project wide settings such as plugin repositories (not dependency repositories!).You can also define submodules here if you have a multi-module project, or create a &lt;a href=&#34;https://docs.gradle.org/current/userguide/platforms.html&#34;&gt;version catalogue&lt;/a&gt;.Currently, it only holds our project name.&lt;/p&gt;&lt;h3 id=&#34;src-directory&#34;&gt;src directory&lt;/h3&gt;&lt;p&gt;While this directory is not strictly seen as part of Gradle, it is still important to have a specific structure:&lt;/p&gt;&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-5-1&#34;&gt;&lt;a id=&#34;__codelineno-5-1&#34; name=&#34;__codelineno-5-1&#34; href=&#34;#__codelineno-5-1&#34;&gt;&lt;/a&gt;.&lt;/span&gt;&lt;span id=&#34;__span-5-2&#34;&gt;&lt;a id=&#34;__codelineno-5-2&#34; name=&#34;__codelineno-5-2&#34; href=&#34;#__codelineno-5-2&#34;&gt;&lt;/a&gt;└── src/&lt;/span&gt;&lt;span id=&#34;__span-5-3&#34;&gt;&lt;a id=&#34;__codelineno-5-3&#34; name=&#34;__codelineno-5-3&#34; href=&#34;#__codelineno-5-3&#34;&gt;&lt;/a&gt; ├── main/&lt;/span&gt;&lt;span id=&#34;__span-5-4&#34;&gt;&lt;a id=&#34;__codelineno-5-4&#34; name=&#34;__codelineno-5-4&#34; href=&#34;#__codelineno-5-4&#34;&gt;&lt;/a&gt; │ ├── java&lt;/span&gt;&lt;span id=&#34;__span-5-5&#34;&gt;&lt;a id=&#34;__codelineno-5-5&#34; name=&#34;__codelineno-5-5&#34; href=&#34;#__codelineno-5-5&#34;&gt;&lt;/a&gt; │ └── resources&lt;/span&gt;&lt;span id=&#34;__span-5-6&#34;&gt;&lt;a id=&#34;__codelineno-5-6&#34; name=&#34;__codelineno-5-6&#34; href=&#34;#__codelineno-5-6&#34;&gt;&lt;/a&gt; └── test/&lt;/span&gt;&lt;span id=&#34;__span-5-7&#34;&gt;&lt;a id=&#34;__codelineno-5-7&#34; name=&#34;__codelineno-5-7&#34; href=&#34;#__codelineno-5-7&#34;&gt;&lt;/a&gt; ├── java&lt;/span&gt;&lt;span id=&#34;__span-5-8&#34;&gt;&lt;a id=&#34;__codelineno-5-8&#34; name=&#34;__codelineno-5-8&#34; href=&#34;#__codelineno-5-8&#34;&gt;&lt;/a&gt; └── resources&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If these directories do not exist in your src directory, please create them.&lt;/p&gt;&lt;p&gt;If you are creating a Kotlin project instead of a Java project the &lt;code&gt;java&lt;/code&gt; directory will be named &lt;code&gt;kotlin&lt;/code&gt; instead.&lt;/p&gt;&lt;p&gt;the &lt;code&gt;src/main&lt;/code&gt; directory contains your programm logic and resources which will be compiled and moved into your jar in the end.&lt;/p&gt;&lt;p&gt;The &lt;code&gt;src/test&lt;/code&gt; directory is for unit testing.&lt;/p&gt;&lt;h2 id=&#34;the-basic-buildgradlekts&#34;&gt;The basic build.gradle.kts&lt;/h2&gt;&lt;p&gt;Let&#39;s start by taking a look at our build.gradle.kts.It should be empty at the moment if you used the cli approach, or already have some stuff in it if you set it up using IntelliJ.&lt;/p&gt;&lt;p&gt;Let&#39;s get you on the same page by adding some sections to start with a fresh file.&lt;/p&gt;&lt;h3 id=&#34;the-plugin-section&#34;&gt;The plugin section&lt;/h3&gt;&lt;p&gt;The top section of our file will always be the &lt;code&gt;plugins&lt;/code&gt; section.So we start by adding it first.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-6-1&#34;&gt;&lt;a id=&#34;__codelineno-6-1&#34; name=&#34;__codelineno-6-1&#34; href=&#34;#__codelineno-6-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-6-2&#34;&gt;&lt;a id=&#34;__codelineno-6-2&#34; name=&#34;__codelineno-6-2&#34; href=&#34;#__codelineno-6-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The whole logic of Gradle is that plugins add tasks that we execute.Since we want to build a Java application, we need to add the &lt;code&gt;java&lt;/code&gt; plugin.This can be done by simply adding &lt;code&gt;java&lt;/code&gt; to the &lt;code&gt;plugins&lt;/code&gt; block.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-7-1&#34;&gt;&lt;a id=&#34;__codelineno-7-1&#34; name=&#34;__codelineno-7-1&#34; href=&#34;#__codelineno-7-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-2&#34;&gt;&lt;a id=&#34;__codelineno-7-2&#34; name=&#34;__codelineno-7-2&#34; href=&#34;#__codelineno-7-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-3&#34;&gt;&lt;a id=&#34;__codelineno-7-3&#34; name=&#34;__codelineno-7-3&#34; href=&#34;#__codelineno-7-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And that&#39;s it. We are done with our plugin setup for now.&lt;/p&gt;&lt;p&gt;While we have added the java plugin now to our project, it lacks the configuration. Usually plugins have some kind of general configuration block, beside the tasks they add.&lt;/p&gt;&lt;h4 id=&#34;plugin-import-syntax&#34;&gt;Plugin import syntax&lt;/h4&gt;&lt;p&gt;We imported the java plugin with the short import syntax.This can be done with every plugin that is bundled with gradle already.If our plugin name is not only consisting of letters we need to quote our plugin with backticks. The &lt;code&gt;maven-publish&lt;/code&gt; plugin would be imported like this:&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-8-1&#34;&gt;&lt;a id=&#34;__codelineno-8-1&#34; name=&#34;__codelineno-8-1&#34; href=&#34;#__codelineno-8-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-8-2&#34;&gt;&lt;a id=&#34;__codelineno-8-2&#34; name=&#34;__codelineno-8-2&#34; href=&#34;#__codelineno-8-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;err&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;maven&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;publish&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-8-3&#34;&gt;&lt;a id=&#34;__codelineno-8-3&#34; name=&#34;__codelineno-8-3&#34; href=&#34;#__codelineno-8-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The normal syntax for importing a bundled plugin would be actually like this:&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-9-1&#34;&gt;&lt;a id=&#34;__codelineno-9-1&#34; name=&#34;__codelineno-9-1&#34; href=&#34;#__codelineno-9-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-9-2&#34;&gt;&lt;a id=&#34;__codelineno-9-2&#34; name=&#34;__codelineno-9-2&#34; href=&#34;#__codelineno-9-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;java&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-9-3&#34;&gt;&lt;a id=&#34;__codelineno-9-3&#34; name=&#34;__codelineno-9-3&#34; href=&#34;#__codelineno-9-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you need to import a plugin that is not bundled in gradle you need to also supply a version. In that case all you need to do is to define the version of the plugin after the id.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-10-1&#34;&gt;&lt;a id=&#34;__codelineno-10-1&#34; name=&#34;__codelineno-10-1&#34; href=&#34;#__codelineno-10-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-2&#34;&gt;&lt;a id=&#34;__codelineno-10-2&#34; name=&#34;__codelineno-10-2&#34; href=&#34;#__codelineno-10-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;com.gradleup.shadow&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;9.4.1&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-3&#34;&gt;&lt;a id=&#34;__codelineno-10-3&#34; name=&#34;__codelineno-10-3&#34; href=&#34;#__codelineno-10-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;details&gt;&lt;summary&gt;Checkpoint&lt;/summary&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-11-1&#34;&gt;&lt;a id=&#34;__codelineno-11-1&#34; name=&#34;__codelineno-11-1&#34; href=&#34;#__codelineno-11-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-2&#34;&gt;&lt;a id=&#34;__codelineno-11-2&#34; name=&#34;__codelineno-11-2&#34; href=&#34;#__codelineno-11-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-3&#34;&gt;&lt;a id=&#34;__codelineno-11-3&#34; name=&#34;__codelineno-11-3&#34; href=&#34;#__codelineno-11-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;h3 id=&#34;declare-group-and-version&#34;&gt;Declare group and version&lt;/h3&gt;&lt;p&gt;Now we need to declare our group and version.This is not a section, just two values we assign.Your group id, if not already set, should be a domain you &lt;strong&gt;own&lt;/strong&gt; in reverse order.If you don&#39;t have a domain, see my other &lt;a href=&#34;../../../../2023/08/03/the-plugin-main-class-a-constant-naming-discussion/#i-dont-have-a-domain&#34;&gt;post&lt;/a&gt;.I recommend using &lt;a href=&#34;https://dev.to/nialljoemaher/an-introduction-to-semantic-versioning-26n9&#34;&gt;semantic versioning (semver)&lt;/a&gt; for your version.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-12-1&#34;&gt;&lt;a id=&#34;__codelineno-12-1&#34; name=&#34;__codelineno-12-1&#34; href=&#34;#__codelineno-12-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;dev.chojo&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// Please use your own group id c:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-12-2&#34;&gt;&lt;a id=&#34;__codelineno-12-2&#34; name=&#34;__codelineno-12-2&#34; href=&#34;#__codelineno-12-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;1.0.0-SNAPSHOT&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;details&gt;&lt;summary&gt;Checkpoint&lt;/summary&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-13-1&#34;&gt;&lt;a id=&#34;__codelineno-13-1&#34; name=&#34;__codelineno-13-1&#34; href=&#34;#__codelineno-13-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-13-2&#34;&gt;&lt;a id=&#34;__codelineno-13-2&#34; name=&#34;__codelineno-13-2&#34; href=&#34;#__codelineno-13-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-13-3&#34;&gt;&lt;a id=&#34;__codelineno-13-3&#34; name=&#34;__codelineno-13-3&#34; href=&#34;#__codelineno-13-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-13-4&#34;&gt;&lt;a id=&#34;__codelineno-13-4&#34; name=&#34;__codelineno-13-4&#34; href=&#34;#__codelineno-13-4&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-13-5&#34;&gt;&lt;a id=&#34;__codelineno-13-5&#34; name=&#34;__codelineno-13-5&#34; href=&#34;#__codelineno-13-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;dev.chojo&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// Please use your own group id c:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-13-6&#34;&gt;&lt;a id=&#34;__codelineno-13-6&#34; name=&#34;__codelineno-13-6&#34; href=&#34;#__codelineno-13-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;1.0.0-SNAPSHOT&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;h3 id=&#34;repositories-section&#34;&gt;Repositories section&lt;/h3&gt;&lt;p&gt;The repositories section is where we define which repositories our dependencies will be in.&lt;/p&gt;&lt;p&gt;The repository section looks like this:&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-14-1&#34;&gt;&lt;a id=&#34;__codelineno-14-1&#34; name=&#34;__codelineno-14-1&#34; href=&#34;#__codelineno-14-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;repositories&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-14-2&#34;&gt;&lt;a id=&#34;__codelineno-14-2&#34; name=&#34;__codelineno-14-2&#34; href=&#34;#__codelineno-14-2&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-14-3&#34;&gt;&lt;a id=&#34;__codelineno-14-3&#34; name=&#34;__codelineno-14-3&#34; href=&#34;#__codelineno-14-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Order is important!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The order in which you assign repositories in this section is the order in which Gradle will search for dependencies.It will take the first found location where the dependency exists.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;To add a repository, we can use two different ways.&lt;/p&gt;&lt;h4 id=&#34;predefined-repositories&#34;&gt;Predefined Repositories&lt;/h4&gt;&lt;p&gt;Gradle provides convenience functions to import common repositories&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;mavenCentral()&lt;/code&gt; &lt;br /&gt; This is the Maven Central repository where most of the dependencies we will need are located. If you have been using Maven: With Maven you did not need to import this specifically, but with Gradle you will need to do so.&lt;/li&gt;&lt;li&gt;&lt;code&gt;mavenLocal()&lt;/code&gt; This imports your local maven repository. This should usually not be used on public sources since it breaks the assumption that a project can be build everywhere.&lt;/li&gt;&lt;/ul&gt;&lt;h4 id=&#34;custom-repositories&#34;&gt;Custom repositories&lt;/h4&gt;&lt;p&gt;If a dependency happens to not be located in the Maven Central repository or your local Maven repository, we need to import a custom repository. You can easily do that with the &lt;code&gt;maven()&lt;/code&gt; function. &lt;/p&gt;&lt;p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-15-1&#34;&gt;&lt;a id=&#34;__codelineno-15-1&#34; name=&#34;__codelineno-15-1&#34; href=&#34;#__codelineno-15-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;repositories&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-15-2&#34;&gt;&lt;a id=&#34;__codelineno-15-2&#34; name=&#34;__codelineno-15-2&#34; href=&#34;#__codelineno-15-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;maven&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;https://repo.papermc.io/repository/maven-public/&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-15-3&#34;&gt;&lt;a id=&#34;__codelineno-15-3&#34; name=&#34;__codelineno-15-3&#34; href=&#34;#__codelineno-15-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;This will import the &lt;code&gt;paper-mc&lt;/code&gt; repository. Of course, you can do the same with any other repository.&lt;/p&gt;&lt;details&gt;&lt;summary&gt;Checkpoint&lt;/summary&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-16-1&#34;&gt;&lt;a id=&#34;__codelineno-16-1&#34; name=&#34;__codelineno-16-1&#34; href=&#34;#__codelineno-16-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-2&#34;&gt;&lt;a id=&#34;__codelineno-16-2&#34; name=&#34;__codelineno-16-2&#34; href=&#34;#__codelineno-16-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-3&#34;&gt;&lt;a id=&#34;__codelineno-16-3&#34; name=&#34;__codelineno-16-3&#34; href=&#34;#__codelineno-16-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-4&#34;&gt;&lt;a id=&#34;__codelineno-16-4&#34; name=&#34;__codelineno-16-4&#34; href=&#34;#__codelineno-16-4&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-5&#34;&gt;&lt;a id=&#34;__codelineno-16-5&#34; name=&#34;__codelineno-16-5&#34; href=&#34;#__codelineno-16-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;dev.chojo&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// Please use your own group id c:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-6&#34;&gt;&lt;a id=&#34;__codelineno-16-6&#34; name=&#34;__codelineno-16-6&#34; href=&#34;#__codelineno-16-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;1.0.0-SNAPSHOT&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-7&#34;&gt;&lt;a id=&#34;__codelineno-16-7&#34; name=&#34;__codelineno-16-7&#34; href=&#34;#__codelineno-16-7&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-8&#34;&gt;&lt;a id=&#34;__codelineno-16-8&#34; name=&#34;__codelineno-16-8&#34; href=&#34;#__codelineno-16-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;repositories&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-9&#34;&gt;&lt;a id=&#34;__codelineno-16-9&#34; name=&#34;__codelineno-16-9&#34; href=&#34;#__codelineno-16-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mavenCentral&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-10&#34;&gt;&lt;a id=&#34;__codelineno-16-10&#34; name=&#34;__codelineno-16-10&#34; href=&#34;#__codelineno-16-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;h3 id=&#34;dependencies-section&#34;&gt;Dependencies section&lt;/h3&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;If you have test imports from junit here, you can delete them for now.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Inside the dependencies section, we can define two different dependency types for now:&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-17-1&#34;&gt;&lt;a id=&#34;__codelineno-17-1&#34; name=&#34;__codelineno-17-1&#34; href=&#34;#__codelineno-17-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-17-2&#34;&gt;&lt;a id=&#34;__codelineno-17-2&#34; name=&#34;__codelineno-17-2&#34; href=&#34;#__codelineno-17-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;compileOnly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;io.papermc.paper:paper-api:26.1.2.build.63-stable&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-17-3&#34;&gt;&lt;a id=&#34;__codelineno-17-3&#34; name=&#34;__codelineno-17-3&#34; href=&#34;#__codelineno-17-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;implementation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.chojo.sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;2.3.9&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-17-4&#34;&gt;&lt;a id=&#34;__codelineno-17-4&#34; name=&#34;__codelineno-17-4&#34; href=&#34;#__codelineno-17-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;SADU is here only for demonstration purposes and not mandatory required&lt;/p&gt;&lt;/div&gt;&lt;p&gt;I have used two different ways of declaring dependencies here.Both are valid.You can either declare them as one string or as three separate strings.&lt;/p&gt;&lt;p&gt;&lt;a href=&#34;https://github.com/rainbowdashlabs/sadu&#34;&gt;SADU&lt;/a&gt; is a library I wrote to make using databases easier for beginners. Have a look at it c:&lt;/p&gt;&lt;p&gt;When we run our application we rely on the classes we are using to be there. In java there are multiple ways to make those classes of our dependency available.In this step we don&#39;t care yet how those classes will be made available. At this point we only care about who is responsible that the classes will be there. &lt;/p&gt;&lt;div class=&#34;tabbed-set tabbed-alternate&#34; data-tabs=&#34;2:2&#34;&gt;&lt;input checked=&#34;checked&#34; id=&#34;__tabbed_2_1&#34; name=&#34;__tabbed_2&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_2_2&#34; name=&#34;__tabbed_2&#34; type=&#34;radio&#34; /&gt;&lt;div class=&#34;tabbed-labels&#34;&gt;&lt;label for=&#34;__tabbed_2_1&#34;&gt;As implementation&lt;/label&gt;&lt;label for=&#34;__tabbed_2_2&#34;&gt;As compileOnly&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-content&#34;&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;If we are responsible for the classes to be there, we use &lt;code&gt;implementation&lt;/code&gt;. This is for example the case when we write a Minecraft plugin for a paper server and we want to use a library that is not included in paper.&lt;/p&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;The &lt;code&gt;compileOnly&lt;/code&gt; import means that the classes we are depending on will be there and that we are not responsible to ensure that they are there.If we stay in the Minecraft context, that means that every other plugin like FAWE, LuckPerms and in general any other api by other plugins or the server itself will be imported as &lt;code&gt;compileOnly&lt;/code&gt;.APIs that are not available as plugins on the server, which can be the case for Inventory APIs for example, must of course be imported as an &lt;code&gt;implementation&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;There are other types of import like &lt;code&gt;runtimeOnly&lt;/code&gt;, but those two are the most important for now.&lt;/p&gt;&lt;/div&gt;&lt;h3 id=&#34;tasks-section&#34;&gt;Tasks section&lt;/h3&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;You can delete anything currently in your tasks section &lt;/p&gt;&lt;/div&gt;&lt;p&gt;I told you earlier that everything in Gradle works with tasks.So there has to be a way to configure them, and this is where the tasks section comes in.For now, we will just start with a simple empty section.In the next section you will see how we configure a task of the java plugin.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-18-1&#34;&gt;&lt;a id=&#34;__codelineno-18-1&#34; name=&#34;__codelineno-18-1&#34; href=&#34;#__codelineno-18-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;tasks&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-18-2&#34;&gt;&lt;a id=&#34;__codelineno-18-2&#34; name=&#34;__codelineno-18-2&#34; href=&#34;#__codelineno-18-2&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-18-3&#34;&gt;&lt;a id=&#34;__codelineno-18-3&#34; name=&#34;__codelineno-18-3&#34; href=&#34;#__codelineno-18-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;configuring-java&#34;&gt;Configuring Java&lt;/h2&gt;&lt;p&gt;Now that we have all the necessary sections in our file, we can finally start configuring our project.&lt;/p&gt;&lt;p&gt;As told previously plugins provide tasks and usually some own configuration for the plugin itself.Currently, the only plugin we have imported is java, so we need to configure it.As we have a &lt;code&gt;dependency&lt;/code&gt;, &lt;code&gt;repositories&lt;/code&gt; and &lt;code&gt;tasks&lt;/code&gt; sections, plugins can add own sections to our build file. Those sections are also called &lt;code&gt;extension&lt;/code&gt;.Those are not added automatically, but we can easily access them by writing the plugin name and opening a code block.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-19-1&#34;&gt;&lt;a id=&#34;__codelineno-19-1&#34; name=&#34;__codelineno-19-1&#34; href=&#34;#__codelineno-19-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-19-2&#34;&gt;&lt;a id=&#34;__codelineno-19-2&#34; name=&#34;__codelineno-19-2&#34; href=&#34;#__codelineno-19-2&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-19-3&#34;&gt;&lt;a id=&#34;__codelineno-19-3&#34; name=&#34;__codelineno-19-3&#34; href=&#34;#__codelineno-19-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;That the plugin configuration can be opened with the plugin name is a best practice.While most plugins adhere to this, it is not always the case.Consult the documentation of the plugin if you are unsure.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;This will give us access to the configuration of our java plugin.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-20-1&#34;&gt;&lt;a id=&#34;__codelineno-20-1&#34; name=&#34;__codelineno-20-1&#34; href=&#34;#__codelineno-20-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-20-2&#34;&gt;&lt;a id=&#34;__codelineno-20-2&#34; name=&#34;__codelineno-20-2&#34; href=&#34;#__codelineno-20-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;toolchain&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-20-3&#34;&gt;&lt;a id=&#34;__codelineno-20-3&#34; name=&#34;__codelineno-20-3&#34; href=&#34;#__codelineno-20-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;languageVersion&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JavaLanguageVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;of&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;21&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-20-4&#34;&gt;&lt;a id=&#34;__codelineno-20-4&#34; name=&#34;__codelineno-20-4&#34; href=&#34;#__codelineno-20-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-20-5&#34;&gt;&lt;a id=&#34;__codelineno-20-5&#34; name=&#34;__codelineno-20-5&#34; href=&#34;#__codelineno-20-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;withSourcesJar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-20-6&#34;&gt;&lt;a id=&#34;__codelineno-20-6&#34; name=&#34;__codelineno-20-6&#34; href=&#34;#__codelineno-20-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;withJavadocJar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-20-7&#34;&gt;&lt;a id=&#34;__codelineno-20-7&#34; name=&#34;__codelineno-20-7&#34; href=&#34;#__codelineno-20-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For &lt;code&gt;java&lt;/code&gt; we set the so-called toolchain.The toolchain controls the version of java used in our project.If you want to import a dependency compiled with java 21, you need to set your toolchain to 21 as well.On the other hand, using a java 21 toolchain will still allow you to import any dependency using an older version of java.&lt;/p&gt;&lt;p&gt;We also define that we want to build a source jar and a javadoc jar.This may not be important to us now, but it may be in the future.It doesn&#39;t hurt to have it in the end.&lt;/p&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;When you create a javadoc jar, you get a warning for every missing comment on classes and methods. If you don&#39;t work on a public library or plugin you can ignore them or remove the &lt;code&gt;withJavadocJar()&lt;/code&gt; call. If you work on a public library, I highly recommend to comment your code instead &lt;/p&gt;&lt;/div&gt;&lt;p&gt;In addition to configuring our java plugin, we also want to configure its tasks.There are three tasks of interest to us:&lt;/p&gt;&lt;div class=&#34;tabbed-set tabbed-alternate&#34; data-tabs=&#34;3:3&#34;&gt;&lt;input checked=&#34;checked&#34; id=&#34;__tabbed_3_1&#34; name=&#34;__tabbed_3&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_3_2&#34; name=&#34;__tabbed_3&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_3_3&#34; name=&#34;__tabbed_3&#34; type=&#34;radio&#34; /&gt;&lt;div class=&#34;tabbed-labels&#34;&gt;&lt;label for=&#34;__tabbed_3_1&#34;&gt;compileJava&lt;/label&gt;&lt;label for=&#34;__tabbed_3_2&#34;&gt;compileJavaTest&lt;/label&gt;&lt;label for=&#34;__tabbed_3_3&#34;&gt;javadoc&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-content&#34;&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;This task is responsible for compiling our Java code.&lt;/p&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;This task handles the compilation of our test code written in Java.Although we do not have any tests yet, it cannot hurt to define them anyway.&lt;/p&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;This handles how our javadocs are built.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;All we want to define for these tasks is that we want to use &lt;code&gt;UTF-8&lt;/code&gt; encoding for them.This will avoid weird characters when using special characters.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-21-1&#34;&gt;&lt;a id=&#34;__codelineno-21-1&#34; name=&#34;__codelineno-21-1&#34; href=&#34;#__codelineno-21-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;tasks&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-2&#34;&gt;&lt;a id=&#34;__codelineno-21-2&#34; name=&#34;__codelineno-21-2&#34; href=&#34;#__codelineno-21-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;compileJava&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-3&#34;&gt;&lt;a id=&#34;__codelineno-21-3&#34; name=&#34;__codelineno-21-3&#34; href=&#34;#__codelineno-21-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;encoding&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-4&#34;&gt;&lt;a id=&#34;__codelineno-21-4&#34; name=&#34;__codelineno-21-4&#34; href=&#34;#__codelineno-21-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-5&#34;&gt;&lt;a id=&#34;__codelineno-21-5&#34; name=&#34;__codelineno-21-5&#34; href=&#34;#__codelineno-21-5&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-6&#34;&gt;&lt;a id=&#34;__codelineno-21-6&#34; name=&#34;__codelineno-21-6&#34; href=&#34;#__codelineno-21-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;compileTestJava&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-7&#34;&gt;&lt;a id=&#34;__codelineno-21-7&#34; name=&#34;__codelineno-21-7&#34; href=&#34;#__codelineno-21-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;encoding&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-8&#34;&gt;&lt;a id=&#34;__codelineno-21-8&#34; name=&#34;__codelineno-21-8&#34; href=&#34;#__codelineno-21-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-9&#34;&gt;&lt;a id=&#34;__codelineno-21-9&#34; name=&#34;__codelineno-21-9&#34; href=&#34;#__codelineno-21-9&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-10&#34;&gt;&lt;a id=&#34;__codelineno-21-10&#34; name=&#34;__codelineno-21-10&#34; href=&#34;#__codelineno-21-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;javadoc&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-11&#34;&gt;&lt;a id=&#34;__codelineno-21-11&#34; name=&#34;__codelineno-21-11&#34; href=&#34;#__codelineno-21-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;encoding&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-12&#34;&gt;&lt;a id=&#34;__codelineno-21-12&#34; name=&#34;__codelineno-21-12&#34; href=&#34;#__codelineno-21-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-13&#34;&gt;&lt;a id=&#34;__codelineno-21-13&#34; name=&#34;__codelineno-21-13&#34; href=&#34;#__codelineno-21-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;On newer versions, the use of &lt;code&gt;UTF-8&lt;/code&gt; is the default.I keep it here because its a good example for easy task configuration.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;And that&#39;s the configuration for our Java plugin.&lt;/p&gt;&lt;details&gt;&lt;summary&gt;Checkpoint&lt;/summary&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-22-1&#34;&gt;&lt;a id=&#34;__codelineno-22-1&#34; name=&#34;__codelineno-22-1&#34; href=&#34;#__codelineno-22-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-2&#34;&gt;&lt;a id=&#34;__codelineno-22-2&#34; name=&#34;__codelineno-22-2&#34; href=&#34;#__codelineno-22-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-3&#34;&gt;&lt;a id=&#34;__codelineno-22-3&#34; name=&#34;__codelineno-22-3&#34; href=&#34;#__codelineno-22-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-4&#34;&gt;&lt;a id=&#34;__codelineno-22-4&#34; name=&#34;__codelineno-22-4&#34; href=&#34;#__codelineno-22-4&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-5&#34;&gt;&lt;a id=&#34;__codelineno-22-5&#34; name=&#34;__codelineno-22-5&#34; href=&#34;#__codelineno-22-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;dev.chojo&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// Please use your own group id c:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-6&#34;&gt;&lt;a id=&#34;__codelineno-22-6&#34; name=&#34;__codelineno-22-6&#34; href=&#34;#__codelineno-22-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;1.0.0-SNAPSHOT&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-7&#34;&gt;&lt;a id=&#34;__codelineno-22-7&#34; name=&#34;__codelineno-22-7&#34; href=&#34;#__codelineno-22-7&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-8&#34;&gt;&lt;a id=&#34;__codelineno-22-8&#34; name=&#34;__codelineno-22-8&#34; href=&#34;#__codelineno-22-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;repositories&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-9&#34;&gt;&lt;a id=&#34;__codelineno-22-9&#34; name=&#34;__codelineno-22-9&#34; href=&#34;#__codelineno-22-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mavenCentral&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-10&#34;&gt;&lt;a id=&#34;__codelineno-22-10&#34; name=&#34;__codelineno-22-10&#34; href=&#34;#__codelineno-22-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// External repository&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-11&#34;&gt;&lt;a id=&#34;__codelineno-22-11&#34; name=&#34;__codelineno-22-11&#34; href=&#34;#__codelineno-22-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;maven&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;https://repo.papermc.io/repository/maven-public/&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-12&#34;&gt;&lt;a id=&#34;__codelineno-22-12&#34; name=&#34;__codelineno-22-12&#34; href=&#34;#__codelineno-22-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-13&#34;&gt;&lt;a id=&#34;__codelineno-22-13&#34; name=&#34;__codelineno-22-13&#34; href=&#34;#__codelineno-22-13&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-14&#34;&gt;&lt;a id=&#34;__codelineno-22-14&#34; name=&#34;__codelineno-22-14&#34; href=&#34;#__codelineno-22-14&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-15&#34;&gt;&lt;a id=&#34;__codelineno-22-15&#34; name=&#34;__codelineno-22-15&#34; href=&#34;#__codelineno-22-15&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// We are not responsible to provide the classes from this dependency&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-16&#34;&gt;&lt;a id=&#34;__codelineno-22-16&#34; name=&#34;__codelineno-22-16&#34; href=&#34;#__codelineno-22-16&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;compileOnly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;io.papermc.paper:paper-api:1.21.1-R0.1-SNAPSHOT&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-17&#34;&gt;&lt;a id=&#34;__codelineno-22-17&#34; name=&#34;__codelineno-22-17&#34; href=&#34;#__codelineno-22-17&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// We are responsible for providing the classes from this dependency&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-18&#34;&gt;&lt;a id=&#34;__codelineno-22-18&#34; name=&#34;__codelineno-22-18&#34; href=&#34;#__codelineno-22-18&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;implementation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.chojo.sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;2.2.5&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-19&#34;&gt;&lt;a id=&#34;__codelineno-22-19&#34; name=&#34;__codelineno-22-19&#34; href=&#34;#__codelineno-22-19&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-20&#34;&gt;&lt;a id=&#34;__codelineno-22-20&#34; name=&#34;__codelineno-22-20&#34; href=&#34;#__codelineno-22-20&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-21&#34;&gt;&lt;a id=&#34;__codelineno-22-21&#34; name=&#34;__codelineno-22-21&#34; href=&#34;#__codelineno-22-21&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-22&#34;&gt;&lt;a id=&#34;__codelineno-22-22&#34; name=&#34;__codelineno-22-22&#34; href=&#34;#__codelineno-22-22&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;toolchain&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-23&#34;&gt;&lt;a id=&#34;__codelineno-22-23&#34; name=&#34;__codelineno-22-23&#34; href=&#34;#__codelineno-22-23&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;languageVersion&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JavaLanguageVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;of&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;21&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-24&#34;&gt;&lt;a id=&#34;__codelineno-22-24&#34; name=&#34;__codelineno-22-24&#34; href=&#34;#__codelineno-22-24&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-25&#34;&gt;&lt;a id=&#34;__codelineno-22-25&#34; name=&#34;__codelineno-22-25&#34; href=&#34;#__codelineno-22-25&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;withSourcesJar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-26&#34;&gt;&lt;a id=&#34;__codelineno-22-26&#34; name=&#34;__codelineno-22-26&#34; href=&#34;#__codelineno-22-26&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;withJavadocJar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-27&#34;&gt;&lt;a id=&#34;__codelineno-22-27&#34; name=&#34;__codelineno-22-27&#34; href=&#34;#__codelineno-22-27&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-28&#34;&gt;&lt;a id=&#34;__codelineno-22-28&#34; name=&#34;__codelineno-22-28&#34; href=&#34;#__codelineno-22-28&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-29&#34;&gt;&lt;a id=&#34;__codelineno-22-29&#34; name=&#34;__codelineno-22-29&#34; href=&#34;#__codelineno-22-29&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;tasks&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-30&#34;&gt;&lt;a id=&#34;__codelineno-22-30&#34; name=&#34;__codelineno-22-30&#34; href=&#34;#__codelineno-22-30&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;compileJava&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-31&#34;&gt;&lt;a id=&#34;__codelineno-22-31&#34; name=&#34;__codelineno-22-31&#34; href=&#34;#__codelineno-22-31&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;encoding&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-32&#34;&gt;&lt;a id=&#34;__codelineno-22-32&#34; name=&#34;__codelineno-22-32&#34; href=&#34;#__codelineno-22-32&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-33&#34;&gt;&lt;a id=&#34;__codelineno-22-33&#34; name=&#34;__codelineno-22-33&#34; href=&#34;#__codelineno-22-33&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-34&#34;&gt;&lt;a id=&#34;__codelineno-22-34&#34; name=&#34;__codelineno-22-34&#34; href=&#34;#__codelineno-22-34&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;compileTestJava&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-35&#34;&gt;&lt;a id=&#34;__codelineno-22-35&#34; name=&#34;__codelineno-22-35&#34; href=&#34;#__codelineno-22-35&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;encoding&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-36&#34;&gt;&lt;a id=&#34;__codelineno-22-36&#34; name=&#34;__codelineno-22-36&#34; href=&#34;#__codelineno-22-36&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-37&#34;&gt;&lt;a id=&#34;__codelineno-22-37&#34; name=&#34;__codelineno-22-37&#34; href=&#34;#__codelineno-22-37&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-38&#34;&gt;&lt;a id=&#34;__codelineno-22-38&#34; name=&#34;__codelineno-22-38&#34; href=&#34;#__codelineno-22-38&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;javadoc&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-39&#34;&gt;&lt;a id=&#34;__codelineno-22-39&#34; name=&#34;__codelineno-22-39&#34; href=&#34;#__codelineno-22-39&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;encoding&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-40&#34;&gt;&lt;a id=&#34;__codelineno-22-40&#34; name=&#34;__codelineno-22-40&#34; href=&#34;#__codelineno-22-40&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-41&#34;&gt;&lt;a id=&#34;__codelineno-22-41&#34; name=&#34;__codelineno-22-41&#34; href=&#34;#__codelineno-22-41&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;h2 id=&#34;building-the-plugin&#34;&gt;Building the plugin&lt;/h2&gt;&lt;p&gt;There is nothing stopping us from building our application now.While we could stop here and just be happy that it works, there is still a lot (and by that I mean A LOT) of room for improvement.We also still have to fix the problem of not including our library that we previously imported with &lt;code&gt;implementation&lt;/code&gt;.So while you might be tempted to call it a day, I highly recommend you keep reading!&lt;/p&gt;&lt;p&gt;For now, I will just show you the two ways to run a Gradle task.&lt;/p&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;You can run not only the build task with this, but &lt;strong&gt;any other task&lt;/strong&gt; as well.If you are using IntelliJ you can have a look at the other tasks that are available.&lt;/p&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-set tabbed-alternate&#34; data-tabs=&#34;4:2&#34;&gt;&lt;input checked=&#34;checked&#34; id=&#34;__tabbed_4_1&#34; name=&#34;__tabbed_4&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_4_2&#34; name=&#34;__tabbed_4&#34; type=&#34;radio&#34; /&gt;&lt;div class=&#34;tabbed-labels&#34;&gt;&lt;label for=&#34;__tabbed_4_1&#34;&gt;Via cli&lt;/label&gt;&lt;label for=&#34;__tabbed_4_2&#34;&gt;Via IntelliJ&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-content&#34;&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;Go into your cli and run &lt;code&gt;./gradlew build&#39; or&lt;/code&gt;gradlew.bat build&#39; depending on your operating system.&lt;/p&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;Open the Gradle window on the right. Go to Tasks -&amp;gt; Build and run the build task by clicking on it.&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;Gradle task view&#34; src=&#34;../../../../../assets/images/gradle_build.png&#34; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3 id=&#34;getting-the-build-file&#34;&gt;Getting the build file&lt;/h3&gt;&lt;p&gt;You will now find your application in &lt;code&gt;build/libs/myproject.jar&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Thank you for sticking with me so far.You now have a very good understanding of the structure of a gradle file.Its time now to choose your path c:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#34;../gradle-with-minecraft/&#34;&gt;Minecraft Specific Gradle&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&#34;../gradle-shadow-plugin/&#34;&gt;Bundle dependencies with shadow&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&#34;../gradle-application-plugin/&#34;&gt;Bundle dependencies with application plugin&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Thanks for reading!If you liked this post, or have some questions, feel free to come by my discord and have a chat!&lt;/p&gt;&lt;p&gt;&lt;a href=&#34;https://discord.chojo.dev&#34;&gt;&lt;img alt=&#34;Discord Server invite for Chojos Coding Hell&#34; src=&#34;https://discordapp.com/api/guilds/1120671561368748092/widget.png?style=banner3&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Or write me a mail at &lt;code&gt;mail [at] chojo [dot] dev&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;If you want to support me, feel free to sponsor me via &lt;a href=&#34;https://github.com/sponsors/rainbowdashlabs&#34;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</description><link>https://chojo.dev/blog/2024/08/26/gradle-basics/</link> <pubDate>Mon, 26 Aug 2024 19:17:15 +0200</pubDate><source url="https://chojo.dev/feed_rss_created.xml">Chojo - Dev Blog and Portfolio</source><guid isPermaLink="true">https://chojo.dev/blog/2024/08/26/gradle-basics/</guid> </item> <item> <title>Gradle Application Plugin</title> <author>chojo</author> <description>&lt;h1 id=&#34;gradle-application-plugin&#34;&gt;Gradle Application Plugin&lt;/h1&gt;&lt;p&gt;The application plugin is included in Gradle and is a nice alternative to shadow when your application is standalone.For example a webservice or Discord bot.It is however not useful, when your application is a minecraft plugin.Please see the &lt;a href=&#34;../gradle-with-minecraft/&#34;&gt;minecraft&lt;/a&gt; post for that.&lt;/p&gt;&lt;!-- more --&gt;&lt;p&gt;For this post I will assume that you have the build files we ended up with in the previous &lt;a href=&#34;../gradle-basics/&#34;&gt;post&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&#34;what-is-the-application-plugin&#34;&gt;What is the application plugin&lt;/h2&gt;&lt;p&gt;The application plugin is bundled in gradle and one of the easiest way to ship your application.It creates a zip and tar archive that contains the jar of all our external dependencies and our own jar.It also creates a start script for our application, that we can execute to start our application.&lt;/p&gt;&lt;h2 id=&#34;apply-the-application-plugin&#34;&gt;Apply the application plugin&lt;/h2&gt;&lt;p&gt;To apply the application plugin we add it into our plugins section&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-2&#34;&gt;&lt;a id=&#34;__codelineno-0-2&#34; name=&#34;__codelineno-0-2&#34; href=&#34;#__codelineno-0-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-3&#34;&gt;&lt;a id=&#34;__codelineno-0-3&#34; name=&#34;__codelineno-0-3&#34; href=&#34;#__codelineno-0-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;application&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-4&#34;&gt;&lt;a id=&#34;__codelineno-0-4&#34; name=&#34;__codelineno-0-4&#34; href=&#34;#__codelineno-0-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;All that is left now is some minimal configuration or the application plugin, which at least requires to define the main class.For simplicity my main class is located at &lt;code&gt;dev.chojo.myapp.Main&lt;/code&gt;.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-1-1&#34;&gt;&lt;a id=&#34;__codelineno-1-1&#34; name=&#34;__codelineno-1-1&#34; href=&#34;#__codelineno-1-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;application&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-1-2&#34;&gt;&lt;a id=&#34;__codelineno-1-2&#34; name=&#34;__codelineno-1-2&#34; href=&#34;#__codelineno-1-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mainClass&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.chojo.myapp.Main&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-1-3&#34;&gt;&lt;a id=&#34;__codelineno-1-3&#34; name=&#34;__codelineno-1-3&#34; href=&#34;#__codelineno-1-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Additionally, we can also provide some default JVM arguments for our app.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-2-1&#34;&gt;&lt;a id=&#34;__codelineno-2-1&#34; name=&#34;__codelineno-2-1&#34; href=&#34;#__codelineno-2-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;application&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-2&#34;&gt;&lt;a id=&#34;__codelineno-2-2&#34; name=&#34;__codelineno-2-2&#34; href=&#34;#__codelineno-2-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mainClass&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.chojo.myapp.Main&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-3&#34;&gt;&lt;a id=&#34;__codelineno-2-3&#34; name=&#34;__codelineno-2-3&#34; href=&#34;#__codelineno-2-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;applicationDefaultJvmArgs&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;listOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;-Dapp.language=en_US&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-4&#34;&gt;&lt;a id=&#34;__codelineno-2-4&#34; name=&#34;__codelineno-2-4&#34; href=&#34;#__codelineno-2-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;run-our-application&#34;&gt;Run our application&lt;/h2&gt;&lt;p&gt;Now that we have configured our application plugin we can use the tasks that it is providing to run our application directly.For that we simply run the run task either via the gradle tab in IntelliJ or via cli with &lt;code&gt;./gradlew run&lt;/code&gt; and &lt;code&gt;gradlew.bat run&lt;/code&gt;.&lt;/p&gt;&lt;h2 id=&#34;build-and-distribute-our-application&#34;&gt;Build and distribute our application&lt;/h2&gt;&lt;p&gt;To distribute our application we can still simply execute our build task as before.The application plugin hooks into gradle and tells it that the build process is depending on it.Once we execute our build task we find our distribution under &lt;code&gt;build/libs/distributions&lt;/code&gt;.You can now choose between a tar or zip depending on your liking.This jar contains our own application jar and the jar of every dependency imported as &lt;code&gt;implementation&lt;/code&gt; in our build file.&lt;/p&gt;&lt;h2 id=&#34;executing-the-application&#34;&gt;Executing the application&lt;/h2&gt;&lt;p&gt;To run our application we need to unzip the tar or zip and execute the sh or bat file inside the &lt;code&gt;bin&lt;/code&gt; directory.And that&#39;s already it.Your application can run everywhere, where java is installed.&lt;/p&gt;&lt;h2 id=&#34;thank-you&#34;&gt;Thank you&lt;/h2&gt;&lt;p&gt;Now you know the basics of the application plugin for gradle.If you want to know more I recommend looking at the official &lt;a href=&#34;https://docs.gradle.org/current/userguide/application_plugin.html&#34;&gt;documentation&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Thanks for reading!If you liked this post, or have some questions, feel free to come by my discord and have a chat!&lt;/p&gt;&lt;p&gt;&lt;a href=&#34;https://discord.chojo.dev&#34;&gt;&lt;img alt=&#34;Discord Server invite for Chojos Coding Hell&#34; src=&#34;https://discordapp.com/api/guilds/1120671561368748092/widget.png?style=banner3&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Or write me a mail at &lt;code&gt;mail [at] chojo [dot] dev&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;If you want to support me, feel free to sponsor me via &lt;a href=&#34;https://github.com/sponsors/rainbowdashlabs&#34;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</description><link>https://chojo.dev/blog/2024/08/26/gradle-application-plugin/</link> <pubDate>Mon, 26 Aug 2024 19:17:15 +0200</pubDate><source url="https://chojo.dev/feed_rss_created.xml">Chojo - Dev Blog and Portfolio</source><guid isPermaLink="true">https://chojo.dev/blog/2024/08/26/gradle-application-plugin/</guid> </item> <item> <title>Gradle Shadow Plugin</title> <author>chojo</author> <description>&lt;h1 id=&#34;gradle-shadow-plugin&#34;&gt;Gradle Shadow Plugin&lt;/h1&gt;&lt;p&gt;The shadow plugin for gradle is a third party plugin that is widely used.It is especially useful if you need to bundle all your dependencies in a single jar, producing a so called &lt;strong&gt;FatJar&lt;/strong&gt;.If you simply want to ship a standalone application, the &lt;a href=&#34;../gradle-application-plugin/&#34;&gt;application plugin&lt;/a&gt; might be the better choice.Shadow is ideal for minecraft plugins for example.&lt;/p&gt;&lt;!-- more --&gt;&lt;h2 id=&#34;what-is-the-shadow-plugin&#34;&gt;What is the shadow plugin&lt;/h2&gt;&lt;p&gt;The shadow plugin will copy all your dependencies imported via &lt;code&gt;implementation&lt;/code&gt; into your jar file during the building process.&lt;/p&gt;&lt;p&gt;It has also some additional features like relocating packages and setting the main class path, which I will explain later.&lt;/p&gt;&lt;h2 id=&#34;applying-the-shadow-plugin&#34;&gt;Applying the shadow plugin&lt;/h2&gt;&lt;p&gt;Since the shadow plugin is a third party plugin we now need to define the version of it additionally.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-2&#34;&gt;&lt;a id=&#34;__codelineno-0-2&#34; name=&#34;__codelineno-0-2&#34; href=&#34;#__codelineno-0-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;com.gradleup.shadow&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;9.4.1&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-3&#34;&gt;&lt;a id=&#34;__codelineno-0-3&#34; name=&#34;__codelineno-0-3&#34; href=&#34;#__codelineno-0-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Our dependencies currently look like this:&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-1-1&#34;&gt;&lt;a id=&#34;__codelineno-1-1&#34; name=&#34;__codelineno-1-1&#34; href=&#34;#__codelineno-1-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-1-2&#34;&gt;&lt;a id=&#34;__codelineno-1-2&#34; name=&#34;__codelineno-1-2&#34; href=&#34;#__codelineno-1-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;implementation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.chojo.sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;2.3.9&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-1-3&#34;&gt;&lt;a id=&#34;__codelineno-1-3&#34; name=&#34;__codelineno-1-3&#34; href=&#34;#__codelineno-1-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The purpose of shadow is to copy everything marked as &lt;code&gt;implementation&lt;/code&gt; to the output jar.&lt;/p&gt;&lt;p&gt;This is already the case if we were to run the &lt;code&gt;shadowJar&lt;/code&gt; task instead of the &lt;code&gt;build&lt;/code&gt; task.However, building our plugin without &lt;code&gt;shadowJar&lt;/code&gt; would result in a jar that is simply broken and would throw a &lt;code&gt;ClassNotFoundException&lt;/code&gt; at us at the moment we want to use classes from SADU.&lt;/p&gt;&lt;h2 id=&#34;configure-shadow-task&#34;&gt;Configure shadow task&lt;/h2&gt;&lt;p&gt;We can fix this by telling Gradle that when we run &lt;code&gt;build&lt;/code&gt; we actually want to run &lt;code&gt;shadowJar&lt;/code&gt;.We do this by configuring the &lt;code&gt;build&lt;/code&gt; task to depend on &lt;code&gt;shadowJar&lt;/code&gt;.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-2-1&#34;&gt;&lt;a id=&#34;__codelineno-2-1&#34; name=&#34;__codelineno-2-1&#34; href=&#34;#__codelineno-2-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;tasks&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-2&#34;&gt;&lt;a id=&#34;__codelineno-2-2&#34; name=&#34;__codelineno-2-2&#34; href=&#34;#__codelineno-2-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-3&#34;&gt;&lt;a id=&#34;__codelineno-2-3&#34; name=&#34;__codelineno-2-3&#34; href=&#34;#__codelineno-2-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dependsOn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;shadowJar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-4&#34;&gt;&lt;a id=&#34;__codelineno-2-4&#34; name=&#34;__codelineno-2-4&#34; href=&#34;#__codelineno-2-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-5&#34;&gt;&lt;a id=&#34;__codelineno-2-5&#34; name=&#34;__codelineno-2-5&#34; href=&#34;#__codelineno-2-5&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-6&#34;&gt;&lt;a id=&#34;__codelineno-2-6&#34; name=&#34;__codelineno-2-6&#34; href=&#34;#__codelineno-2-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;shadowJar&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-7&#34;&gt;&lt;a id=&#34;__codelineno-2-7&#34; name=&#34;__codelineno-2-7&#34; href=&#34;#__codelineno-2-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mergeServiceFiles&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-8&#34;&gt;&lt;a id=&#34;__codelineno-2-8&#34; name=&#34;__codelineno-2-8&#34; href=&#34;#__codelineno-2-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-9&#34;&gt;&lt;a id=&#34;__codelineno-2-9&#34; name=&#34;__codelineno-2-9&#34; href=&#34;#__codelineno-2-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Additionally, we want to merge service files.&lt;/p&gt;&lt;h3 id=&#34;service-files&#34;&gt;Service files&lt;/h3&gt;&lt;p&gt;If you have dependencies that provide services (which a lot actually do) You should add &lt;code&gt;mergeServiceFiles()&lt;/code&gt; to your &lt;code&gt;shadowJar&lt;/code&gt; task configuration. This makes shadow to merge all service files of all your dependencies together.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-3-1&#34;&gt;&lt;a id=&#34;__codelineno-3-1&#34; name=&#34;__codelineno-3-1&#34; href=&#34;#__codelineno-3-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;tasks&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-2&#34;&gt;&lt;a id=&#34;__codelineno-3-2&#34; name=&#34;__codelineno-3-2&#34; href=&#34;#__codelineno-3-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;shadowJar&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-3&#34;&gt;&lt;a id=&#34;__codelineno-3-3&#34; name=&#34;__codelineno-3-3&#34; href=&#34;#__codelineno-3-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mergeServiceFiles&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-4&#34;&gt;&lt;a id=&#34;__codelineno-3-4&#34; name=&#34;__codelineno-3-4&#34; href=&#34;#__codelineno-3-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-5&#34;&gt;&lt;a id=&#34;__codelineno-3-5&#34; name=&#34;__codelineno-3-5&#34; href=&#34;#__codelineno-3-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;minimize&#34;&gt;Minimize&lt;/h3&gt;&lt;p&gt;If you have a very large jar because you have a lot of dependencies, it might be beneficial to minimize your jar. This will remove any uncalled class of your dependencies. But be aware that this will not detect classes loaded via reflections, e.g. database drivers.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-4-1&#34;&gt;&lt;a id=&#34;__codelineno-4-1&#34; name=&#34;__codelineno-4-1&#34; href=&#34;#__codelineno-4-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;tasks&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-2&#34;&gt;&lt;a id=&#34;__codelineno-4-2&#34; name=&#34;__codelineno-4-2&#34; href=&#34;#__codelineno-4-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;shadowJar&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-3&#34;&gt;&lt;a id=&#34;__codelineno-4-3&#34; name=&#34;__codelineno-4-3&#34; href=&#34;#__codelineno-4-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;minimize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-4&#34;&gt;&lt;a id=&#34;__codelineno-4-4&#34; name=&#34;__codelineno-4-4&#34; href=&#34;#__codelineno-4-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-5&#34;&gt;&lt;a id=&#34;__codelineno-4-5&#34; name=&#34;__codelineno-4-5&#34; href=&#34;#__codelineno-4-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;relocation&#34;&gt;Relocation&lt;/h3&gt;&lt;div class=&#34;admonition warn&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Warn&lt;/p&gt;&lt;p&gt;This part is crucial when shading in minecraft plugins&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Now that our libraries are shaded we need to do something called relocation.This is important to avoid conflicts with other plugins when you shade the same library.To do this we need to configure it, but this time we are not configuring the plugin, but the task called &lt;code&gt;shadowJar&lt;/code&gt;.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-5-1&#34;&gt;&lt;a id=&#34;__codelineno-5-1&#34; name=&#34;__codelineno-5-1&#34; href=&#34;#__codelineno-5-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;tasks&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-2&#34;&gt;&lt;a id=&#34;__codelineno-5-2&#34; name=&#34;__codelineno-5-2&#34; href=&#34;#__codelineno-5-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;shadowJar&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-3&#34;&gt;&lt;a id=&#34;__codelineno-5-3&#34; name=&#34;__codelineno-5-3&#34; href=&#34;#__codelineno-5-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mapping&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mapOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.chojo.sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-4&#34;&gt;&lt;a id=&#34;__codelineno-5-4&#34; name=&#34;__codelineno-5-4&#34; href=&#34;#__codelineno-5-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;base&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;dev.chojo.myapp.libs.&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-5&#34;&gt;&lt;a id=&#34;__codelineno-5-5&#34; name=&#34;__codelineno-5-5&#34; href=&#34;#__codelineno-5-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pattern&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mapping&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;relocate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pattern&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;${base}${name}&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-6&#34;&gt;&lt;a id=&#34;__codelineno-5-6&#34; name=&#34;__codelineno-5-6&#34; href=&#34;#__codelineno-5-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-7&#34;&gt;&lt;a id=&#34;__codelineno-5-7&#34; name=&#34;__codelineno-5-7&#34; href=&#34;#__codelineno-5-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What this basically does is:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;We define a map with the packages we want to move and the directory we want them to move to.&lt;/li&gt;&lt;li&gt;We define the root of the new location of all our shaded libraries.&lt;/li&gt;&lt;li&gt;For each entry in our map, we call the relocate function of our task.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;So what does relocation do?&lt;br /&gt;Consider the class &lt;code&gt;de.chojo.sadu.Sadu&lt;/code&gt;. After the relocation it will be located at &lt;code&gt;dev.chojo.myapp.libs.sadu.Sadu&lt;/code&gt;.Now that it is in your namespace and our plugin, it is no longer possible for it to collide with another plugin.Shadow will also replace any path to the class in your code with the new relocated path.&lt;/p&gt;&lt;p&gt;The path to relocate is usually the group id of the dependency you want to relocate.Beware that dependencies may have own dependencies that are shaded as well.Those dependencies might have other group ids that require explicit relocation.&lt;/p&gt;&lt;h2 id=&#34;bundling-applications&#34;&gt;Bundling applications&lt;/h2&gt;&lt;p&gt;If your application is not a plugin, and you want to run your jar via &lt;code&gt;java -jar&lt;/code&gt; you additionally need to define a main class. You can do that easily in the shadowJar task as well.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-6-1&#34;&gt;&lt;a id=&#34;__codelineno-6-1&#34; name=&#34;__codelineno-6-1&#34; href=&#34;#__codelineno-6-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;tasks&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-6-2&#34;&gt;&lt;a id=&#34;__codelineno-6-2&#34; name=&#34;__codelineno-6-2&#34; href=&#34;#__codelineno-6-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;shadowJar&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-6-3&#34;&gt;&lt;a id=&#34;__codelineno-6-3&#34; name=&#34;__codelineno-6-3&#34; href=&#34;#__codelineno-6-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;manifest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-6-4&#34;&gt;&lt;a id=&#34;__codelineno-6-4&#34; name=&#34;__codelineno-6-4&#34; href=&#34;#__codelineno-6-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;attributes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mapOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Main-Class&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;dev.chojo.myapp.Main&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-6-5&#34;&gt;&lt;a id=&#34;__codelineno-6-5&#34; name=&#34;__codelineno-6-5&#34; href=&#34;#__codelineno-6-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-6-6&#34;&gt;&lt;a id=&#34;__codelineno-6-6&#34; name=&#34;__codelineno-6-6&#34; href=&#34;#__codelineno-6-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-6-7&#34;&gt;&lt;a id=&#34;__codelineno-6-7&#34; name=&#34;__codelineno-6-7&#34; href=&#34;#__codelineno-6-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;details&gt;&lt;summary&gt;Checkpoint&lt;/summary&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-7-1&#34;&gt;&lt;a id=&#34;__codelineno-7-1&#34; name=&#34;__codelineno-7-1&#34; href=&#34;#__codelineno-7-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-2&#34;&gt;&lt;a id=&#34;__codelineno-7-2&#34; name=&#34;__codelineno-7-2&#34; href=&#34;#__codelineno-7-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;com.gradleup.shadow&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;9.4.1&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-3&#34;&gt;&lt;a id=&#34;__codelineno-7-3&#34; name=&#34;__codelineno-7-3&#34; href=&#34;#__codelineno-7-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-4&#34;&gt;&lt;a id=&#34;__codelineno-7-4&#34; name=&#34;__codelineno-7-4&#34; href=&#34;#__codelineno-7-4&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-5&#34;&gt;&lt;a id=&#34;__codelineno-7-5&#34; name=&#34;__codelineno-7-5&#34; href=&#34;#__codelineno-7-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;dev.chojo&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// Please use your own group id c:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-6&#34;&gt;&lt;a id=&#34;__codelineno-7-6&#34; name=&#34;__codelineno-7-6&#34; href=&#34;#__codelineno-7-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;1.0.0-SNAPSHOT&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-7&#34;&gt;&lt;a id=&#34;__codelineno-7-7&#34; name=&#34;__codelineno-7-7&#34; href=&#34;#__codelineno-7-7&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-8&#34;&gt;&lt;a id=&#34;__codelineno-7-8&#34; name=&#34;__codelineno-7-8&#34; href=&#34;#__codelineno-7-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;repositories&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-9&#34;&gt;&lt;a id=&#34;__codelineno-7-9&#34; name=&#34;__codelineno-7-9&#34; href=&#34;#__codelineno-7-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mavenCentral&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-10&#34;&gt;&lt;a id=&#34;__codelineno-7-10&#34; name=&#34;__codelineno-7-10&#34; href=&#34;#__codelineno-7-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-11&#34;&gt;&lt;a id=&#34;__codelineno-7-11&#34; name=&#34;__codelineno-7-11&#34; href=&#34;#__codelineno-7-11&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-12&#34;&gt;&lt;a id=&#34;__codelineno-7-12&#34; name=&#34;__codelineno-7-12&#34; href=&#34;#__codelineno-7-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-13&#34;&gt;&lt;a id=&#34;__codelineno-7-13&#34; name=&#34;__codelineno-7-13&#34; href=&#34;#__codelineno-7-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;implementation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.chojo.sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;2.3.9&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-14&#34;&gt;&lt;a id=&#34;__codelineno-7-14&#34; name=&#34;__codelineno-7-14&#34; href=&#34;#__codelineno-7-14&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-15&#34;&gt;&lt;a id=&#34;__codelineno-7-15&#34; name=&#34;__codelineno-7-15&#34; href=&#34;#__codelineno-7-15&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-16&#34;&gt;&lt;a id=&#34;__codelineno-7-16&#34; name=&#34;__codelineno-7-16&#34; href=&#34;#__codelineno-7-16&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-17&#34;&gt;&lt;a id=&#34;__codelineno-7-17&#34; name=&#34;__codelineno-7-17&#34; href=&#34;#__codelineno-7-17&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;toolchain&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-18&#34;&gt;&lt;a id=&#34;__codelineno-7-18&#34; name=&#34;__codelineno-7-18&#34; href=&#34;#__codelineno-7-18&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;languageVersion&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JavaLanguageVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;of&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;21&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-19&#34;&gt;&lt;a id=&#34;__codelineno-7-19&#34; name=&#34;__codelineno-7-19&#34; href=&#34;#__codelineno-7-19&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-20&#34;&gt;&lt;a id=&#34;__codelineno-7-20&#34; name=&#34;__codelineno-7-20&#34; href=&#34;#__codelineno-7-20&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;withSourcesJar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-21&#34;&gt;&lt;a id=&#34;__codelineno-7-21&#34; name=&#34;__codelineno-7-21&#34; href=&#34;#__codelineno-7-21&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;withJavadocJar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-22&#34;&gt;&lt;a id=&#34;__codelineno-7-22&#34; name=&#34;__codelineno-7-22&#34; href=&#34;#__codelineno-7-22&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-23&#34;&gt;&lt;a id=&#34;__codelineno-7-23&#34; name=&#34;__codelineno-7-23&#34; href=&#34;#__codelineno-7-23&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-24&#34;&gt;&lt;a id=&#34;__codelineno-7-24&#34; name=&#34;__codelineno-7-24&#34; href=&#34;#__codelineno-7-24&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;tasks&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-25&#34;&gt;&lt;a id=&#34;__codelineno-7-25&#34; name=&#34;__codelineno-7-25&#34; href=&#34;#__codelineno-7-25&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-26&#34;&gt;&lt;a id=&#34;__codelineno-7-26&#34; name=&#34;__codelineno-7-26&#34; href=&#34;#__codelineno-7-26&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dependsOn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;shadowJar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-27&#34;&gt;&lt;a id=&#34;__codelineno-7-27&#34; name=&#34;__codelineno-7-27&#34; href=&#34;#__codelineno-7-27&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-28&#34;&gt;&lt;a id=&#34;__codelineno-7-28&#34; name=&#34;__codelineno-7-28&#34; href=&#34;#__codelineno-7-28&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-29&#34;&gt;&lt;a id=&#34;__codelineno-7-29&#34; name=&#34;__codelineno-7-29&#34; href=&#34;#__codelineno-7-29&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;shadowJar&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-30&#34;&gt;&lt;a id=&#34;__codelineno-7-30&#34; name=&#34;__codelineno-7-30&#34; href=&#34;#__codelineno-7-30&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mergeServiceFiles&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-31&#34;&gt;&lt;a id=&#34;__codelineno-7-31&#34; name=&#34;__codelineno-7-31&#34; href=&#34;#__codelineno-7-31&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// minimize()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-32&#34;&gt;&lt;a id=&#34;__codelineno-7-32&#34; name=&#34;__codelineno-7-32&#34; href=&#34;#__codelineno-7-32&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mapping&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mapOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.chojo.sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-33&#34;&gt;&lt;a id=&#34;__codelineno-7-33&#34; name=&#34;__codelineno-7-33&#34; href=&#34;#__codelineno-7-33&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;base&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;dev.chojo.myapp.libs.&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-34&#34;&gt;&lt;a id=&#34;__codelineno-7-34&#34; name=&#34;__codelineno-7-34&#34; href=&#34;#__codelineno-7-34&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pattern&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mapping&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;relocate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pattern&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;${base}${name}&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-35&#34;&gt;&lt;a id=&#34;__codelineno-7-35&#34; name=&#34;__codelineno-7-35&#34; href=&#34;#__codelineno-7-35&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// If you have a main class, relocation is most probably not necessary since your application is most probably standalone&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-36&#34;&gt;&lt;a id=&#34;__codelineno-7-36&#34; name=&#34;__codelineno-7-36&#34; href=&#34;#__codelineno-7-36&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;manifest&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-37&#34;&gt;&lt;a id=&#34;__codelineno-7-37&#34; name=&#34;__codelineno-7-37&#34; href=&#34;#__codelineno-7-37&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;attributes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mapOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Main-Class&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;dev.chojo.myapp.Main&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-38&#34;&gt;&lt;a id=&#34;__codelineno-7-38&#34; name=&#34;__codelineno-7-38&#34; href=&#34;#__codelineno-7-38&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-39&#34;&gt;&lt;a id=&#34;__codelineno-7-39&#34; name=&#34;__codelineno-7-39&#34; href=&#34;#__codelineno-7-39&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-40&#34;&gt;&lt;a id=&#34;__codelineno-7-40&#34; name=&#34;__codelineno-7-40&#34; href=&#34;#__codelineno-7-40&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;h2 id=&#34;thank-you&#34;&gt;Thank you!&lt;/h2&gt;&lt;p&gt;Thank you for sticking with me so far.You now have a very good understand how the shadow plugin works.&lt;/p&gt;&lt;p&gt;To continue your gradle journey you may be interested in my other blog post about &lt;a href=&#34;../gradle-with-minecraft/&#34;&gt;gradle basics with minecraft&lt;/a&gt;, or you maybe want to take a look at the &lt;a href=&#34;../gradle-application-plugin/&#34;&gt;application plugin&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Thanks for reading!If you liked this post, or have some questions, feel free to come by my discord and have a chat!&lt;/p&gt;&lt;p&gt;&lt;a href=&#34;https://discord.chojo.dev&#34;&gt;&lt;img alt=&#34;Discord Server invite for Chojos Coding Hell&#34; src=&#34;https://discordapp.com/api/guilds/1120671561368748092/widget.png?style=banner3&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Or write me a mail at &lt;code&gt;mail [at] chojo [dot] dev&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;If you want to support me, feel free to sponsor me via &lt;a href=&#34;https://github.com/sponsors/rainbowdashlabs&#34;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</description><link>https://chojo.dev/blog/2024/08/26/gradle-shadow-plugin/</link> <pubDate>Mon, 26 Aug 2024 19:17:15 +0200</pubDate><source url="https://chojo.dev/feed_rss_created.xml">Chojo - Dev Blog and Portfolio</source><guid isPermaLink="true">https://chojo.dev/blog/2024/08/26/gradle-shadow-plugin/</guid> </item> <item> <title>Gradle with Minecraft</title> <author>chojo</author> <description>&lt;h1 id=&#34;gradle-with-minecraft&#34;&gt;Gradle with Minecraft&lt;/h1&gt;&lt;p&gt;This blog post is about minecraft development with gradle and some of the most crucial tools that make your life much easier.&lt;/p&gt;&lt;p&gt;This post assumes you have a build file similar to the one we had at the end of the first &lt;a href=&#34;../gradle-basics/&#34;&gt;gradle blog&lt;/a&gt; post.&lt;/p&gt;&lt;!-- more --&gt;&lt;h2 id=&#34;creating-a-pluginyml-using-a-gradle-plugin&#34;&gt;Creating a plugin.yml using a Gradle plugin&lt;/h2&gt;&lt;p&gt;If you followed only the last blog post, you might not have a plugin.yml yet.If you already have a &lt;code&gt;plugin.yml&lt;/code&gt; you can delete it now or wait until the end of this section.&lt;/p&gt;&lt;p&gt;To create our &lt;code&gt;plugin.yml&lt;/code&gt; we will use the &lt;code&gt;plugin-yml&lt;/code&gt; &lt;a href=&#34;https://github.com/eldoriarpg/plugin-yml&#34;&gt;Gradle plugin&lt;/a&gt;.&lt;/p&gt;&lt;h3 id=&#34;importing&#34;&gt;Importing&lt;/h3&gt;&lt;p&gt;First we need to import it.&lt;/p&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;Although I do not have any other plugins in my plugin section at the moment, this does not mean that you should create a new plugin section or delete the other plugins.I just do not show all available plugins every time to keep it as short as possible.&lt;/p&gt;&lt;/div&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-2&#34;&gt;&lt;a id=&#34;__codelineno-0-2&#34; name=&#34;__codelineno-0-2&#34; href=&#34;#__codelineno-0-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.eldoria.plugin-yml.bukkit&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;0.9.0&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-3&#34;&gt;&lt;a id=&#34;__codelineno-0-3&#34; name=&#34;__codelineno-0-3&#34; href=&#34;#__codelineno-0-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;configuration&#34;&gt;Configuration&lt;/h3&gt;&lt;p&gt;Now that this is done, we need to configure our plugin.We do this, of course, in the section of the plugin called &lt;code&gt;bukkit&lt;/code&gt; in our case.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-1-1&#34;&gt;&lt;a id=&#34;__codelineno-1-1&#34; name=&#34;__codelineno-1-1&#34; href=&#34;#__codelineno-1-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;bukkit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-1-2&#34;&gt;&lt;a id=&#34;__codelineno-1-2&#34; name=&#34;__codelineno-1-2&#34; href=&#34;#__codelineno-1-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;MyPlugin&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-1-3&#34;&gt;&lt;a id=&#34;__codelineno-1-3&#34; name=&#34;__codelineno-1-3&#34; href=&#34;#__codelineno-1-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;dev.chojo.myplugin.MyPlugin&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-1-4&#34;&gt;&lt;a id=&#34;__codelineno-1-4&#34; name=&#34;__codelineno-1-4&#34; href=&#34;#__codelineno-1-4&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-1-5&#34;&gt;&lt;a id=&#34;__codelineno-1-5&#34; name=&#34;__codelineno-1-5&#34; href=&#34;#__codelineno-1-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;commands&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-1-6&#34;&gt;&lt;a id=&#34;__codelineno-1-6&#34; name=&#34;__codelineno-1-6&#34; href=&#34;#__codelineno-1-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;register&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-1-7&#34;&gt;&lt;a id=&#34;__codelineno-1-7&#34; name=&#34;__codelineno-1-7&#34; href=&#34;#__codelineno-1-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;aliases&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;listOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;command&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-1-8&#34;&gt;&lt;a id=&#34;__codelineno-1-8&#34; name=&#34;__codelineno-1-8&#34; href=&#34;#__codelineno-1-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-1-9&#34;&gt;&lt;a id=&#34;__codelineno-1-9&#34; name=&#34;__codelineno-1-9&#34; href=&#34;#__codelineno-1-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-1-10&#34;&gt;&lt;a id=&#34;__codelineno-1-10&#34; name=&#34;__codelineno-1-10&#34; href=&#34;#__codelineno-1-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is the minimum setup. (Commands are not really needed)What are we doing here?&lt;/p&gt;&lt;ol&gt;&lt;li&gt;We define the plugin with the name &#34;MyPlugin&#34;.&lt;/li&gt;&lt;li&gt;We define our plugin class.&lt;br /&gt; Please don&#39;t make it &lt;code&gt;Main&lt;/code&gt; and choose a correct namespace. See my previous &lt;a href=&#34;../../../../2023/08/03/the-plugin-main-class-a-constant-naming-discussion/&#34;&gt;blog post&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;We will register a command called &lt;code&gt;test&lt;/code&gt; with the alias &lt;code&gt;command&lt;/code&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Have a look at the &lt;a href=&#34;https://github.com/eldoriarpg/plugin-yml/wiki/bukkit&#34;&gt;GitHub page&lt;/a&gt; for further references.&lt;/p&gt;&lt;p&gt;The version is taken from your project version by default.&lt;/p&gt;&lt;details&gt;&lt;summary&gt;&lt;/summary&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-2-1&#34;&gt;&lt;a id=&#34;__codelineno-2-1&#34; name=&#34;__codelineno-2-1&#34; href=&#34;#__codelineno-2-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-2&#34;&gt;&lt;a id=&#34;__codelineno-2-2&#34; name=&#34;__codelineno-2-2&#34; href=&#34;#__codelineno-2-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-3&#34;&gt;&lt;a id=&#34;__codelineno-2-3&#34; name=&#34;__codelineno-2-3&#34; href=&#34;#__codelineno-2-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.eldoria.plugin-yml.bukkit&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;0.9.0&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-4&#34;&gt;&lt;a id=&#34;__codelineno-2-4&#34; name=&#34;__codelineno-2-4&#34; href=&#34;#__codelineno-2-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-5&#34;&gt;&lt;a id=&#34;__codelineno-2-5&#34; name=&#34;__codelineno-2-5&#34; href=&#34;#__codelineno-2-5&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-6&#34;&gt;&lt;a id=&#34;__codelineno-2-6&#34; name=&#34;__codelineno-2-6&#34; href=&#34;#__codelineno-2-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;dev.chojo&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// Please use your own group id c:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-7&#34;&gt;&lt;a id=&#34;__codelineno-2-7&#34; name=&#34;__codelineno-2-7&#34; href=&#34;#__codelineno-2-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;1.0.0-SNAPSHOT&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-8&#34;&gt;&lt;a id=&#34;__codelineno-2-8&#34; name=&#34;__codelineno-2-8&#34; href=&#34;#__codelineno-2-8&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-9&#34;&gt;&lt;a id=&#34;__codelineno-2-9&#34; name=&#34;__codelineno-2-9&#34; href=&#34;#__codelineno-2-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;repositories&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-10&#34;&gt;&lt;a id=&#34;__codelineno-2-10&#34; name=&#34;__codelineno-2-10&#34; href=&#34;#__codelineno-2-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mavenCentral&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-11&#34;&gt;&lt;a id=&#34;__codelineno-2-11&#34; name=&#34;__codelineno-2-11&#34; href=&#34;#__codelineno-2-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// External repository&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-12&#34;&gt;&lt;a id=&#34;__codelineno-2-12&#34; name=&#34;__codelineno-2-12&#34; href=&#34;#__codelineno-2-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;maven&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;https://repo.papermc.io/repository/maven-public/&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-13&#34;&gt;&lt;a id=&#34;__codelineno-2-13&#34; name=&#34;__codelineno-2-13&#34; href=&#34;#__codelineno-2-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-14&#34;&gt;&lt;a id=&#34;__codelineno-2-14&#34; name=&#34;__codelineno-2-14&#34; href=&#34;#__codelineno-2-14&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-15&#34;&gt;&lt;a id=&#34;__codelineno-2-15&#34; name=&#34;__codelineno-2-15&#34; href=&#34;#__codelineno-2-15&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-16&#34;&gt;&lt;a id=&#34;__codelineno-2-16&#34; name=&#34;__codelineno-2-16&#34; href=&#34;#__codelineno-2-16&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;compileOnly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;io.papermc.paper:paper-api:26.1.2.build.63-stable&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-17&#34;&gt;&lt;a id=&#34;__codelineno-2-17&#34; name=&#34;__codelineno-2-17&#34; href=&#34;#__codelineno-2-17&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;implementation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.chojo.sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;2.3.9&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-18&#34;&gt;&lt;a id=&#34;__codelineno-2-18&#34; name=&#34;__codelineno-2-18&#34; href=&#34;#__codelineno-2-18&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-19&#34;&gt;&lt;a id=&#34;__codelineno-2-19&#34; name=&#34;__codelineno-2-19&#34; href=&#34;#__codelineno-2-19&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-20&#34;&gt;&lt;a id=&#34;__codelineno-2-20&#34; name=&#34;__codelineno-2-20&#34; href=&#34;#__codelineno-2-20&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-21&#34;&gt;&lt;a id=&#34;__codelineno-2-21&#34; name=&#34;__codelineno-2-21&#34; href=&#34;#__codelineno-2-21&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;toolchain&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-22&#34;&gt;&lt;a id=&#34;__codelineno-2-22&#34; name=&#34;__codelineno-2-22&#34; href=&#34;#__codelineno-2-22&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;languageVersion&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JavaLanguageVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;of&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;21&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-23&#34;&gt;&lt;a id=&#34;__codelineno-2-23&#34; name=&#34;__codelineno-2-23&#34; href=&#34;#__codelineno-2-23&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-24&#34;&gt;&lt;a id=&#34;__codelineno-2-24&#34; name=&#34;__codelineno-2-24&#34; href=&#34;#__codelineno-2-24&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;withSourcesJar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-25&#34;&gt;&lt;a id=&#34;__codelineno-2-25&#34; name=&#34;__codelineno-2-25&#34; href=&#34;#__codelineno-2-25&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;withJavadocJar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-26&#34;&gt;&lt;a id=&#34;__codelineno-2-26&#34; name=&#34;__codelineno-2-26&#34; href=&#34;#__codelineno-2-26&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-27&#34;&gt;&lt;a id=&#34;__codelineno-2-27&#34; name=&#34;__codelineno-2-27&#34; href=&#34;#__codelineno-2-27&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-28&#34;&gt;&lt;a id=&#34;__codelineno-2-28&#34; name=&#34;__codelineno-2-28&#34; href=&#34;#__codelineno-2-28&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;bukkit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-29&#34;&gt;&lt;a id=&#34;__codelineno-2-29&#34; name=&#34;__codelineno-2-29&#34; href=&#34;#__codelineno-2-29&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;MyPlugin&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-30&#34;&gt;&lt;a id=&#34;__codelineno-2-30&#34; name=&#34;__codelineno-2-30&#34; href=&#34;#__codelineno-2-30&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;dev.chojo.myplugin.MyPlugin&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-31&#34;&gt;&lt;a id=&#34;__codelineno-2-31&#34; name=&#34;__codelineno-2-31&#34; href=&#34;#__codelineno-2-31&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-32&#34;&gt;&lt;a id=&#34;__codelineno-2-32&#34; name=&#34;__codelineno-2-32&#34; href=&#34;#__codelineno-2-32&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;commands&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-33&#34;&gt;&lt;a id=&#34;__codelineno-2-33&#34; name=&#34;__codelineno-2-33&#34; href=&#34;#__codelineno-2-33&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;register&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-34&#34;&gt;&lt;a id=&#34;__codelineno-2-34&#34; name=&#34;__codelineno-2-34&#34; href=&#34;#__codelineno-2-34&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;aliases&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;listOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;command&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-35&#34;&gt;&lt;a id=&#34;__codelineno-2-35&#34; name=&#34;__codelineno-2-35&#34; href=&#34;#__codelineno-2-35&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-36&#34;&gt;&lt;a id=&#34;__codelineno-2-36&#34; name=&#34;__codelineno-2-36&#34; href=&#34;#__codelineno-2-36&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-37&#34;&gt;&lt;a id=&#34;__codelineno-2-37&#34; name=&#34;__codelineno-2-37&#34; href=&#34;#__codelineno-2-37&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;h3 id=&#34;bukkit-libraries-the-better-alternative-to-shading&#34;&gt;Bukkit Libraries - The better alternative to shading&lt;/h3&gt;&lt;p&gt;Lets assume our dependency section looks like this:&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-3-1&#34;&gt;&lt;a id=&#34;__codelineno-3-1&#34; name=&#34;__codelineno-3-1&#34; href=&#34;#__codelineno-3-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-2&#34;&gt;&lt;a id=&#34;__codelineno-3-2&#34; name=&#34;__codelineno-3-2&#34; href=&#34;#__codelineno-3-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;compileOnly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;io.papermc.paper:paper-api:26.1.2.build.63-stable&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-3&#34;&gt;&lt;a id=&#34;__codelineno-3-3&#34; name=&#34;__codelineno-3-3&#34; href=&#34;#__codelineno-3-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;implementation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.chojo.sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;2.3.9&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-4&#34;&gt;&lt;a id=&#34;__codelineno-3-4&#34; name=&#34;__codelineno-3-4&#34; href=&#34;#__codelineno-3-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Previously we had the problem that SADU was not included in our jar.If we use the &lt;code&gt;plugin-yml&lt;/code&gt; plugin and are using Minecraft 1.16.5 or later, we can use the library loader.All we need to do is change &lt;code&gt;implementation&lt;/code&gt; to &lt;code&gt;bukkitLibrary&lt;/code&gt;:&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-4-1&#34;&gt;&lt;a id=&#34;__codelineno-4-1&#34; name=&#34;__codelineno-4-1&#34; href=&#34;#__codelineno-4-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-2&#34;&gt;&lt;a id=&#34;__codelineno-4-2&#34; name=&#34;__codelineno-4-2&#34; href=&#34;#__codelineno-4-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;compileOnly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;io.papermc.paper:paper-api:26.1.2.build.63-stable&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-3&#34;&gt;&lt;a id=&#34;__codelineno-4-3&#34; name=&#34;__codelineno-4-3&#34; href=&#34;#__codelineno-4-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bukkitLibrary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.chojo.sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;2.3.9&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-4&#34;&gt;&lt;a id=&#34;__codelineno-4-4&#34; name=&#34;__codelineno-4-4&#34; href=&#34;#__codelineno-4-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now our library is loaded by Spigot/Paper when it loads our plugin and is available at runtime.This works because SADU is located at Maven Central and Spigot/Paper downloads libraries from there.Libraries not located at Maven Central still need to be &lt;a href=&#34;../gradle-shadow-plugin/&#34;&gt;shadowed&lt;/a&gt;.&lt;/p&gt;&lt;h4 id=&#34;paper-plugins&#34;&gt;Paper plugins&lt;/h4&gt;&lt;p&gt;Paper plugins are a type of plugin exclusively for Paper servers.They are quite new and some things might be different from what you know.They don&#39;t share the command system with spigot but use the Brigadier system, that Minecraft itself uses. Usually people use a command system like &lt;a href=&#34;https://cloud.incendo.org/minecraft/paper/&#34;&gt;Cloud&lt;/a&gt; or &lt;a href=&#34;https://github.com/aikar/commands&#34;&gt;ACF&lt;/a&gt;, which wraps around Brigadier and maker it easier to use.They also require a new configuration framework, since file configurations and ConfigurationSerializable are no longer available. I developed &lt;a href=&#34;../../../../2023/10/30/jackson-bukkit---bukkit-serialization-done-the-right-way/&#34;&gt;jackson bukkit&lt;/a&gt; for that.So the learning curve might be a bit steeper for beginners since you probably start with a bunch of new frameworks right from the start. But if you are very new to this and are just starting with minecraft and are just targeting newer paper server, this might be an interesting starting point.&lt;/p&gt;&lt;p&gt;In Paper plugins you can also load dependencies from custom repositories. You can read more about this &lt;a href=&#34;https://github.com/eldoriarpg/plugin-yml/wiki/Plugin-Libraries-JSON&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;More about Paper plugins can be found &lt;a href=&#34;https://docs.papermc.io/paper/reference/paper-plugins&#34;&gt;here&lt;/a&gt; and &lt;a href=&#34;https://docs.papermc.io/paper/dev/getting-started/paper-plugins&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;details&gt;&lt;summary&gt;Checkpoint&lt;/summary&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-5-1&#34;&gt;&lt;a id=&#34;__codelineno-5-1&#34; name=&#34;__codelineno-5-1&#34; href=&#34;#__codelineno-5-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-2&#34;&gt;&lt;a id=&#34;__codelineno-5-2&#34; name=&#34;__codelineno-5-2&#34; href=&#34;#__codelineno-5-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-3&#34;&gt;&lt;a id=&#34;__codelineno-5-3&#34; name=&#34;__codelineno-5-3&#34; href=&#34;#__codelineno-5-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.eldoria.plugin-yml.bukkit&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;0.9.0&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-4&#34;&gt;&lt;a id=&#34;__codelineno-5-4&#34; name=&#34;__codelineno-5-4&#34; href=&#34;#__codelineno-5-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-5&#34;&gt;&lt;a id=&#34;__codelineno-5-5&#34; name=&#34;__codelineno-5-5&#34; href=&#34;#__codelineno-5-5&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-6&#34;&gt;&lt;a id=&#34;__codelineno-5-6&#34; name=&#34;__codelineno-5-6&#34; href=&#34;#__codelineno-5-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;dev.chojo&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// Please use your own group id c:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-7&#34;&gt;&lt;a id=&#34;__codelineno-5-7&#34; name=&#34;__codelineno-5-7&#34; href=&#34;#__codelineno-5-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;1.0.0-SNAPSHOT&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-8&#34;&gt;&lt;a id=&#34;__codelineno-5-8&#34; name=&#34;__codelineno-5-8&#34; href=&#34;#__codelineno-5-8&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-9&#34;&gt;&lt;a id=&#34;__codelineno-5-9&#34; name=&#34;__codelineno-5-9&#34; href=&#34;#__codelineno-5-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;repositories&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-10&#34;&gt;&lt;a id=&#34;__codelineno-5-10&#34; name=&#34;__codelineno-5-10&#34; href=&#34;#__codelineno-5-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mavenCentral&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-11&#34;&gt;&lt;a id=&#34;__codelineno-5-11&#34; name=&#34;__codelineno-5-11&#34; href=&#34;#__codelineno-5-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// External repository&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-12&#34;&gt;&lt;a id=&#34;__codelineno-5-12&#34; name=&#34;__codelineno-5-12&#34; href=&#34;#__codelineno-5-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;maven&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;https://repo.papermc.io/repository/maven-public/&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-13&#34;&gt;&lt;a id=&#34;__codelineno-5-13&#34; name=&#34;__codelineno-5-13&#34; href=&#34;#__codelineno-5-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-14&#34;&gt;&lt;a id=&#34;__codelineno-5-14&#34; name=&#34;__codelineno-5-14&#34; href=&#34;#__codelineno-5-14&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-15&#34;&gt;&lt;a id=&#34;__codelineno-5-15&#34; name=&#34;__codelineno-5-15&#34; href=&#34;#__codelineno-5-15&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-16&#34;&gt;&lt;a id=&#34;__codelineno-5-16&#34; name=&#34;__codelineno-5-16&#34; href=&#34;#__codelineno-5-16&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;compileOnly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;io.papermc.paper:paper-api:26.1.2.build.63-stable&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-17&#34;&gt;&lt;a id=&#34;__codelineno-5-17&#34; name=&#34;__codelineno-5-17&#34; href=&#34;#__codelineno-5-17&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bukkitLibrary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.chojo.sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;2.3.9&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-18&#34;&gt;&lt;a id=&#34;__codelineno-5-18&#34; name=&#34;__codelineno-5-18&#34; href=&#34;#__codelineno-5-18&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-19&#34;&gt;&lt;a id=&#34;__codelineno-5-19&#34; name=&#34;__codelineno-5-19&#34; href=&#34;#__codelineno-5-19&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-20&#34;&gt;&lt;a id=&#34;__codelineno-5-20&#34; name=&#34;__codelineno-5-20&#34; href=&#34;#__codelineno-5-20&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-21&#34;&gt;&lt;a id=&#34;__codelineno-5-21&#34; name=&#34;__codelineno-5-21&#34; href=&#34;#__codelineno-5-21&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;toolchain&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-22&#34;&gt;&lt;a id=&#34;__codelineno-5-22&#34; name=&#34;__codelineno-5-22&#34; href=&#34;#__codelineno-5-22&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;languageVersion&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JavaLanguageVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;of&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;21&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-23&#34;&gt;&lt;a id=&#34;__codelineno-5-23&#34; name=&#34;__codelineno-5-23&#34; href=&#34;#__codelineno-5-23&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-24&#34;&gt;&lt;a id=&#34;__codelineno-5-24&#34; name=&#34;__codelineno-5-24&#34; href=&#34;#__codelineno-5-24&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;withSourcesJar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-25&#34;&gt;&lt;a id=&#34;__codelineno-5-25&#34; name=&#34;__codelineno-5-25&#34; href=&#34;#__codelineno-5-25&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;withJavadocJar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-26&#34;&gt;&lt;a id=&#34;__codelineno-5-26&#34; name=&#34;__codelineno-5-26&#34; href=&#34;#__codelineno-5-26&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-27&#34;&gt;&lt;a id=&#34;__codelineno-5-27&#34; name=&#34;__codelineno-5-27&#34; href=&#34;#__codelineno-5-27&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-28&#34;&gt;&lt;a id=&#34;__codelineno-5-28&#34; name=&#34;__codelineno-5-28&#34; href=&#34;#__codelineno-5-28&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;bukkit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-29&#34;&gt;&lt;a id=&#34;__codelineno-5-29&#34; name=&#34;__codelineno-5-29&#34; href=&#34;#__codelineno-5-29&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;MyPlugin&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-30&#34;&gt;&lt;a id=&#34;__codelineno-5-30&#34; name=&#34;__codelineno-5-30&#34; href=&#34;#__codelineno-5-30&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;dev.chojo.myplugin.MyPlugin&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-31&#34;&gt;&lt;a id=&#34;__codelineno-5-31&#34; name=&#34;__codelineno-5-31&#34; href=&#34;#__codelineno-5-31&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-32&#34;&gt;&lt;a id=&#34;__codelineno-5-32&#34; name=&#34;__codelineno-5-32&#34; href=&#34;#__codelineno-5-32&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;commands&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-33&#34;&gt;&lt;a id=&#34;__codelineno-5-33&#34; name=&#34;__codelineno-5-33&#34; href=&#34;#__codelineno-5-33&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;register&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-34&#34;&gt;&lt;a id=&#34;__codelineno-5-34&#34; name=&#34;__codelineno-5-34&#34; href=&#34;#__codelineno-5-34&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;aliases&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;listOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;command&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-35&#34;&gt;&lt;a id=&#34;__codelineno-5-35&#34; name=&#34;__codelineno-5-35&#34; href=&#34;#__codelineno-5-35&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-36&#34;&gt;&lt;a id=&#34;__codelineno-5-36&#34; name=&#34;__codelineno-5-36&#34; href=&#34;#__codelineno-5-36&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-37&#34;&gt;&lt;a id=&#34;__codelineno-5-37&#34; name=&#34;__codelineno-5-37&#34; href=&#34;#__codelineno-5-37&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;h2 id=&#34;nms-and-internals-using-the-paperweight-userdev-plugin&#34;&gt;NMS and internals using the Paperweight Userdev plugin&lt;/h2&gt;&lt;p&gt;I do not encourage using nms in any way, but if you want to, you should use the &lt;code&gt;userdev&lt;/code&gt; plugin from &lt;code&gt;paperweight&lt;/code&gt;.This allows you to develop against an environment with non-obfuscated names.It is also the only supported way of accessing internals in &lt;code&gt;org.bukkit.craftbukkit.v1_XX_RX&lt;/code&gt;.It also ensures that when you upgrade to a new version, you do not have to change any code that is using the &lt;code&gt;net.minecraft&lt;/code&gt; package.Of course, you still need to change code when Mojang changed something.However, you still need to change the package names when using internal code from &lt;code&gt;org.bukkit.craftbukkit.v1_XX_RX&lt;/code&gt;;&lt;/p&gt;&lt;h3 id=&#34;adding-the-repository&#34;&gt;Adding the repository&lt;/h3&gt;&lt;p&gt;For this we need to do something new and go into our &lt;code&gt;settings.gradle.kts&lt;/code&gt; to add a plugin repository.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-6-1&#34;&gt;&lt;a id=&#34;__codelineno-6-1&#34; name=&#34;__codelineno-6-1&#34; href=&#34;#__codelineno-6-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;pluginManagement&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-6-2&#34;&gt;&lt;a id=&#34;__codelineno-6-2&#34; name=&#34;__codelineno-6-2&#34; href=&#34;#__codelineno-6-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;repositories&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-6-3&#34;&gt;&lt;a id=&#34;__codelineno-6-3&#34; name=&#34;__codelineno-6-3&#34; href=&#34;#__codelineno-6-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gradlePluginPortal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-6-4&#34;&gt;&lt;a id=&#34;__codelineno-6-4&#34; name=&#34;__codelineno-6-4&#34; href=&#34;#__codelineno-6-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;maven&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;https://repo.papermc.io/repository/maven-public/&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-6-5&#34;&gt;&lt;a id=&#34;__codelineno-6-5&#34; name=&#34;__codelineno-6-5&#34; href=&#34;#__codelineno-6-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-6-6&#34;&gt;&lt;a id=&#34;__codelineno-6-6&#34; name=&#34;__codelineno-6-6&#34; href=&#34;#__codelineno-6-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To do this we need to configure the &lt;code&gt;pluginManagement&lt;/code&gt; section and change the repositories.By default, only &lt;code&gt;gradlePluginPortal()&lt;/code&gt; is imported, which usually contains all the important plugins so far.But now we want to add another repository.It is very important that you add &lt;code&gt;gradlePluginPortal()&lt;/code&gt; as well as the Paper repository.&lt;/p&gt;&lt;h3 id=&#34;importing_1&#34;&gt;Importing&lt;/h3&gt;&lt;p&gt;Now we can import the plugin into our &lt;code&gt;build.gradle.kts&lt;/code&gt; file.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-7-1&#34;&gt;&lt;a id=&#34;__codelineno-7-1&#34; name=&#34;__codelineno-7-1&#34; href=&#34;#__codelineno-7-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-2&#34;&gt;&lt;a id=&#34;__codelineno-7-2&#34; name=&#34;__codelineno-7-2&#34; href=&#34;#__codelineno-7-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;io.papermc.paperweight.userdev&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;1.7.7&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-3&#34;&gt;&lt;a id=&#34;__codelineno-7-3&#34; name=&#34;__codelineno-7-3&#34; href=&#34;#__codelineno-7-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This leaves just one step to set up the Paper version.&lt;/p&gt;&lt;h3 id=&#34;configuration_1&#34;&gt;Configuration&lt;/h3&gt;&lt;p&gt;To define the version we want to use, we need to add it to our dependencies.To do this we need to remove the old Paper compileOnly dependency and replace it with the paperweight dependency.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-8-1&#34;&gt;&lt;a id=&#34;__codelineno-8-1&#34; name=&#34;__codelineno-8-1&#34; href=&#34;#__codelineno-8-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-8-2&#34;&gt;&lt;a id=&#34;__codelineno-8-2&#34; name=&#34;__codelineno-8-2&#34; href=&#34;#__codelineno-8-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;paperweight&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;paperDevBundle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;26.1.2.build.63-stable&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-8-3&#34;&gt;&lt;a id=&#34;__codelineno-8-3&#34; name=&#34;__codelineno-8-3&#34; href=&#34;#__codelineno-8-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The version entered here is the same as for Paper. You just remove the group and artefact id.Paper uses the obfuscated jar.This requires us to actually reobfuscate our jar before building.We can do this again by configuring a task.This time we configure the &lt;code&gt;assemble&lt;/code&gt; task and set a &lt;code&gt;dependsOn&lt;/code&gt; on it.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-9-1&#34;&gt;&lt;a id=&#34;__codelineno-9-1&#34; name=&#34;__codelineno-9-1&#34; href=&#34;#__codelineno-9-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;tasks&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-9-2&#34;&gt;&lt;a id=&#34;__codelineno-9-2&#34; name=&#34;__codelineno-9-2&#34; href=&#34;#__codelineno-9-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;assemble&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-9-3&#34;&gt;&lt;a id=&#34;__codelineno-9-3&#34; name=&#34;__codelineno-9-3&#34; href=&#34;#__codelineno-9-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dependsOn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;reobfJar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-9-4&#34;&gt;&lt;a id=&#34;__codelineno-9-4&#34; name=&#34;__codelineno-9-4&#34; href=&#34;#__codelineno-9-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-9-5&#34;&gt;&lt;a id=&#34;__codelineno-9-5&#34; name=&#34;__codelineno-9-5&#34; href=&#34;#__codelineno-9-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;From 1.21 onwards paper uses a non obfuscated jar.If your plugin only runs on paper, you no longer need to reobfuscate your jar.Have a look at the paper &lt;a href=&#34;https://docs.papermc.io/paper/dev/userdev#compiling-to-mojang-mappings&#34;&gt;documentation&lt;/a&gt;, since some additional stuff is required to run mojang mapped plugins &lt;/p&gt;&lt;/div&gt;&lt;p&gt;And that&#39;s it.Now you can use nms as comfortably as possible.&lt;/p&gt;&lt;details&gt;&lt;summary&gt;Checkpoint&lt;/summary&gt;**build.gradle.kts**&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-10-1&#34;&gt;&lt;a id=&#34;__codelineno-10-1&#34; name=&#34;__codelineno-10-1&#34; href=&#34;#__codelineno-10-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-2&#34;&gt;&lt;a id=&#34;__codelineno-10-2&#34; name=&#34;__codelineno-10-2&#34; href=&#34;#__codelineno-10-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-3&#34;&gt;&lt;a id=&#34;__codelineno-10-3&#34; name=&#34;__codelineno-10-3&#34; href=&#34;#__codelineno-10-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.eldoria.plugin-yml.bukkit&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;0.9.0&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-4&#34;&gt;&lt;a id=&#34;__codelineno-10-4&#34; name=&#34;__codelineno-10-4&#34; href=&#34;#__codelineno-10-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-5&#34;&gt;&lt;a id=&#34;__codelineno-10-5&#34; name=&#34;__codelineno-10-5&#34; href=&#34;#__codelineno-10-5&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-6&#34;&gt;&lt;a id=&#34;__codelineno-10-6&#34; name=&#34;__codelineno-10-6&#34; href=&#34;#__codelineno-10-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;dev.chojo&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// Please use your own group id c:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-7&#34;&gt;&lt;a id=&#34;__codelineno-10-7&#34; name=&#34;__codelineno-10-7&#34; href=&#34;#__codelineno-10-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;1.0.0-SNAPSHOT&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-8&#34;&gt;&lt;a id=&#34;__codelineno-10-8&#34; name=&#34;__codelineno-10-8&#34; href=&#34;#__codelineno-10-8&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-9&#34;&gt;&lt;a id=&#34;__codelineno-10-9&#34; name=&#34;__codelineno-10-9&#34; href=&#34;#__codelineno-10-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;repositories&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-10&#34;&gt;&lt;a id=&#34;__codelineno-10-10&#34; name=&#34;__codelineno-10-10&#34; href=&#34;#__codelineno-10-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mavenCentral&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-11&#34;&gt;&lt;a id=&#34;__codelineno-10-11&#34; name=&#34;__codelineno-10-11&#34; href=&#34;#__codelineno-10-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// External repository&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-12&#34;&gt;&lt;a id=&#34;__codelineno-10-12&#34; name=&#34;__codelineno-10-12&#34; href=&#34;#__codelineno-10-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;maven&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;https://repo.papermc.io/repository/maven-public/&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-13&#34;&gt;&lt;a id=&#34;__codelineno-10-13&#34; name=&#34;__codelineno-10-13&#34; href=&#34;#__codelineno-10-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-14&#34;&gt;&lt;a id=&#34;__codelineno-10-14&#34; name=&#34;__codelineno-10-14&#34; href=&#34;#__codelineno-10-14&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-15&#34;&gt;&lt;a id=&#34;__codelineno-10-15&#34; name=&#34;__codelineno-10-15&#34; href=&#34;#__codelineno-10-15&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-16&#34;&gt;&lt;a id=&#34;__codelineno-10-16&#34; name=&#34;__codelineno-10-16&#34; href=&#34;#__codelineno-10-16&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;paperweight&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;paperDevBundle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;26.1.2.build.63-stable&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-17&#34;&gt;&lt;a id=&#34;__codelineno-10-17&#34; name=&#34;__codelineno-10-17&#34; href=&#34;#__codelineno-10-17&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bukkitLibrary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.chojo.sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;2.3.9&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-18&#34;&gt;&lt;a id=&#34;__codelineno-10-18&#34; name=&#34;__codelineno-10-18&#34; href=&#34;#__codelineno-10-18&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-19&#34;&gt;&lt;a id=&#34;__codelineno-10-19&#34; name=&#34;__codelineno-10-19&#34; href=&#34;#__codelineno-10-19&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-20&#34;&gt;&lt;a id=&#34;__codelineno-10-20&#34; name=&#34;__codelineno-10-20&#34; href=&#34;#__codelineno-10-20&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-21&#34;&gt;&lt;a id=&#34;__codelineno-10-21&#34; name=&#34;__codelineno-10-21&#34; href=&#34;#__codelineno-10-21&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;toolchain&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-22&#34;&gt;&lt;a id=&#34;__codelineno-10-22&#34; name=&#34;__codelineno-10-22&#34; href=&#34;#__codelineno-10-22&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;languageVersion&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JavaLanguageVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;of&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;21&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-23&#34;&gt;&lt;a id=&#34;__codelineno-10-23&#34; name=&#34;__codelineno-10-23&#34; href=&#34;#__codelineno-10-23&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-24&#34;&gt;&lt;a id=&#34;__codelineno-10-24&#34; name=&#34;__codelineno-10-24&#34; href=&#34;#__codelineno-10-24&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;withSourcesJar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-25&#34;&gt;&lt;a id=&#34;__codelineno-10-25&#34; name=&#34;__codelineno-10-25&#34; href=&#34;#__codelineno-10-25&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;withJavadocJar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-26&#34;&gt;&lt;a id=&#34;__codelineno-10-26&#34; name=&#34;__codelineno-10-26&#34; href=&#34;#__codelineno-10-26&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-27&#34;&gt;&lt;a id=&#34;__codelineno-10-27&#34; name=&#34;__codelineno-10-27&#34; href=&#34;#__codelineno-10-27&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-28&#34;&gt;&lt;a id=&#34;__codelineno-10-28&#34; name=&#34;__codelineno-10-28&#34; href=&#34;#__codelineno-10-28&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;bukkit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-29&#34;&gt;&lt;a id=&#34;__codelineno-10-29&#34; name=&#34;__codelineno-10-29&#34; href=&#34;#__codelineno-10-29&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;MyPlugin&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-30&#34;&gt;&lt;a id=&#34;__codelineno-10-30&#34; name=&#34;__codelineno-10-30&#34; href=&#34;#__codelineno-10-30&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;dev.chojo.myplugin.MyPlugin&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-31&#34;&gt;&lt;a id=&#34;__codelineno-10-31&#34; name=&#34;__codelineno-10-31&#34; href=&#34;#__codelineno-10-31&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-32&#34;&gt;&lt;a id=&#34;__codelineno-10-32&#34; name=&#34;__codelineno-10-32&#34; href=&#34;#__codelineno-10-32&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;commands&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-33&#34;&gt;&lt;a id=&#34;__codelineno-10-33&#34; name=&#34;__codelineno-10-33&#34; href=&#34;#__codelineno-10-33&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;register&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-34&#34;&gt;&lt;a id=&#34;__codelineno-10-34&#34; name=&#34;__codelineno-10-34&#34; href=&#34;#__codelineno-10-34&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;aliases&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;listOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;command&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-35&#34;&gt;&lt;a id=&#34;__codelineno-10-35&#34; name=&#34;__codelineno-10-35&#34; href=&#34;#__codelineno-10-35&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-36&#34;&gt;&lt;a id=&#34;__codelineno-10-36&#34; name=&#34;__codelineno-10-36&#34; href=&#34;#__codelineno-10-36&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-37&#34;&gt;&lt;a id=&#34;__codelineno-10-37&#34; name=&#34;__codelineno-10-37&#34; href=&#34;#__codelineno-10-37&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;**settings.gradle.kts**&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-11-1&#34;&gt;&lt;a id=&#34;__codelineno-11-1&#34; name=&#34;__codelineno-11-1&#34; href=&#34;#__codelineno-11-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;pluginManagement&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-2&#34;&gt;&lt;a id=&#34;__codelineno-11-2&#34; name=&#34;__codelineno-11-2&#34; href=&#34;#__codelineno-11-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;repositories&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-3&#34;&gt;&lt;a id=&#34;__codelineno-11-3&#34; name=&#34;__codelineno-11-3&#34; href=&#34;#__codelineno-11-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gradlePluginPortal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-4&#34;&gt;&lt;a id=&#34;__codelineno-11-4&#34; name=&#34;__codelineno-11-4&#34; href=&#34;#__codelineno-11-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;maven&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;https://papermc.io/repo/repository/maven-public/&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-5&#34;&gt;&lt;a id=&#34;__codelineno-11-5&#34; name=&#34;__codelineno-11-5&#34; href=&#34;#__codelineno-11-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-6&#34;&gt;&lt;a id=&#34;__codelineno-11-6&#34; name=&#34;__codelineno-11-6&#34; href=&#34;#__codelineno-11-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;h2 id=&#34;running-a-server-with-your-jar&#34;&gt;Running a server with your jar&lt;/h2&gt;&lt;p&gt;To quickly test your plugin, you can start a server directly.All you need to do is add the &lt;a href=&#34;https://github.com/jpenilla/run-task&#34;&gt;run-task plugin&lt;/a&gt; to your build file.&lt;/p&gt;&lt;p&gt;I&#39;ll refrain from simply copying their readme here, as I can&#39;t add any more value to it.&lt;/p&gt;&lt;h2 id=&#34;thank-you&#34;&gt;Thank you!&lt;/h2&gt;&lt;p&gt;Thank you for sticking with me so far.You now have a very good understanding of Minecraft development with Gradle.&lt;/p&gt;&lt;p&gt;Thanks for reading!If you liked this post, or have some questions, feel free to come by my discord and have a chat!&lt;/p&gt;&lt;p&gt;&lt;a href=&#34;https://discord.chojo.dev&#34;&gt;&lt;img alt=&#34;Discord Server invite for Chojos Coding Hell&#34; src=&#34;https://discordapp.com/api/guilds/1120671561368748092/widget.png?style=banner3&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Or write me a mail at &lt;code&gt;mail [at] chojo [dot] dev&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;If you want to support me, feel free to sponsor me via &lt;a href=&#34;https://github.com/sponsors/rainbowdashlabs&#34;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</description><link>https://chojo.dev/blog/2024/08/26/gradle-with-minecraft/</link> <pubDate>Mon, 26 Aug 2024 19:17:15 +0200</pubDate><source url="https://chojo.dev/feed_rss_created.xml">Chojo - Dev Blog and Portfolio</source><guid isPermaLink="true">https://chojo.dev/blog/2024/08/26/gradle-with-minecraft/</guid> </item> <item> <title>GPN22 Tag 4 | Das Ende und der Anfang</title> <author>chojo</author> <description>&lt;h1 id=&#34;gpn22-tag-4-das-ende-und-der-anfang&#34;&gt;GPN22 Tag 4 | Das Ende und der Anfang&lt;/h1&gt;&lt;p&gt;Der letzte Tag der GPN beginnt wieder früh um halb neun. Obwohl ich super Müde bin, steht jetzt schon fest: Ich komme wieder und hoffentlich wird das der Anfang einer neuen jährlichen Tradition.&lt;/p&gt;&lt;!-- more --&gt;&lt;p&gt;Eigentlich wollte ich ausschlafen und es langsam angehen lassen, aber natürlich war um 10 Uhr doch noch ein Talk, den ich sehen wollte. Es ging um &#34;Big Data Analysis with SQL&#34;. Vermutlich hatte ich aber zu hohe erwartungen an den Talk. Die erste hälfte des Talks war lediglich basic SQL Erklärung, auf die ich gut hätte Verzichten können. Der zweite Part fühlte sich mehr an wie Technologiebingo. Eine Menge namen und Beispiele und zum Schluss noch ein grobes Architektur Diagram. Der Kern des ganzen ging auch eher um statische Aggregation und Statistiken, wofür ich keine wirkliche verwendung habe.&lt;/p&gt;&lt;p&gt;Also wieder zurück zum Platz. Die zwei Jungs von den letzten zwei Tagen waren auch schon wieder da. Nach einiger Zeit gesellte sich Nick wieder hinzu und auch Hannes und Johnny stießen recht schnell wieder hinzu. Irgendwann stellte sich dann noch heraus, dass einer der beiden Jungs sogar bereits auf dem DevCord war und so gar es eine neue Verbindung und wir werden vermutlich auch nach der GPN noch Kontakt halten. Nach ein paar letzten Stunden die viel zu schnell bei Gesprächen und programmieren vorbeigingen, war es dann auch so weit.&lt;/p&gt;&lt;p&gt;Als ob jemand einen Hebel umgelegt hatte, schwing alles um auf Abbau. wir schlossen und dem nach einiger Zeit auch an, machten unsere Tische leer und halfen auch noch ein bisschen Tragen. Da Nick jedoch auch bald zum Zug musste und sich bei uns allgemein der Hunger langsam bemerkbar machte, ging es kurz zum Hotel damit ich etwas Zeug loswerden konnte. Nick verabschiedete sich und unsere nun recht kleine Truppe auf Johnny, Hannes und mir beschloss mich in das Oxford mitzunehmen. Einem Ort, von dem ich zumindest bereits gehört hatte und der angeblich recht gute Burger anbieten sollte.&lt;/p&gt;&lt;p&gt;Nach einer recht kurzen fahrt und einem kleinen Spaziergang waren wir auch schon in einem recht schönen Pub. Ich struggelte wie immer an einer entscheidung, was ich essen und trinken sollte. Am Ende viel die Entscheidung natürlich auf einen Burger und ein schönes alkoholfreies Paulaner. So ließen wir die GPN gemütlich ausklingen bei einem letzten Gespräch, bevor sich dann auch Hannes verabschiedete.&lt;/p&gt;&lt;p&gt;Ich hatte jedoch noch Lust auf ein bisschen Kuchen und Johnny zeigte mir noch das &#34;intro&#34;, das sich schöner Weise praktisch um die Ecke befand. So gönnten wir uns noch einen Cappuccino und ich mir einen echt leckeren Cheesecake. Nach einiger Zeit war es jedoch auch hier Zeit erneut Abschied zu nehmen.&lt;/p&gt;&lt;p&gt;Ich setzte mir meine Kopfhörer auf und trat zu &#34;Born this way&#34; als Nightcore version meinen Rückweg an zur Tram Station. Und vermutlich gibt dieses Lied auch eine gute Stimmung der GPN wieder. So viele Bunte und unterschiedliche Menschen auf einem Haufen. Jede:r konnte so sein wie man sich fühlte und wer man sein wollte. An wenigen Orten fühlte ich mich tatsächlich so frei persönlich wie auf der GPN. Tatsächlich ein wirklicher Safespace für so viele. In einem Talk wurde auch erwähnt, dass die GPN die vermutlich diverseste Veranstaltung im CCC ist. Ohne je auf einem anderen CCC Event gewesen zu sein, glaube ich das gerne und finde es wundervoll.&lt;/p&gt;&lt;p&gt;Beim Schreiben dieses Posts und dem Blick zurück auf das Wochenende kommt tatsächlich auch ein Tränchen. Ich bin glücklich, dass ich dabei war, aber definitiv auch traurig, dass es schon vorbei ist. Die vier Tage gingen super schnell vorbei. Wenn ich aber so in mich hinein fühle, hätte ich vermutlich keinen 5. Tag mehr mitgemacht. Ich bin müde und meine Social Battery war schon lange nicht mehr so leer wie sie gerade ist.&lt;/p&gt;&lt;p&gt;Mein Framework hat mittlerweile kaum mehr einen freien Platz und ich liebe einfach wie das geendet ist. Es wird mich immer an dieses schöne Wochenende erinnern.&lt;img alt=&#34;A picture of a laptop with a lots of stickers&#34; src=&#34;../../../../../assets/images/gpn22_laptop_day_4.jpg&#34; width=&#34;800&#34; /&gt;&lt;/p&gt;&lt;p&gt;Natürlich wäre die ganze GPN nichts ohne Entropia und die ganzen Trolle die überall geholfen haben. Für mich ist klar, dass ich nächstes Jahr definitiv auch Trollen möchte um etwas zurückzugeben.&lt;/p&gt;&lt;p&gt;Jetzt sitze ich in meinem Hotel und werde den Abend noch schön ausklingen lassen. Vielleicht etwas serie schauen, wenn das Internet mitmacht oder vielleicht noch etwas mit meinen Katzenohren durch die Stadt laufen und Musik hören. Aber egal wie ich mich entscheide, eins ist klar. Ich komme nächstes Jahr wieder und ich kann es kaum erwarten.&lt;/p&gt;</description><link>https://chojo.dev/blog/2024/06/02/gpn22-tag-4--das-ende-und-der-anfang/</link> <pubDate>Sun, 02 Jun 2024 16:23:55 +0200</pubDate><source url="https://chojo.dev/feed_rss_created.xml">Chojo - Dev Blog and Portfolio</source><guid isPermaLink="true">https://chojo.dev/blog/2024/06/02/gpn22-tag-4--das-ende-und-der-anfang/</guid> </item> <item> <title>GPN22 Tag 3 | Nix ist ne ganze Menge</title> <author>chojo</author> <description>&lt;h1 id=&#34;gpn22-tag-3-nix-ist-ne-ganze-menge&#34;&gt;GPN22 Tag 3 | Nix ist ne ganze Menge&lt;/h1&gt;&lt;p&gt;Tag drei begann in etwa genauso wie Tag zwei. Diesmal stand ein Nix Talk am morgen an und daher war später aufstehen nicht wirklich eine Option.&lt;/p&gt;&lt;p&gt;Also aufstehen, duschen, frühstücken und ab zur GPN. Diesmal zu Fuß um zumindest ein bisschen Bewegung zu haben. Angekommen wurde dann erstmal noch schnell der Blog Eintrag für Tag 2 fertig gemacht und hochgeladen.&lt;/p&gt;&lt;!-- more --&gt;&lt;p&gt;Der NixOS Talk mit dem Namen &#34;Von Nix kommt Nix&#34; war überraschend informativ und auch super differenziert, was Vor- und Nachteile angeht. Gepaart mit gelegentlichen lachern, obligatorischen Nix Witzen und anderem. Klare empfehlung. Die Flakes erscheinen mir jedoch immer noch wie schwarze Magie. Der Talk selbst war dabei super high Level. Ich hatte anderes erwartet, aber was ich bekommen habe, war auch gut.&lt;/p&gt;&lt;p&gt;Zurück am Platz hat Nick das bytecode patching gelöst, was letzte Nacht immer noch nicht funktioniert hatte. Nach einiger Zeit haben wir dann auch den Fehler in meinem Code gefunden, welches am Ende natürlich nur eine fehlende Negierung eines if war.&lt;/p&gt;&lt;p&gt;Eine neue Runde am Stickertisch bescherte mir wieder ein paar Neuzugänge und ein italiener der bei unserer CTF Gruppe mitgemacht hat, hat einfach mal eine Familienpizza bestellt. Etwas später wollte ich mich dann bei einem Talk Besuch mit Johnny und Nick anschließen zum Thema Energiemonitoring anschauen. Der war jedoch voll und am Ende landeten wir in einem Talk über Zivilcourage. Ein emotionaler aber auch informativer Talk, wie man mit kritischen Situationen umgeht und wie man am besten Menschen in Bedrängnis hilft.&lt;/p&gt;&lt;p&gt;Eigentlich wollte ich den darauffolgenden Talk über Rest in the Cloud sehen, aber die Stühle haben mir echt Rückenschmerzen verursacht. Und nachdem ich die Schlange beim Herausgehen gesehen habe, war bereits klar, dass ich definitiv nicht wieder reinkomme, jetzt wo ich den Saal verlassen hatte. Also ging es zurück zum Platz. Blog schreiben, reden und noch mehr. Gegenüber haben sich außerdem eine Familie aus Koblenz niedergelassen, mit denen wir am letzten Abend schon etwas Kontakt hatten. Die begeisterung der beiden Jungs mir gegenüber, während sie ihren Bot (Ich vermute für das Snake Battle hier vor Ort) beim gelegentlichen Gewinnen zujubelten war wirklich wundervoll.&lt;/p&gt;&lt;p&gt;Gegen Nachmittag schaute Lynx dann noch vorbei, der uns von Zeit zu Zeit gesellschaft leistete.&lt;/p&gt;&lt;p&gt;Der Talk über die ePA war mit Abstand einer der besten Talks bisher. Ich wünschte, ich hätte so einen technisch Interessierten und offenen Hausarzt. Die behandelten Themen fühlten sich spot on an und auch für mich habe ich eine Menge mitgenommen and möglichen &#34;Krankheitsbildern&#34;, die eigentlich gar keine sind und eher gesellschaftlich so behandelt werden. Ich kann wirklich nur empfehlen diesen Talk online nachzuschauen wenn möglich. Auch wenn gegen Ende etwas abgedriftet wurde, fand ich Konzepte wie informationelle Krankheit super interessant und sollten allgemein mehr Aufmerksamkeit erhalten.&lt;/p&gt;&lt;p&gt;Frisch nach dem Talk erinnerte ich mich, dass ja die neue NixOs Version seit letztem Abend verfügbar ist. Da der ganze Spaß mein erstes major Update ist, gab es erstmal viel Unbekanntes. Schönerweise waren die NixOS docs aufschlussreich. Kurz den stable und Home Manager Channel geändert, kurzes update und das rebuilden konnte schon beginnen. Nach dem ersten restart jedoch noch nichts. Also zurück in die Config. Alles richtig, also nochmal meine scripte ausgeführt und diesmal passierte tatsächlich was. Ein restart später und die GEwissheit war da, dass ich erfolgreich auf 24.05 geupdated habe. Das einzige Fehlende war nun noch Plasma 6, aber das war auch mit einer Zeile erledigt. Johnny motivierte mich dann noch dazu meinen fingerprint reader endlich mal einzurichten und zeigte mir das wunderbare nixos-hardware repository, dass natürlich auch extras für mein Framework enthielt. &lt;/p&gt;&lt;p&gt;Nach diesem erfolgreichen Update war es endlich Zeit zum Essen. Durchaus verdient würde ich sagen. Statt dem guten Soja Gulasch gabs schönes Kartoffelgulasch, vor allem weil die Wartezeit für das Soja Gulasch eher richtung einer Stunde ging und das Kartoffelgulasch ziemlich sofort verfügbar war. Danach gabs dann noch die wunderbaren Waffeln. Großes Lob an die GPN, dass man wirklich überall mit Karte bezahlen kann. Die Apotheke um die Ecke bei mir würde Staunen.&lt;/p&gt;&lt;p&gt;Nach weiteren Gesprächen und dem Verbreiten von Nix Propaganda habe ich natürlich den Beginn der Nix Meetups verpasst. Ich hab mich dann dennoch mit Duckie in das Meetup geschlichen und ein paar Sticker ergattert. Die Luft da drin war jedoch so warm und Stickig, dass ich nicht wirklich lange ausgehalten hab. War wohl Nix.&lt;/p&gt;&lt;p&gt;Also wieder zurück zum Platz und die erhaltene Nix Sticker auf dem Laptop anbringen. Das war so ziemlich mein absoluter Milestone den ich erreichen wollte. Außerdem stellte sich heraus, dass die Person mir gegenüber auch bei der Feuerwehr ist und es entspannte sich ein recht langes und unterhaltsames Gespräch über dies und das. Grüße gehen raus an der Stelle, wenn du das liest!&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;A picture of a laptop with a lots of stickers&#34; src=&#34;../../../../../assets/images/gpn22_laptop_day_3.jpg&#34; width=&#34;800&#34; /&gt;&lt;/p&gt;&lt;p&gt;Im Laufe des weiteren Abends ergatterte ich eines dieser coolen LED Namensschilder, mit denen schon super Viele herumgelaufen sind. Das musste ich das natürlich auch haben. Wir fanden die Entwickler im zweiten Stock, den ich nach dem Nix Meetup jetzt zum zweiten Mal betreten hatte. Nach kurzem Suchen wurde uns der Standort der zwei Schöpfer offenbart und für 25€ gabs ein Stück Hardware mit zugehöriger App. Während die App bereits Open Software ist, ist es die Hardware noch nicht, aber man versprach zum Congress da auch nachzubessern.&lt;/p&gt;&lt;p&gt;Die Aussicht aus dem zweiten Stock nutzen wir dann noch für ein paar künstlerische Bilder, um das Farbenspiel festzuhalten, dass sich unter uns erstreckte. Wieder unten angekommen habe ich viel zu lange noch beim KITCTF Spawn gesessen. Heim ging es dann am Ende wirklich erst gegen kurz vor zwei. Motiviert, wie ich war, wollte ich noch am Abend den Blog post fertig schreiben für heute. Das hab ich jetzt hiermit getan. Es ist halb drei... Das wird ein lustiger morgen.&lt;/p&gt;</description><link>https://chojo.dev/blog/2024/06/01/gpn22-tag-3--nix-ist-ne-ganze-menge/</link> <pubDate>Sat, 01 Jun 2024 19:12:24 +0200</pubDate><source url="https://chojo.dev/feed_rss_created.xml">Chojo - Dev Blog and Portfolio</source><guid isPermaLink="true">https://chojo.dev/blog/2024/06/01/gpn22-tag-3--nix-ist-ne-ganze-menge/</guid> </item> <item> <title>GPN22 Tag 2 | Balkonkraftwerke und andere Pfuschereien</title> <author>chojo</author> <description>&lt;h1 id=&#34;gpn22-tag-2-balkonkraftwerke-und-andere-pfuschereien&#34;&gt;GPN22 Tag 2 | Balkonkraftwerke und andere Pfuschereien&lt;/h1&gt;&lt;p&gt;Der zweite Tag begann früh um halb 9. Nach einer schnellen Dusche und einem ausgiebigen Frühstück ging es schon um kurz vor 10 los zur GPN. Unsere Sitzplätze waren leider bereits belegt und nur noch unser Haufen an Campingstühlen zeugte von unserer Existenz an diesem Ort.&lt;/p&gt;&lt;!-- more --&gt;&lt;p&gt;Spontan nahmen wir zu zweit den noch freien Tisch des Koblenzer Hackerspace ein, die uns netterweise Asyl gewährten während ich struggelte eine meiner Minecraft Plugins in eine Library zu verwandeln und irgendwie zu verstehen was FAWE mal wieder da treibt.&lt;/p&gt;&lt;p&gt;Um 12 stand dann ein super informativer Talk über Balkonkraftwerke an. Eine wunderbare präsentation kombiniert mit einem super freien und actually mitreißenden Vortrag. Und das, obwohl es um gesetzestexte, langsame Politik und Ministerien ging. Für mich steht damit erneut fest, dass ich mir definitiv ein Balkonkraftwerk besorgen werde, sobald die Gesetzesänderung durch ist, dass mein Vermieter mir erlauben muss eines anzubringen.&lt;/p&gt;&lt;p&gt;Nach dem Talk ging es erneut zum Stickertisch und ich erbeutete noch ein Cuttermesser, um die Ränder sauber abzuschneiden. Mittlerweile ist er relativ voll. Vielleicht denke ich ja daran, hier noch ein Bild einzufügen.&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;A picture of a laptop with a lots of stickers&#34; src=&#34;../../../../../assets/images/gpn22_laptop_day_2.jpg&#34; width=&#34;800&#34; /&gt;&lt;/p&gt;&lt;p&gt;Danach ging es mit ein bisschen code Pfuscherei für das KIT CTFi weiter. Ich schrieb das erste Mal PHP Code und bin froh mit dieser Sprache offensichtlich nichts verpasst zu haben. Nach ein paar frustrierenden Anlaufen nach einem guten Start und einem Multithreaded Approach mittels Bash Script gehts zu einem neuen Talk. Diesmal über Computer bauen. In dem Fall ein 8 Bit Computer mit Relais. Nach einer recht trockenen aber auch informativen Einführung wurde doch tatsächlich ein 8 Bit &#34;Computer&#34; zusammen gebaut. Und das Klicken der Relais löste nach 30 minuten Talk und Graphen doch schon eine gewisse Euphorie im Raum aus. Eine bessere Zielgruppe für so etwas gibt es vermutlich nicht. Gib einer Gruppe von Technikbegeisterten etwas was sie mit blinkenden Lichtern sehen und durch Klicken hören können und du hast alles, was du brauchst.&lt;/p&gt;&lt;p&gt;Nach dem Talk hatte ich endlich die Chance besagtes Ramen Restaurant auszutesten, dass ich am Anreisetag nicht besuchen konnte. Mein Shoyou Ramen war wirklich ausgezeichnet und auch die obligatorischen Takoyaki waren wunderbar. Auf unserer Suche nach einem Eisladen standen wir für einen kurzen Moment etwas Ratlos in der gegend herum und wurden prompt von einer Frau angesprochen die im kleinsten begehbaren Laden Deutschlands? arbeitet, wie sie stolz betonte. Sie wies uns netterweise den Weg zur Eisdiele die peinlicherweise nach 10 Metern direkt um die Ecke lag. Frisch gestärkt mit essen und nachgezuckert mit Eis ging es dann zurück auf die GPN wo ich mich entschloss erstmal den Blogpost für Tag 2 zu schreiben, bevor ich nochmal den Sticker Tisch auschecke. &lt;/p&gt;&lt;p&gt;Den nächsten Talk skippe ich, um mal wieder etwas Zeit für mich zu haben und nicht permanent von Event zu event zu hasten. Stattdessen widme ich mich einem kleinen Projekt, dass ich bereits etwas länger auf meinem Tisch habe. Angus Mail bescherte mir wie erwartet eine &#34;riesen&#34; Freude, aber nach einiger Zeit ist der Mail Support auch gefixed. Währenddessen hat sich eine andere Gruppe zu uns gesellt und es entwickeln sich angeregte Gespräche über DevOps, NixOs und die Frustration und Freuden mit aktuellen und vergangenen Betriebssystemen. So angeregt, dass ich spontan auch meinen 20 Uhr talk verpasse und damit auch die Chance meinen Merch den ich bestellt habe abzuholen.&lt;/p&gt;&lt;p&gt;Ich wende mich wieder der programmierung zu. Es ist mittlerweile recht spät. Doch späte Zeit bringt oftmals doofe Ideen. Ziel war es eigentlich einfach nur einen String in einer kompilierten class Datei zu ersetzen innerhalb einer Jar. Natürlich könnte man jetzt hingehen und mit ASM die klase auseinandernehmen und in den constants danach zu suchen. Nick empfand es jedoch als deutlich interessanter die Bytes der Klasse nach den Java Specs auseinander zu nehmen und den ganzen Spaß mit plain Java zu lösen. Währenddessen schaute ich beim KIT Tisch vorbei wo ein Freund derzeit ein Gästebuch im internen LAN Netz exposten um zu sehen wie viele Leute so den Spaß durch zufällige Portscans finden.&lt;/p&gt;&lt;p&gt;Nachdem ich mit Waffeln zurück zu unserem Tisch gelockt wurde, war zufällig auch die erste Iteration des Bytecode Replacers durch. Da ich dennoch eine Pause brauchte, schaute ich erneut beim Stickertisch vorbei und ergaunerte ein paar neue Schätze. Der Laptop ist mittlerweile fast voll und noch zwei Tage sind verbleibend. Läuft besser als gedacht.&lt;/p&gt;&lt;p&gt;Um 1 Uhr traten wir dann langsam den Heimweg an. Auf die Party verzichtete ich mal mangels Energie. Auch wenn die Bässe echt gut klangen.&lt;/p&gt;</description><link>https://chojo.dev/blog/2024/05/31/gpn22-tag-2--balkonkraftwerke-und-andere-pfuschereien/</link> <pubDate>Sat, 01 Jun 2024 10:38:51 +0200</pubDate><source url="https://chojo.dev/feed_rss_created.xml">Chojo - Dev Blog and Portfolio</source><guid isPermaLink="true">https://chojo.dev/blog/2024/05/31/gpn22-tag-2--balkonkraftwerke-und-andere-pfuschereien/</guid> </item> <item> <title>GPN22 Tag 1 | Die erste GPN</title> <author>chojo</author> <description>&lt;h1 id=&#34;gpn22-tag-1-die-erste-gpn&#34;&gt;GPN22 Tag 1 | Die erste GPN&lt;/h1&gt;&lt;p&gt;Nach einer morgendlichen Dusche und einem überraschend üppigen Frühstück im Hotel stand noch etwas arbeit an.&lt;/p&gt;&lt;p&gt;Während Freunde bereits Bilder von der noch nicht ganz so startbereiten GPN schicken und plätze reserviert haben für uns, saß ich in meinem Hotelzimmer und löste noch ein paar Probleme an der Arbeit und fasste den Entschluss wirklich einen Blog über meine GPN Erlebnisse zu schreiben.&lt;/p&gt;&lt;!-- more --&gt;&lt;p&gt;Um 14 Uhr kam Nick vom DevCord an, der im selben Hotel wie ich untergekommen ist. Nach einem kurzen Hallo und der Übergabe meines alten Laptops für die GPN ging es dann auch schon los mit der Tram. Die zwei stationen hätte man auch einfach laufen können, aber gut. Spontan natürlich an der weniger optimalen Haltestelle ausgestiegen gabs noch einen kleinen Fußweg, bis ich endlich das Gebäude erblickte, in dem ich mich die nächsten Tage vermutlich vorwiegend aufhalten werde.&lt;/p&gt;&lt;p&gt;Die GPN war auch irgendwie ein inoffizielles DevCord treffen. Zu unserer Gruppe gehörten daher neben &lt;a href=&#34;https://github.com/Goldmensch/&#34;&gt;Nick&lt;/a&gt; außerdem daher auch &lt;a href=&#34;https://elk.zone/chaos.social/@marie&#34;&gt;Marie&lt;/a&gt; mit Anhang, &lt;a href=&#34;https://elk.zone/chaos.social/@johnny&#34;&gt;Johnny&lt;/a&gt;, &lt;a href=&#34;https://github.com/SirYwell/&#34;&gt;SirYwell&lt;/a&gt;, &lt;a href=&#34;https://github.com/TheMeinerLP&#34;&gt;MeinerLP&lt;/a&gt; mit &lt;a href=&#34;https://github.com/OneLiteFeather&#34;&gt;OneLiteFeather&lt;/a&gt; und noch mehr. Duckie haben wir irgendwann adoptiert. Er saß einfach neben uns und irgendwann haben wir festgestellt, dass er einfach so Teil unserer Gruppe geworden ist.&lt;/p&gt;&lt;p&gt;Das Gebäude der ZKM ist überraschend groß. Obwohl ich nicht wirklich weiß, was ich erwartet habe, war ich überrascht, wie groß das ganze doch ist. Und obwohl es praktisch offiziell gerade mit dem ersten Talk losging, war es schon überraschend voll. Die Technik bandbreite selbst reichte von kleinen Minipcs, die noch recht gewöhnlich sind über CRTs bis hin zu stapeln von Server und einer wahren Armee von 3D Drückern die über die Zeit überall im Raum gespawned sind.&lt;/p&gt;&lt;p&gt;Was jedoch noch bunter gemischt als die Technik war, waren die Menschen, die sie mitbrachten. Ich vermute kaum, dass es wirklich vielfältigere Orte gibt als diese Events. Furries, normal erscheinende Menschen, eine Menge an Ohrentragenden wesen und alles dazwischen. Eigentlich gibt es nichts was man vermissen müsste. Vermutlich findet hier wirklich jede:r eine Gruppe an die man sich hängen kann. Der Sitznachbar wird zum Gesprächspartner und später geht man dann sogar zusammen essen und es fühlt sich mehr an als ob man sich bereits längere Zeit kennt. Ich denke vor allem die Gemeinschaft hier ist, was dieses Event wirklich besonders macht.&lt;/p&gt;&lt;p&gt;Ich sitze jetzt hier an Tag 2 und auch wenn ich es vermutlich nicht viel machen werde, sind die wenigen Gespräche die ich hier mit einzelnen Personen hatte wirklich hängen geblieben.&lt;/p&gt;&lt;p&gt;Unsere Gruppe ist relativ groß. Um die 8-10 Leute. An unserem Tisch ist ein ständiges Kommen und Gehen. Einige reisen von weiter weg an, aber irgendwer ist eigentlich immer an unserem Platz. Ansonsten sind bekannte von mir auch relativ über die Halle verteilt. Auch wnn es jetzt nicht so ist, dass ich viele hier kenne. Aber am Ende lernt man natürlich immer neue Menschen kennen.&lt;/p&gt;&lt;p&gt;Zum Anfang gab es weder LAN noch WLAN. Letzteres war zwar technisch existent, mit Übertragungsraten im unteren KB Bereich aber nicht wirklich Nutzbar. Abhilfe wurde mit Hotspots geschaffen über anderen Interne Netzwerke. Der Mobilfunk war natürlich mit der Masse an Geräten an einem Punkt natürlich Maßlos überfordert. Zum Glück besserte sich das im Laufe des Tages (Zumindest das LAN und WLAN). Während neben mir fleißig gestruggelt wurde meinen Laptop mit NixOS aufzusetzen, stellte sich dd erneut als wunderbarer Freund heraus, wenn man einfach einmal den inhalt einer Festplatte wipen wollte, wenn das OS selbst andere Pläne hatte.&lt;/p&gt;&lt;p&gt;Wie zu erwarten war ich mit meinem neu erworbenen Framework absolut nichts Besonderes und das an einem anderen Tag stattfindende Nix Meetup erscheint angesichts der Masse an Nix Nutzern hier eher wie ein Joke. Ein Meetup für nicht Nix Nutzer erscheint mir hier eher einfacher, aber wir werden ja sehen.&lt;/p&gt;&lt;p&gt;Eines meiner Ziele für die GPN war die Oberseite meines Laptops mit Stickern zu dekorieren und am Ende im idealfall kein sichtbares Aluminium mehr zu haben. Nachdem mir die existenz des Stickertisches offenbart wurde gabs kein halten mehr und die ersten Sticker zierten bereits meinen schönen Laptop. Mehr werden bestimmt in den nächsten Tagen folgen.&lt;/p&gt;&lt;p&gt;Natürlich besteht dieses Event nicht nur aus Leuten die in einer Halle zum Sitzen und auf ihre Bildschirme starren. Um uns herum gibt es überall super interessante vorträge. Leider habe ich von dreien bereits zwei verpasst. Den ersten hatte ich schlichtweg &#34;verschlafen&#34; und beim zweiten war fünf Minuten vorher definitiv mehr als 5 Minuten bereits zu spät. Der Talk am Abend der über Probleme bei Rechenzentren gehen sollte war zwar unterhaltsam, hat jedoch nicht ganz so den Wert gehabt, den ich mir erhofft hatte. Hoffentlich sind die Talks am zweiten Tag interessanter und ich komme auch rein.&lt;/p&gt;&lt;p&gt;Am Abend stand dann noch etwas socialisen auf dem Programm und Leute nerven und sie nach ihren Projekten ausfragen. Die Gruppe am Nachbartisch hatte einen 3D Drucker und verschenkten 3D gedruckte Haarreife mit Katzenohren. Natürlich konnte ich da nicht widerstehen und ergatterte ein oranges Paar. Um kurz nach zwölf ging es dann Richtung Hotel. Diesmal jedoch zu Fuß. Wie sich herausstellt, ist der Weg zum Hotel eigentlich nur geradeaus und das wars. Nach 10 Minuten viel ich auf mein Bett. Noch kurz alle Geräte zum Laden angesteckt und dann war das Licht aus. Immerhin konnte ich rausschlagen erst um 9 Uhr zum Frühstück zu gehen.&lt;/p&gt;</description><link>https://chojo.dev/blog/2024/05/30/gpn22-tag-1--die-erste-gpn/</link> <pubDate>Fri, 31 May 2024 18:15:48 +0200</pubDate><source url="https://chojo.dev/feed_rss_created.xml">Chojo - Dev Blog and Portfolio</source><guid isPermaLink="true">https://chojo.dev/blog/2024/05/30/gpn22-tag-1--die-erste-gpn/</guid> </item> <item> <title>GPN22 Tag 0 | Anreise</title> <author>chojo</author> <description>&lt;h1 id=&#34;gpn22-tag-0-anreise&#34;&gt;GPN22 Tag 0 | Anreise&lt;/h1&gt;&lt;p&gt;Da dies meine erste GPN sein wird dachte ich, dass ich meine Erlebnisse gern mal auf meinem Blog festhalten möchte. Vorwiegend als experiment für mich.&lt;/p&gt;&lt;p&gt;Die Anreise war bereits am Mittwoch. Ich mag entspanntes Reisen und tauche ungern irgendwo müde von einer mehrstündigen Bahnreise auf.&lt;/p&gt;&lt;!-- more --&gt;&lt;p&gt;Bahn Tickets wie immer im Voraus gekauft. Als erfahrener Bahn Reisender weiß man wie das geht. Wie immer kam dann bereits einige Wochen vor der eigentlichen Fahrt die erste Mail, dass mein Zug leider nicht so fährt wie ich ihn gebucht habe. Der ICE 77 fährt jetzt eine Stunde früher und kommt genauso spät an wie vorher. Das ist natürlich schlau. So muss die Bahn natürlich nichts erstatten, obwohl ich persönlich eine Stunde länger auf meiner Reise unterwegs bin. Und all das nur, weil man jetzt Krampfhaft versucht alle Baustellen vor der EM fertig zu bekommen, damit zumindest mal für einen Monat die Züge halbwegs planmäßig Fahren können.&lt;/p&gt;&lt;p&gt;Anstatt jedoch einfach mein Ticket auf die Alternative Verbindung umzubuchen, welche auch vom ICE 77 bedient wird, hebt die Bahn meine Zugbindung auf und damit verschwindet auch meine Sitzplatzreservierung im Nirvana. Also auf neue Sitzplatzreservierung für denselben Zug erneut Buchen. Wenn man sich denkt, dass garantiert nicht alle ihre 5 € dafür zurückfordern gibt das auf Dauer bestimmt ein bisschen extra Geld. Aber die Bahn hat es ja auch nötig.&lt;/p&gt;&lt;p&gt;Und immerhin gibt sich die Bahn alle mühe und terrorisiert einen nahezu jetzt mit E-Mails und Push-Benachrichtigungen damit man auch auf keinen Fall nicht sieht, dass die Verbindung so nicht funktioniert. Allerdings erst vier Tage vorher. Wenn man nicht regelmäßig (Bei mir mindestens einmal pro Woche) die geplanten Verbindungen selber prüft, bekommt man das so relativ spät erst mit, dass sich eventuelle Pläne geändert haben.&lt;/p&gt;&lt;p&gt;Während ich mich jetzt also eine Stunde früher als geplant zum Bahnhof begebe, ist der ICE tatsächlich pünktlich. Meine neue Sitzplatzreservierung steht nicht am Sitzplatz und da genug freie Plätze die anscheinend nicht reserviert sind frei sind, verzichte ich auf das Verjagen der Personen auf meinem reservierten Platz. Gerade in den Sitz gefallen fällt mir jedoch auf, dass ich meinen geliebten Campingstuhl vergessen habe. Tja, das wars wohl erstmal mit gemütlich sitzen auf der GPN. Aber Karlsruhe ist immerhin kein Dorf, also wird man sich dort vermutlich auch einen neuen Stuhl besorgen können.&lt;/p&gt;&lt;p&gt;Meine Pläne am Donnerstagmorgen mir schnell noch einen Stuhl zu besorgen werden im DevCord jedoch schnell zerschlagen. Im gegensatz zum gottlosen Berlin ist in Baden-Württemberg morgen ein Feiertag und nichts mit einkaufen.&lt;/p&gt;&lt;p&gt;Auf der Fahrt nach Karlsruhe gebe ich mich ausnahmsweise mal Podcasts hin. Und während ich dem SZ Podcast zu den Wirecard prozessen lausche, die überraschend interessant und unterhaltsam sind, zieht draußen Deutschland vorbei.&lt;/p&gt;&lt;p&gt;Während ich mich Karlsruhe nähere begebe ich mich auf die Suche nach einer gescheiten App für den Karlsruher ÖPNV. Am Ende setzt sich jedoch Google Maps durch zum Navigieren und der DB Navigator zum Ticket kaufen. Die offizielle App hat mich nicht überzeugt. Aber vielleicht erwarte ich nach der BVG App auch einfach zu viel. Das Karlsruhe Waben hat und es nirgends einfach eine Erklärung gibt die groß eine solche ist, wähle ich einfach die Tageskarte aus und gut ist. Für ein Deutschlandticket nutze ich leider absolut nicht genug ÖPNV.&lt;/p&gt;&lt;p&gt;Um 17 Uhr, fast pünktlich auf die Minute, erreichen wir dann Karlsruhe. Die Fahrt zum Hotel geht dank Maps also unkompliziert. Nach einem kurzen Einchecken im Hotel, das dank online Check-In und Schlüsselbox mit Pin ohne jeglichen menschlichen Kontakt abläuft, gehts also wieder raus auf die Straße.&lt;/p&gt;&lt;p&gt;Der Decathlon ist schnell mit der Bahn erreicht. Die Karlsruher Straßenbahnen haben einen echt guten Takt, oder die gegenden in denen ich unterwegs bin sind einfach nur gut angebunden. Ich besorge mir also einen neuen Campingstuhl und widerstehe auf dem Rückweg mich beim IKEA mit HotDogs einzudecken.&lt;/p&gt;&lt;p&gt;Zurück im Hotel lade ich schnell meinen Stuhl ab und nach einer kurzen Verschnaufpause gehts wieder raus auf die Straße. Da die Straßenbahn gerade kommt, nehme ich die und bin nach zwei Stationen in der Innenstadt (vermute zumindest, dass es hier nur eine gibt). Auf dem DevCord wurde mir eine Ramen bar empfohlen. Die ist jedoch so voll, dass ich in der nächsten Stunde vermutlich keinen Platz bekommen hätte. Da es mittlerweile 20 Uhr ist in mein Mittagessen solide 8 Stunden her ist, habe ich jedoch nicht mehr die Ausdauer so lange zu warten. Versuche ich es halt morgen nochmal.&lt;/p&gt;&lt;p&gt;Am Ende wird es das Frittenwerk, wo ich mir die vegetarische Currywurst mit Pommes gönne. Ausgewogene Ernährung kann ich. Den Weg zurück zum Hotel laufe ich, um mich zumindest ein wenig besser zu fühlen.&lt;/p&gt;&lt;p&gt;Zurück im Hotel wird das obligatorische HDMI Kabel an den Fernseher angeschlossen und mit ein wenig Fire Force der Abend beendet.&lt;/p&gt;</description><link>https://chojo.dev/blog/2024/05/29/gpn22-tag-0--anreise/</link> <pubDate>Thu, 30 May 2024 10:37:35 +0200</pubDate><source url="https://chojo.dev/feed_rss_created.xml">Chojo - Dev Blog and Portfolio</source><guid isPermaLink="true">https://chojo.dev/blog/2024/05/29/gpn22-tag-0--anreise/</guid> </item> <item> <title>Sharing and Publishing Dependencies with Gradle</title> <author>chojo</author> <description>&lt;h1 id=&#34;sharing-and-publishing-dependencies-with-gradle&#34;&gt;Sharing and Publishing Dependencies with Gradle&lt;/h1&gt;&lt;p&gt;&lt;a href=&#34;../../../../de/gradle_sharing_dependencies/&#34;&gt;German Version&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Reusing or accessing code from other projects with gradle is very easy.This blog posts dives into publishing dependencies to your local maven repository (or remote) to use it in another project.We also take a short look at online repositories and the small extras you have to account for when your projects are minecraft plugins.&lt;/p&gt;&lt;p&gt;If you are not familiar with gradle yet, have a look at my previous post about &lt;a href=&#34;../../../../2023/08/04/minecraft-development-with-gradle-basic-and-advanced--a-guide/&#34;&gt;gradle basics&lt;/a&gt;.&lt;/p&gt;&lt;!-- more --&gt;&lt;h2 id=&#34;project-setup&#34;&gt;Project Setup&lt;/h2&gt;&lt;p&gt;We have two projects which are named &lt;code&gt;Project A&lt;/code&gt; and &lt;code&gt;Project B&lt;/code&gt; for simplicity.In the end &lt;code&gt;Project A&lt;/code&gt; will implement code and functions that are used by &lt;code&gt;Project B&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Since this is the more complex setup we&#39;re going to start with this.&lt;/p&gt;&lt;h3 id=&#34;project-a-the-provider&#34;&gt;Project A - The Provider&lt;/h3&gt;&lt;p&gt;&lt;code&gt;Project A&lt;/code&gt; will provide code accessed by &lt;code&gt;Project B&lt;/code&gt;.That means we need to do several things:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Create a new gradle project named &lt;code&gt;Project A&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Add some logic/code to it, that we want to use in &lt;code&gt;Project B&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Publish our project into our local maven repository&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Let&#39;s start with the setup itself. The configuration for our project and our class we want to use in our other project look like this:&lt;/p&gt;&lt;div class=&#34;tabbed-set tabbed-alternate&#34; data-tabs=&#34;1:3&#34;&gt;&lt;input checked=&#34;checked&#34; id=&#34;__tabbed_1_1&#34; name=&#34;__tabbed_1&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_1_2&#34; name=&#34;__tabbed_1&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_1_3&#34; name=&#34;__tabbed_1&#34; type=&#34;radio&#34; /&gt;&lt;div class=&#34;tabbed-labels&#34;&gt;&lt;label for=&#34;__tabbed_1_1&#34;&gt;build.gradle.kts&lt;/label&gt;&lt;label for=&#34;__tabbed_1_2&#34;&gt;settings.gradle.kts&lt;/label&gt;&lt;label for=&#34;__tabbed_1_3&#34;&gt;src/main/java/dev/chojo/projecta/ProjectA.java&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-content&#34;&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;For now we take it simple.We defined our group and version.No dependencies and no additional repositories.&lt;/p&gt;&lt;div class=&#34;language-js highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nx&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-2&#34;&gt;&lt;a id=&#34;__codelineno-0-2&#34; name=&#34;__codelineno-0-2&#34; href=&#34;#__codelineno-0-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;java&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-3&#34;&gt;&lt;a id=&#34;__codelineno-0-3&#34; name=&#34;__codelineno-0-3&#34; href=&#34;#__codelineno-0-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-4&#34;&gt;&lt;a id=&#34;__codelineno-0-4&#34; name=&#34;__codelineno-0-4&#34; href=&#34;#__codelineno-0-4&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-5&#34;&gt;&lt;a id=&#34;__codelineno-0-5&#34; name=&#34;__codelineno-0-5&#34; href=&#34;#__codelineno-0-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nx&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;dev.chojo&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-6&#34;&gt;&lt;a id=&#34;__codelineno-0-6&#34; name=&#34;__codelineno-0-6&#34; href=&#34;#__codelineno-0-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nx&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;1.0.0&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-7&#34;&gt;&lt;a id=&#34;__codelineno-0-7&#34; name=&#34;__codelineno-0-7&#34; href=&#34;#__codelineno-0-7&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-8&#34;&gt;&lt;a id=&#34;__codelineno-0-8&#34; name=&#34;__codelineno-0-8&#34; href=&#34;#__codelineno-0-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nx&#34;&gt;repositories&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-9&#34;&gt;&lt;a id=&#34;__codelineno-0-9&#34; name=&#34;__codelineno-0-9&#34; href=&#34;#__codelineno-0-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;mavenCentral&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-10&#34;&gt;&lt;a id=&#34;__codelineno-0-10&#34; name=&#34;__codelineno-0-10&#34; href=&#34;#__codelineno-0-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-11&#34;&gt;&lt;a id=&#34;__codelineno-0-11&#34; name=&#34;__codelineno-0-11&#34; href=&#34;#__codelineno-0-11&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-12&#34;&gt;&lt;a id=&#34;__codelineno-0-12&#34; name=&#34;__codelineno-0-12&#34; href=&#34;#__codelineno-0-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nx&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-13&#34;&gt;&lt;a id=&#34;__codelineno-0-13&#34; name=&#34;__codelineno-0-13&#34; href=&#34;#__codelineno-0-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;Nothing special here&lt;/p&gt;&lt;div class=&#34;language-js highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-1-1&#34;&gt;&lt;a id=&#34;__codelineno-1-1&#34; name=&#34;__codelineno-1-1&#34; href=&#34;#__codelineno-1-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nx&#34;&gt;rootProject&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;project-a&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;For demonstration purposes we only have one class with one method.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-2-1&#34;&gt;&lt;a id=&#34;__codelineno-2-1&#34; name=&#34;__codelineno-2-1&#34; href=&#34;#__codelineno-2-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;dev.chojo.projecta&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-2&#34;&gt;&lt;a id=&#34;__codelineno-2-2&#34; name=&#34;__codelineno-2-2&#34; href=&#34;#__codelineno-2-2&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-3&#34;&gt;&lt;a id=&#34;__codelineno-2-3&#34; name=&#34;__codelineno-2-3&#34; href=&#34;#__codelineno-2-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;ProjectA&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-4&#34;&gt;&lt;a id=&#34;__codelineno-2-4&#34; name=&#34;__codelineno-2-4&#34; href=&#34;#__codelineno-2-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-5&#34;&gt;&lt;a id=&#34;__codelineno-2-5&#34; name=&#34;__codelineno-2-5&#34; href=&#34;#__codelineno-2-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;cm&#34;&gt; * Prints &amp;quot;Meow&amp;quot; to the console.&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-6&#34;&gt;&lt;a id=&#34;__codelineno-2-6&#34; name=&#34;__codelineno-2-6&#34; href=&#34;#__codelineno-2-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-7&#34;&gt;&lt;a id=&#34;__codelineno-2-7&#34; name=&#34;__codelineno-2-7&#34; href=&#34;#__codelineno-2-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;meow&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(){&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-8&#34;&gt;&lt;a id=&#34;__codelineno-2-8&#34; name=&#34;__codelineno-2-8&#34; href=&#34;#__codelineno-2-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Meow&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-9&#34;&gt;&lt;a id=&#34;__codelineno-2-9&#34; name=&#34;__codelineno-2-9&#34; href=&#34;#__codelineno-2-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-10&#34;&gt;&lt;a id=&#34;__codelineno-2-10&#34; name=&#34;__codelineno-2-10&#34; href=&#34;#__codelineno-2-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Now that we have our basic project setup we can work on publishing our changes.This is fairly simple.All we need to do is to import the &lt;code&gt;maven-publish&lt;/code&gt; plugin and configure it.&lt;/p&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;Some parts that were already there were left out now.Only parts that were changed are shown.&lt;/p&gt;&lt;/div&gt;&lt;div class=&#34;language-js highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-3-1&#34;&gt;&lt;a id=&#34;__codelineno-3-1&#34; name=&#34;__codelineno-3-1&#34; href=&#34;#__codelineno-3-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nx&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-2&#34;&gt;&lt;a id=&#34;__codelineno-3-2&#34; name=&#34;__codelineno-3-2&#34; href=&#34;#__codelineno-3-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;java&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-3&#34;&gt;&lt;a id=&#34;__codelineno-3-3&#34; name=&#34;__codelineno-3-3&#34; href=&#34;#__codelineno-3-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`maven-publish`&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-4&#34;&gt;&lt;a id=&#34;__codelineno-3-4&#34; name=&#34;__codelineno-3-4&#34; href=&#34;#__codelineno-3-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-5&#34;&gt;&lt;a id=&#34;__codelineno-3-5&#34; name=&#34;__codelineno-3-5&#34; href=&#34;#__codelineno-3-5&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-6&#34;&gt;&lt;a id=&#34;__codelineno-3-6&#34; name=&#34;__codelineno-3-6&#34; href=&#34;#__codelineno-3-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nx&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-7&#34;&gt;&lt;a id=&#34;__codelineno-3-7&#34; name=&#34;__codelineno-3-7&#34; href=&#34;#__codelineno-3-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;toolchain&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-8&#34;&gt;&lt;a id=&#34;__codelineno-3-8&#34; name=&#34;__codelineno-3-8&#34; href=&#34;#__codelineno-3-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;languageVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;JavaLanguageVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;of&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;21&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-9&#34;&gt;&lt;a id=&#34;__codelineno-3-9&#34; name=&#34;__codelineno-3-9&#34; href=&#34;#__codelineno-3-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-10&#34;&gt;&lt;a id=&#34;__codelineno-3-10&#34; name=&#34;__codelineno-3-10&#34; href=&#34;#__codelineno-3-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;withSourcesJar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-11&#34;&gt;&lt;a id=&#34;__codelineno-3-11&#34; name=&#34;__codelineno-3-11&#34; href=&#34;#__codelineno-3-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;withJavadocJar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-12&#34;&gt;&lt;a id=&#34;__codelineno-3-12&#34; name=&#34;__codelineno-3-12&#34; href=&#34;#__codelineno-3-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-13&#34;&gt;&lt;a id=&#34;__codelineno-3-13&#34; name=&#34;__codelineno-3-13&#34; href=&#34;#__codelineno-3-13&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-14&#34;&gt;&lt;a id=&#34;__codelineno-3-14&#34; name=&#34;__codelineno-3-14&#34; href=&#34;#__codelineno-3-14&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nx&#34;&gt;publishing&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-15&#34;&gt;&lt;a id=&#34;__codelineno-3-15&#34; name=&#34;__codelineno-3-15&#34; href=&#34;#__codelineno-3-15&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;publications&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-16&#34;&gt;&lt;a id=&#34;__codelineno-3-16&#34; name=&#34;__codelineno-3-16&#34; href=&#34;#__codelineno-3-16&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;create&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;MavenPublication&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;maven&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-17&#34;&gt;&lt;a id=&#34;__codelineno-3-17&#34; name=&#34;__codelineno-3-17&#34; href=&#34;#__codelineno-3-17&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;components&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;java&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-18&#34;&gt;&lt;a id=&#34;__codelineno-3-18&#34; name=&#34;__codelineno-3-18&#34; href=&#34;#__codelineno-3-18&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-19&#34;&gt;&lt;a id=&#34;__codelineno-3-19&#34; name=&#34;__codelineno-3-19&#34; href=&#34;#__codelineno-3-19&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-20&#34;&gt;&lt;a id=&#34;__codelineno-3-20&#34; name=&#34;__codelineno-3-20&#34; href=&#34;#__codelineno-3-20&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A lot happened here, so lets go through it step by step.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;We added &lt;code&gt;maven-publish&lt;/code&gt; to our &lt;code&gt;plugins&lt;/code&gt;. This allows us to publish artifacts in the first place&lt;/li&gt;&lt;li&gt;We configured the &lt;code&gt;java&lt;/code&gt; plugin:&lt;ol&gt;&lt;li&gt;We defined the language version our library will use&lt;/li&gt;&lt;li&gt;We defined that we want to create a jar containing our source&lt;/li&gt;&lt;li&gt;We defined that we want to create a jar containing our javadocs&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;We configured the &lt;code&gt;maven-publish&lt;/code&gt; plugin.&lt;ol&gt;&lt;li&gt;We created a new publications section&lt;/li&gt;&lt;li&gt;In that section we created a new &lt;code&gt;MavenPublication&lt;/code&gt; called &lt;code&gt;maven&lt;/code&gt;&lt;/li&gt;&lt;li&gt;We defined that this publication should return all components returned by our java plugin. This will be:&lt;ul&gt;&lt;li&gt;One jar containing our compiled code&lt;/li&gt;&lt;li&gt;One jar containing our source code&lt;/li&gt;&lt;li&gt;One jar containing our java docs&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Now that this is done we can publish into our maven local by executing the &lt;code&gt;publishToMavenLocal&lt;/code&gt; task of gradle.&lt;/p&gt;&lt;h4 id=&#34;transitive-dependencies&#34;&gt;Transitive dependencies&lt;/h4&gt;&lt;p&gt;If your api depends on another api you can tell this to others.Instead of using &lt;code&gt;implementation&lt;/code&gt; in your &lt;code&gt;dependencies&lt;/code&gt; section you use &lt;code&gt;api&lt;/code&gt;.For that you also need to import &lt;code&gt;java-library&lt;/code&gt; as a plugin.&lt;/p&gt;&lt;div class=&#34;language-js highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-4-1&#34;&gt;&lt;a id=&#34;__codelineno-4-1&#34; name=&#34;__codelineno-4-1&#34; href=&#34;#__codelineno-4-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nx&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-2&#34;&gt;&lt;a id=&#34;__codelineno-4-2&#34; name=&#34;__codelineno-4-2&#34; href=&#34;#__codelineno-4-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;java&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-3&#34;&gt;&lt;a id=&#34;__codelineno-4-3&#34; name=&#34;__codelineno-4-3&#34; href=&#34;#__codelineno-4-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`maven-publish`&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-4&#34;&gt;&lt;a id=&#34;__codelineno-4-4&#34; name=&#34;__codelineno-4-4&#34; href=&#34;#__codelineno-4-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`java-library`&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-5&#34;&gt;&lt;a id=&#34;__codelineno-4-5&#34; name=&#34;__codelineno-4-5&#34; href=&#34;#__codelineno-4-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-6&#34;&gt;&lt;a id=&#34;__codelineno-4-6&#34; name=&#34;__codelineno-4-6&#34; href=&#34;#__codelineno-4-6&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-7&#34;&gt;&lt;a id=&#34;__codelineno-4-7&#34; name=&#34;__codelineno-4-7&#34; href=&#34;#__codelineno-4-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nx&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-8&#34;&gt;&lt;a id=&#34;__codelineno-4-8&#34; name=&#34;__codelineno-4-8&#34; href=&#34;#__codelineno-4-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;api&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;de.chojo.sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;2.3.9&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-9&#34;&gt;&lt;a id=&#34;__codelineno-4-9&#34; name=&#34;__codelineno-4-9&#34; href=&#34;#__codelineno-4-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will make them import the library your depend on as a transitive dependency as well.&lt;/p&gt;&lt;h3 id=&#34;project-b-the-consumer&#34;&gt;Project B - The Consumer&lt;/h3&gt;&lt;p&gt;Now that we published our artifacts into our local maven repository we can access it from other projects on our system.&lt;/p&gt;&lt;div class=&#34;admonition warning&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Warning&lt;/p&gt;&lt;p&gt;If you send your &lt;code&gt;Project B&lt;/code&gt; to someone else they need to execute the &lt;code&gt;publishToMavenLocal&lt;/code&gt; task themself on &lt;code&gt;Project A&lt;/code&gt;.To properly share dependencies you should use &lt;a href=&#34;#remote-repositories&#34;&gt;remote repositories&lt;/a&gt;.The local maven repository should only be used for debugging and general testing of your project.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;First we create our basic project setup again like we did on &lt;code&gt;Project A&lt;/code&gt;.&lt;/p&gt;&lt;div class=&#34;tabbed-set tabbed-alternate&#34; data-tabs=&#34;2:3&#34;&gt;&lt;input checked=&#34;checked&#34; id=&#34;__tabbed_2_1&#34; name=&#34;__tabbed_2&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_2_2&#34; name=&#34;__tabbed_2&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_2_3&#34; name=&#34;__tabbed_2&#34; type=&#34;radio&#34; /&gt;&lt;div class=&#34;tabbed-labels&#34;&gt;&lt;label for=&#34;__tabbed_2_1&#34;&gt;build.gradle.kts&lt;/label&gt;&lt;label for=&#34;__tabbed_2_2&#34;&gt;settings.gradle.kts&lt;/label&gt;&lt;label for=&#34;__tabbed_2_3&#34;&gt;src/main/java/dev/chojo/projectb/ProjectB.java&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-content&#34;&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;We defined our group and version.No dependencies and no additional repositories yet.&lt;/p&gt;&lt;div class=&#34;language-js highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-5-1&#34;&gt;&lt;a id=&#34;__codelineno-5-1&#34; name=&#34;__codelineno-5-1&#34; href=&#34;#__codelineno-5-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nx&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-2&#34;&gt;&lt;a id=&#34;__codelineno-5-2&#34; name=&#34;__codelineno-5-2&#34; href=&#34;#__codelineno-5-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;java&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-3&#34;&gt;&lt;a id=&#34;__codelineno-5-3&#34; name=&#34;__codelineno-5-3&#34; href=&#34;#__codelineno-5-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-4&#34;&gt;&lt;a id=&#34;__codelineno-5-4&#34; name=&#34;__codelineno-5-4&#34; href=&#34;#__codelineno-5-4&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-5&#34;&gt;&lt;a id=&#34;__codelineno-5-5&#34; name=&#34;__codelineno-5-5&#34; href=&#34;#__codelineno-5-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nx&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;dev.chojo&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-6&#34;&gt;&lt;a id=&#34;__codelineno-5-6&#34; name=&#34;__codelineno-5-6&#34; href=&#34;#__codelineno-5-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nx&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;1.0.0&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-7&#34;&gt;&lt;a id=&#34;__codelineno-5-7&#34; name=&#34;__codelineno-5-7&#34; href=&#34;#__codelineno-5-7&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-8&#34;&gt;&lt;a id=&#34;__codelineno-5-8&#34; name=&#34;__codelineno-5-8&#34; href=&#34;#__codelineno-5-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nx&#34;&gt;repositories&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-9&#34;&gt;&lt;a id=&#34;__codelineno-5-9&#34; name=&#34;__codelineno-5-9&#34; href=&#34;#__codelineno-5-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;mavenCentral&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-10&#34;&gt;&lt;a id=&#34;__codelineno-5-10&#34; name=&#34;__codelineno-5-10&#34; href=&#34;#__codelineno-5-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-11&#34;&gt;&lt;a id=&#34;__codelineno-5-11&#34; name=&#34;__codelineno-5-11&#34; href=&#34;#__codelineno-5-11&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-12&#34;&gt;&lt;a id=&#34;__codelineno-5-12&#34; name=&#34;__codelineno-5-12&#34; href=&#34;#__codelineno-5-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nx&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-13&#34;&gt;&lt;a id=&#34;__codelineno-5-13&#34; name=&#34;__codelineno-5-13&#34; href=&#34;#__codelineno-5-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;Nothing special here&lt;/p&gt;&lt;div class=&#34;language-js highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-6-1&#34;&gt;&lt;a id=&#34;__codelineno-6-1&#34; name=&#34;__codelineno-6-1&#34; href=&#34;#__codelineno-6-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nx&#34;&gt;rootProject&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;project-b&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-7-1&#34;&gt;&lt;a id=&#34;__codelineno-7-1&#34; name=&#34;__codelineno-7-1&#34; href=&#34;#__codelineno-7-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;dev.chojo.projectb&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-2&#34;&gt;&lt;a id=&#34;__codelineno-7-2&#34; name=&#34;__codelineno-7-2&#34; href=&#34;#__codelineno-7-2&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-3&#34;&gt;&lt;a id=&#34;__codelineno-7-3&#34; name=&#34;__codelineno-7-3&#34; href=&#34;#__codelineno-7-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;ProjectB&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-4&#34;&gt;&lt;a id=&#34;__codelineno-7-4&#34; name=&#34;__codelineno-7-4&#34; href=&#34;#__codelineno-7-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-5&#34;&gt;&lt;a id=&#34;__codelineno-7-5&#34; name=&#34;__codelineno-7-5&#34; href=&#34;#__codelineno-7-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-6&#34;&gt;&lt;a id=&#34;__codelineno-7-6&#34; name=&#34;__codelineno-7-6&#34; href=&#34;#__codelineno-7-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Now we get to importing our &lt;code&gt;Project A&lt;/code&gt;.For that we need to do three things:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Add &lt;code&gt;mavenLocal()&lt;/code&gt; as a repository.&lt;/li&gt;&lt;li&gt;Configure our java task to use the same or a newer toolchain version than &lt;code&gt;Project A&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Add our project as a dependency&lt;/li&gt;&lt;/ol&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;Some parts that were already there were left out now.Only parts that were changed are shown.&lt;/p&gt;&lt;/div&gt;&lt;div class=&#34;language-js highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-8-1&#34;&gt;&lt;a id=&#34;__codelineno-8-1&#34; name=&#34;__codelineno-8-1&#34; href=&#34;#__codelineno-8-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nx&#34;&gt;repositories&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-8-2&#34;&gt;&lt;a id=&#34;__codelineno-8-2&#34; name=&#34;__codelineno-8-2&#34; href=&#34;#__codelineno-8-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;mavenCentral&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-8-3&#34;&gt;&lt;a id=&#34;__codelineno-8-3&#34; name=&#34;__codelineno-8-3&#34; href=&#34;#__codelineno-8-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;mavenLocal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-8-4&#34;&gt;&lt;a id=&#34;__codelineno-8-4&#34; name=&#34;__codelineno-8-4&#34; href=&#34;#__codelineno-8-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-8-5&#34;&gt;&lt;a id=&#34;__codelineno-8-5&#34; name=&#34;__codelineno-8-5&#34; href=&#34;#__codelineno-8-5&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-8-6&#34;&gt;&lt;a id=&#34;__codelineno-8-6&#34; name=&#34;__codelineno-8-6&#34; href=&#34;#__codelineno-8-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nx&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-8-7&#34;&gt;&lt;a id=&#34;__codelineno-8-7&#34; name=&#34;__codelineno-8-7&#34; href=&#34;#__codelineno-8-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;toolchain&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-8-8&#34;&gt;&lt;a id=&#34;__codelineno-8-8&#34; name=&#34;__codelineno-8-8&#34; href=&#34;#__codelineno-8-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;languageVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;JavaLanguageVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;of&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;21&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-8-9&#34;&gt;&lt;a id=&#34;__codelineno-8-9&#34; name=&#34;__codelineno-8-9&#34; href=&#34;#__codelineno-8-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-8-10&#34;&gt;&lt;a id=&#34;__codelineno-8-10&#34; name=&#34;__codelineno-8-10&#34; href=&#34;#__codelineno-8-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-8-11&#34;&gt;&lt;a id=&#34;__codelineno-8-11&#34; name=&#34;__codelineno-8-11&#34; href=&#34;#__codelineno-8-11&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-8-12&#34;&gt;&lt;a id=&#34;__codelineno-8-12&#34; name=&#34;__codelineno-8-12&#34; href=&#34;#__codelineno-8-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nx&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-8-13&#34;&gt;&lt;a id=&#34;__codelineno-8-13&#34; name=&#34;__codelineno-8-13&#34; href=&#34;#__codelineno-8-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;implementation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;dev.chojo&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;project-a&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;1.0.0&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-8-14&#34;&gt;&lt;a id=&#34;__codelineno-8-14&#34; name=&#34;__codelineno-8-14&#34; href=&#34;#__codelineno-8-14&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we can go into our &lt;code&gt;Project B&lt;/code&gt; class, create a new instance of our &lt;code&gt;Project A&lt;/code&gt; class and call the meow method.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-9-1&#34;&gt;&lt;a id=&#34;__codelineno-9-1&#34; name=&#34;__codelineno-9-1&#34; href=&#34;#__codelineno-9-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kn&#34;&gt;package&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;dev.chojo.projectb&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-9-2&#34;&gt;&lt;a id=&#34;__codelineno-9-2&#34; name=&#34;__codelineno-9-2&#34; href=&#34;#__codelineno-9-2&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-9-3&#34;&gt;&lt;a id=&#34;__codelineno-9-3&#34; name=&#34;__codelineno-9-3&#34; href=&#34;#__codelineno-9-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;dev.chojo.projecta.ProjectA&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-9-4&#34;&gt;&lt;a id=&#34;__codelineno-9-4&#34; name=&#34;__codelineno-9-4&#34; href=&#34;#__codelineno-9-4&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-9-5&#34;&gt;&lt;a id=&#34;__codelineno-9-5&#34; name=&#34;__codelineno-9-5&#34; href=&#34;#__codelineno-9-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;ProjectB&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-9-6&#34;&gt;&lt;a id=&#34;__codelineno-9-6&#34; name=&#34;__codelineno-9-6&#34; href=&#34;#__codelineno-9-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-9-7&#34;&gt;&lt;a id=&#34;__codelineno-9-7&#34; name=&#34;__codelineno-9-7&#34; href=&#34;#__codelineno-9-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ProjectA&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;meow&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-9-8&#34;&gt;&lt;a id=&#34;__codelineno-9-8&#34; name=&#34;__codelineno-9-8&#34; href=&#34;#__codelineno-9-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-9-9&#34;&gt;&lt;a id=&#34;__codelineno-9-9&#34; name=&#34;__codelineno-9-9&#34; href=&#34;#__codelineno-9-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If we run our main method now we can see that &#34;meow&#34; get printed out.&lt;/p&gt;&lt;p&gt;While this works in our IDE, it will not work when we actually build &lt;code&gt;Project B&lt;/code&gt; and execute our &lt;code&gt;Project B&lt;/code&gt; jar.&lt;/p&gt;&lt;p&gt;This has two reasons:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;We did not define our main class anywhere.&lt;/li&gt;&lt;li&gt;Our IDE does imports &lt;code&gt;Project A&lt;/code&gt; into our class path, since we imported it as &lt;code&gt;implementation&lt;/code&gt;. When we build our IDE can no longer import it and gradle assumes that we will add &lt;code&gt;Project A&lt;/code&gt; ourselves to the classpath. To fix this we can either use the &lt;a href=&#34;https://imperceptiblethoughts.com/shadow/introduction/&#34;&gt;shadow&lt;/a&gt; plugin or the &lt;a href=&#34;https://docs.gradle.org/current/userguide/application_plugin.html&#34;&gt;application&lt;/a&gt; plugin. Configure either of them as described in the documentation&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&#34;note-on-minecraft-plugins&#34;&gt;Note on minecraft plugins&lt;/h2&gt;&lt;p&gt;When you are building a minecraft plugin there are several more things you should consider:&lt;/p&gt;&lt;h3 id=&#34;compileonly-or-implementation&#34;&gt;CompileOnly or Implementation&lt;/h3&gt;&lt;p&gt;Whether your dependency is a &lt;code&gt;compileOnly&lt;/code&gt; or &lt;code&gt;implementation&lt;/code&gt; depends on multiple factos.&lt;/p&gt;&lt;h4 id=&#34;implementation&#34;&gt;Implementation&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;The dependency is not a plugin&lt;/li&gt;&lt;li&gt;Is not hosted in maven central.&lt;/li&gt;&lt;li&gt;You are on an older version than 1.16.5&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Make sure to use &lt;a href=&#34;../../../../2023/08/04/minecraft-development-with-gradle-basic-and-advanced--a-guide/#shading-dependencies-into-our-jar&#34;&gt;shadow and relocation&lt;/a&gt;&lt;/p&gt;&lt;h4 id=&#34;compileonly&#34;&gt;CompileOnly&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;The dependency is hosted on MavenCentral. Use the &lt;a href=&#34;../../../../2023/08/04/minecraft-development-with-gradle-basic-and-advanced--a-guide/#bukkit-libraries---the-better-alternative-to-shading&#34;&gt;library loader&lt;/a&gt;&lt;/li&gt;&lt;li&gt;The dependency is another plugin. &lt;strong&gt;See next section&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&#34;depend-or-softdepend&#34;&gt;Depend or Softdepend&lt;/h3&gt;&lt;p&gt;If your dependency is a plugin and imported as &lt;code&gt;compileOnly&lt;/code&gt; make sure to add its name as a &lt;code&gt;depend&lt;/code&gt; or &lt;code&gt;soft-depend&lt;/code&gt; in your plugin.yml.&lt;/p&gt;&lt;h4 id=&#34;soft-depend&#34;&gt;Soft-Depend&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;Your plugin can work without any class of your dependency&lt;/li&gt;&lt;/ul&gt;&lt;h4 id=&#34;depend&#34;&gt;Depend&lt;/h4&gt;&lt;ul&gt;&lt;li&gt;Your plugin will not work without the dependency.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&#34;remote-repositories&#34;&gt;Remote Repositories&lt;/h2&gt;&lt;p&gt;To allow everyone to build your project regardless of their local maven repository content you should deploy your code into a remove repository.&lt;/p&gt;&lt;p&gt;The most famous one might be &lt;a href=&#34;https://central.sonatype.com/&#34;&gt;Maven Central&lt;/a&gt;.However, publishing there is quite complex and nothing for beginners.The repository is also intended for projects with general usability for the public.&lt;/p&gt;&lt;p&gt;There are several different pieces of software for self-hosting repositories like &lt;a href=&#34;https://www.sonatype.com/products/sonatype-nexus-oss&#34;&gt;sonatype nexus&lt;/a&gt; or &lt;a href=&#34;https://reposilite.com/&#34;&gt;reposilite&lt;/a&gt;.If you don&#39;t want to self-host, there are a some repositories out there that are open to the public.However, have in mind that all those repositories require your project to be open source&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&#34;https://github.com/eldoriarpg/eldonexus/wiki&#34;&gt;Eldonexus&lt;/a&gt; hosted by me. (Reach out via discord, to apply for a namespace)&lt;/li&gt;&lt;li&gt;&lt;a href=&#34;https://github.com/CodeMC&#34;&gt;CodeMC&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;However, in the end publishing to a remote repository works similar.&lt;/p&gt;&lt;p&gt;All you need to do usually is to configure some simple auth:&lt;/p&gt;&lt;div class=&#34;language-js highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-10-1&#34;&gt;&lt;a id=&#34;__codelineno-10-1&#34; name=&#34;__codelineno-10-1&#34; href=&#34;#__codelineno-10-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nx&#34;&gt;publishing&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-2&#34;&gt;&lt;a id=&#34;__codelineno-10-2&#34; name=&#34;__codelineno-10-2&#34; href=&#34;#__codelineno-10-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;publications&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-3&#34;&gt;&lt;a id=&#34;__codelineno-10-3&#34; name=&#34;__codelineno-10-3&#34; href=&#34;#__codelineno-10-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;create&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;MavenPublication&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;maven&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-4&#34;&gt;&lt;a id=&#34;__codelineno-10-4&#34; name=&#34;__codelineno-10-4&#34; href=&#34;#__codelineno-10-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kr&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;components&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;java&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-5&#34;&gt;&lt;a id=&#34;__codelineno-10-5&#34; name=&#34;__codelineno-10-5&#34; href=&#34;#__codelineno-10-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-6&#34;&gt;&lt;a id=&#34;__codelineno-10-6&#34; name=&#34;__codelineno-10-6&#34; href=&#34;#__codelineno-10-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-7&#34;&gt;&lt;a id=&#34;__codelineno-10-7&#34; name=&#34;__codelineno-10-7&#34; href=&#34;#__codelineno-10-7&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-8&#34;&gt;&lt;a id=&#34;__codelineno-10-8&#34; name=&#34;__codelineno-10-8&#34; href=&#34;#__codelineno-10-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;repositories&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-9&#34;&gt;&lt;a id=&#34;__codelineno-10-9&#34; name=&#34;__codelineno-10-9&#34; href=&#34;#__codelineno-10-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;maven&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-10&#34;&gt;&lt;a id=&#34;__codelineno-10-10&#34; name=&#34;__codelineno-10-10&#34; href=&#34;#__codelineno-10-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Example&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-11&#34;&gt;&lt;a id=&#34;__codelineno-10-11&#34; name=&#34;__codelineno-10-11&#34; href=&#34;#__codelineno-10-11&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-12&#34;&gt;&lt;a id=&#34;__codelineno-10-12&#34; name=&#34;__codelineno-10-12&#34; href=&#34;#__codelineno-10-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;authentication&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-13&#34;&gt;&lt;a id=&#34;__codelineno-10-13&#34; name=&#34;__codelineno-10-13&#34; href=&#34;#__codelineno-10-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;credentials&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;PasswordCredentials&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-14&#34;&gt;&lt;a id=&#34;__codelineno-10-14&#34; name=&#34;__codelineno-10-14&#34; href=&#34;#__codelineno-10-14&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;username&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;username&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-15&#34;&gt;&lt;a id=&#34;__codelineno-10-15&#34; name=&#34;__codelineno-10-15&#34; href=&#34;#__codelineno-10-15&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;password&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;password&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-16&#34;&gt;&lt;a id=&#34;__codelineno-10-16&#34; name=&#34;__codelineno-10-16&#34; href=&#34;#__codelineno-10-16&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-17&#34;&gt;&lt;a id=&#34;__codelineno-10-17&#34; name=&#34;__codelineno-10-17&#34; href=&#34;#__codelineno-10-17&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-18&#34;&gt;&lt;a id=&#34;__codelineno-10-18&#34; name=&#34;__codelineno-10-18&#34; href=&#34;#__codelineno-10-18&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-19&#34;&gt;&lt;a id=&#34;__codelineno-10-19&#34; name=&#34;__codelineno-10-19&#34; href=&#34;#__codelineno-10-19&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;url&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;uri&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;https://repo.example.com&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-20&#34;&gt;&lt;a id=&#34;__codelineno-10-20&#34; name=&#34;__codelineno-10-20&#34; href=&#34;#__codelineno-10-20&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-21&#34;&gt;&lt;a id=&#34;__codelineno-10-21&#34; name=&#34;__codelineno-10-21&#34; href=&#34;#__codelineno-10-21&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-22&#34;&gt;&lt;a id=&#34;__codelineno-10-22&#34; name=&#34;__codelineno-10-22&#34; href=&#34;#__codelineno-10-22&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;admonition warning&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Warning&lt;/p&gt;&lt;p&gt;Don&#39;t put your credentials in your code.Read them from some environment variable instead.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Once you configured your repository you have a new tasks called &lt;code&gt;publishMavenPublicationToExampleRepository&lt;/code&gt; which allows you to publish to your remote repository.&lt;/p&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;The task name changes based on the name you assign to your repository.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;And that&#39;s it.Of course there is more to consider like snapshot and stable repositories. Plugins like &lt;a href=&#34;https://github.com/rainbowdashlabs/publishdata&#34;&gt;publishData&lt;/a&gt; or &lt;a href=&#34;https://github.com/KyoriPowered/indra&#34;&gt;indra&lt;/a&gt; can take care of that for example. &lt;/p&gt;&lt;h2 id=&#34;thank-you&#34;&gt;Thank you&lt;/h2&gt;&lt;p&gt;That&#39;s it. Now you can easily share code between your projects or allow others to use code from your projects. &lt;/p&gt;&lt;p&gt;Thanks for reading!If you liked this post, or have some questions, feel free to come by my discord and have a chat!&lt;/p&gt;&lt;p&gt;&lt;a href=&#34;https://discord.chojo.dev&#34;&gt;&lt;img alt=&#34;Discord Server invite for Chojos Coding Hell&#34; src=&#34;https://discordapp.com/api/guilds/1120671561368748092/widget.png?style=banner3&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Or write me a mail at &lt;code&gt;mail [at] chojo [dot] dev&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;If you want to support me, feel free to sponsor me via &lt;a href=&#34;https://github.com/sponsors/rainbowdashlabs&#34;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</description><link>https://chojo.dev/blog/2024/02/14/sharing-and-publishing-dependencies-with-gradle/</link> <pubDate>Wed, 14 Feb 2024 12:41:00 +0100</pubDate><source url="https://chojo.dev/feed_rss_created.xml">Chojo - Dev Blog and Portfolio</source><guid isPermaLink="true">https://chojo.dev/blog/2024/02/14/sharing-and-publishing-dependencies-with-gradle/</guid> </item> <item> <title>Jackson Bukkit - Bukkit serialization done the right way</title> <author>chojo</author> <description>&lt;h1 id=&#34;jackson-bukkit-bukkit-serialization-done-the-right-way&#34;&gt;Jackson Bukkit - Bukkit serialization done the right way&lt;/h1&gt;&lt;p&gt;&lt;a href=&#34;../../../../de/jackson_bukkit/&#34;&gt;German Version&lt;/a&gt;&lt;/p&gt;&lt;p&gt;With the introduction of &lt;a href=&#34;https://docs.papermc.io/paper/reference/paper-plugins&#34;&gt;paper plugins&lt;/a&gt;, paper decided to drop support for the &lt;code&gt;ConfigurationSerializable&lt;/code&gt; interface.While this interface and the system behind it provided a usable way to de/serialise an object fairly easily, it wasn&#39;t ideal by any means.It was hard to learn and required a lot of boilerplate code to simply de/serialise an object.So we&#39;re going to say goodbye to it. It won&#39;t be missed.&lt;/p&gt;&lt;!-- more --&gt;&lt;p&gt;But now we need another system to serialise Bukkit objects and our configuration in general.A big advantage of the built-in interface was that it could serialise bukkit objects like &lt;code&gt;Location&lt;/code&gt; or &lt;code&gt;ItemStack&lt;/code&gt; out of the box.So we needed something similar.For this we will use jackson with one (or two) of my libraries that I maintain.&lt;/p&gt;&lt;h2 id=&#34;what-is-deserialization&#34;&gt;What is de/serialization&lt;/h2&gt;&lt;p&gt;To get you where you are, we should probably take a look at what we are actually talking about.De/serialisation is the process of mapping objects in a programming language into a data format.This data format is usually text for human-readable data, or binary for machine-readable data.You may have heard of them.They have names like yaml, json, xml, toml or properties and many more.&lt;/p&gt;&lt;p&gt;So while our class might look like this:&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Person&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-2&#34;&gt;&lt;a id=&#34;__codelineno-0-2&#34; name=&#34;__codelineno-0-2&#34; href=&#34;#__codelineno-0-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-3&#34;&gt;&lt;a id=&#34;__codelineno-0-3&#34; name=&#34;__codelineno-0-3&#34; href=&#34;#__codelineno-0-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;age&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-4&#34;&gt;&lt;a id=&#34;__codelineno-0-4&#34; name=&#34;__codelineno-0-4&#34; href=&#34;#__codelineno-0-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Address&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;address&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-5&#34;&gt;&lt;a id=&#34;__codelineno-0-5&#34; name=&#34;__codelineno-0-5&#34; href=&#34;#__codelineno-0-5&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-6&#34;&gt;&lt;a id=&#34;__codelineno-0-6&#34; name=&#34;__codelineno-0-6&#34; href=&#34;#__codelineno-0-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Address&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-7&#34;&gt;&lt;a id=&#34;__codelineno-0-7&#34; name=&#34;__codelineno-0-7&#34; href=&#34;#__codelineno-0-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;street&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-8&#34;&gt;&lt;a id=&#34;__codelineno-0-8&#34; name=&#34;__codelineno-0-8&#34; href=&#34;#__codelineno-0-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;city&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-9&#34;&gt;&lt;a id=&#34;__codelineno-0-9&#34; name=&#34;__codelineno-0-9&#34; href=&#34;#__codelineno-0-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-10&#34;&gt;&lt;a id=&#34;__codelineno-0-10&#34; name=&#34;__codelineno-0-10&#34; href=&#34;#__codelineno-0-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It would look like this in various textual representations:&lt;/p&gt;&lt;div class=&#34;tabbed-set tabbed-alternate&#34; data-tabs=&#34;1:5&#34;&gt;&lt;input checked=&#34;checked&#34; id=&#34;__tabbed_1_1&#34; name=&#34;__tabbed_1&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_1_2&#34; name=&#34;__tabbed_1&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_1_3&#34; name=&#34;__tabbed_1&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_1_4&#34; name=&#34;__tabbed_1&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_1_5&#34; name=&#34;__tabbed_1&#34; type=&#34;radio&#34; /&gt;&lt;div class=&#34;tabbed-labels&#34;&gt;&lt;label for=&#34;__tabbed_1_1&#34;&gt;yaml&lt;/label&gt;&lt;label for=&#34;__tabbed_1_2&#34;&gt;json&lt;/label&gt;&lt;label for=&#34;__tabbed_1_3&#34;&gt;toml&lt;/label&gt;&lt;label for=&#34;__tabbed_1_4&#34;&gt;xml&lt;/label&gt;&lt;label for=&#34;__tabbed_1_5&#34;&gt;properties&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-content&#34;&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;div class=&#34;language-yaml highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-1-1&#34;&gt;&lt;a id=&#34;__codelineno-1-1&#34; name=&#34;__codelineno-1-1&#34; href=&#34;#__codelineno-1-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nt&#34;&gt;firstName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Lilly&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-1-2&#34;&gt;&lt;a id=&#34;__codelineno-1-2&#34; name=&#34;__codelineno-1-2&#34; href=&#34;#__codelineno-1-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nt&#34;&gt;secondName&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Tempest&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-1-3&#34;&gt;&lt;a id=&#34;__codelineno-1-3&#34; name=&#34;__codelineno-1-3&#34; href=&#34;#__codelineno-1-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nt&#34;&gt;age&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;21&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-1-4&#34;&gt;&lt;a id=&#34;__codelineno-1-4&#34; name=&#34;__codelineno-1-4&#34; href=&#34;#__codelineno-1-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nt&#34;&gt;address&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-1-5&#34;&gt;&lt;a id=&#34;__codelineno-1-5&#34; name=&#34;__codelineno-1-5&#34; href=&#34;#__codelineno-1-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;street&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Best&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;street&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;1337&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-1-6&#34;&gt;&lt;a id=&#34;__codelineno-1-6&#34; name=&#34;__codelineno-1-6&#34; href=&#34;#__codelineno-1-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;city&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Moonlight&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;City&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;div class=&#34;language-json highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-2-1&#34;&gt;&lt;a id=&#34;__codelineno-2-1&#34; name=&#34;__codelineno-2-1&#34; href=&#34;#__codelineno-2-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-2&#34;&gt;&lt;a id=&#34;__codelineno-2-2&#34; name=&#34;__codelineno-2-2&#34; href=&#34;#__codelineno-2-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;firstName&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Lilly&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-3&#34;&gt;&lt;a id=&#34;__codelineno-2-3&#34; name=&#34;__codelineno-2-3&#34; href=&#34;#__codelineno-2-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;secondName&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Tempest&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-4&#34;&gt;&lt;a id=&#34;__codelineno-2-4&#34; name=&#34;__codelineno-2-4&#34; href=&#34;#__codelineno-2-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;age&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;21&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-5&#34;&gt;&lt;a id=&#34;__codelineno-2-5&#34; name=&#34;__codelineno-2-5&#34; href=&#34;#__codelineno-2-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;address&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-6&#34;&gt;&lt;a id=&#34;__codelineno-2-6&#34; name=&#34;__codelineno-2-6&#34; href=&#34;#__codelineno-2-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;street&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Best street 1337&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-7&#34;&gt;&lt;a id=&#34;__codelineno-2-7&#34; name=&#34;__codelineno-2-7&#34; href=&#34;#__codelineno-2-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;quot;city&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Moonlight City&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-8&#34;&gt;&lt;a id=&#34;__codelineno-2-8&#34; name=&#34;__codelineno-2-8&#34; href=&#34;#__codelineno-2-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-9&#34;&gt;&lt;a id=&#34;__codelineno-2-9&#34; name=&#34;__codelineno-2-9&#34; href=&#34;#__codelineno-2-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;div class=&#34;language-toml highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-3-1&#34;&gt;&lt;a id=&#34;__codelineno-3-1&#34; name=&#34;__codelineno-3-1&#34; href=&#34;#__codelineno-3-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;firstName&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Lilly&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-2&#34;&gt;&lt;a id=&#34;__codelineno-3-2&#34; name=&#34;__codelineno-3-2&#34; href=&#34;#__codelineno-3-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;secondName&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Tempest&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-3&#34;&gt;&lt;a id=&#34;__codelineno-3-3&#34; name=&#34;__codelineno-3-3&#34; href=&#34;#__codelineno-3-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;age&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;21&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-4&#34;&gt;&lt;a id=&#34;__codelineno-3-4&#34; name=&#34;__codelineno-3-4&#34; href=&#34;#__codelineno-3-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;address&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;street&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Best street 1337&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-5&#34;&gt;&lt;a id=&#34;__codelineno-3-5&#34; name=&#34;__codelineno-3-5&#34; href=&#34;#__codelineno-3-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;address&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;city&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Moonlight City&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;div class=&#34;language-xml highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-4-1&#34;&gt;&lt;a id=&#34;__codelineno-4-1&#34; name=&#34;__codelineno-4-1&#34; href=&#34;#__codelineno-4-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;Person&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-2&#34;&gt;&lt;a id=&#34;__codelineno-4-2&#34; name=&#34;__codelineno-4-2&#34; href=&#34;#__codelineno-4-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;firstName&amp;gt;&lt;/span&gt;Lilly&lt;span class=&#34;nt&#34;&gt;&amp;lt;/firstName&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-3&#34;&gt;&lt;a id=&#34;__codelineno-4-3&#34; name=&#34;__codelineno-4-3&#34; href=&#34;#__codelineno-4-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;secondName&amp;gt;&lt;/span&gt;Tempest&lt;span class=&#34;nt&#34;&gt;&amp;lt;/secondName&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-4&#34;&gt;&lt;a id=&#34;__codelineno-4-4&#34; name=&#34;__codelineno-4-4&#34; href=&#34;#__codelineno-4-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;age&amp;gt;&lt;/span&gt;21&lt;span class=&#34;nt&#34;&gt;&amp;lt;/age&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-5&#34;&gt;&lt;a id=&#34;__codelineno-4-5&#34; name=&#34;__codelineno-4-5&#34; href=&#34;#__codelineno-4-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;address&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-6&#34;&gt;&lt;a id=&#34;__codelineno-4-6&#34; name=&#34;__codelineno-4-6&#34; href=&#34;#__codelineno-4-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;street&amp;gt;&lt;/span&gt;Best&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;street&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;1337&lt;span class=&#34;nt&#34;&gt;&amp;lt;/street&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-7&#34;&gt;&lt;a id=&#34;__codelineno-4-7&#34; name=&#34;__codelineno-4-7&#34; href=&#34;#__codelineno-4-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;city&amp;gt;&lt;/span&gt;Moonlight&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;City&lt;span class=&#34;nt&#34;&gt;&amp;lt;/city&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-8&#34;&gt;&lt;a id=&#34;__codelineno-4-8&#34; name=&#34;__codelineno-4-8&#34; href=&#34;#__codelineno-4-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/address&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-9&#34;&gt;&lt;a id=&#34;__codelineno-4-9&#34; name=&#34;__codelineno-4-9&#34; href=&#34;#__codelineno-4-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/Person&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;div class=&#34;language-properties highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-5-1&#34;&gt;&lt;a id=&#34;__codelineno-5-1&#34; name=&#34;__codelineno-5-1&#34; href=&#34;#__codelineno-5-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;na&#34;&gt;firstName&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;Lilly&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-2&#34;&gt;&lt;a id=&#34;__codelineno-5-2&#34; name=&#34;__codelineno-5-2&#34; href=&#34;#__codelineno-5-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;na&#34;&gt;secondName&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;Tempest&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-3&#34;&gt;&lt;a id=&#34;__codelineno-5-3&#34; name=&#34;__codelineno-5-3&#34; href=&#34;#__codelineno-5-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;na&#34;&gt;age&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;21&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-4&#34;&gt;&lt;a id=&#34;__codelineno-5-4&#34; name=&#34;__codelineno-5-4&#34; href=&#34;#__codelineno-5-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;na&#34;&gt;address.street&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;Best street 1337&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-5&#34;&gt;&lt;a id=&#34;__codelineno-5-5&#34; name=&#34;__codelineno-5-5&#34; href=&#34;#__codelineno-5-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;na&#34;&gt;address.city&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;Moonlight City&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2 id=&#34;the-possibilities&#34;&gt;The possibilities&lt;/h2&gt;&lt;p&gt;Of course the market is huge in terms of serialization frameworks.To list a few:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://bitbucket.org/snakeyaml/snakeyaml/&#34;&gt;SnakeYAML&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;The framework currently used by bukkit.Probably the most popular solution for pure yaml (I don&#39;t understand why).It also does only support yaml&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/SpongePowered/Configurate&#34;&gt;Configurate&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;Developed by the sponge developers it is used by a wide variety of especially minecraft projects like Paper.Supports JSON, HOCON, YAML and XML.However, it uses several other libraries like jackson under the hood.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/FasterXML/jackson-core&#34;&gt;Jackson&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;Jackson is probably the most enterprise solution for serialization we have.It supports various dataformats throught a ton of different data format modules.The examples above are all created with jackson&lt;/li&gt;&lt;li&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/google/gson&#34;&gt;GSON&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;Gson is the library most know for json.It is bundled in spigot and paper and used for a ton of applications there.Like the name says it only support JSON&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;I settled for jackson since it is the most flexible framework, widely used and has actually great documentation.&lt;/p&gt;&lt;h2 id=&#34;obtaining-jackson-bukkit&#34;&gt;Obtaining jackson bukkit&lt;/h2&gt;&lt;p&gt;&lt;img alt=&#34;Maven Central&#34; src=&#34;https://img.shields.io/maven-central/v/de.eldoria.jacksonbukkit/jackson-bukkit&#34; /&gt;&lt;/p&gt;&lt;p&gt;Jackson bukkit is located in Maven Central. You can import it into your project with gradle or maven.&lt;/p&gt;&lt;div class=&#34;tabbed-set tabbed-alternate&#34; data-tabs=&#34;2:2&#34;&gt;&lt;input checked=&#34;checked&#34; id=&#34;__tabbed_2_1&#34; name=&#34;__tabbed_2&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_2_2&#34; name=&#34;__tabbed_2&#34; type=&#34;radio&#34; /&gt;&lt;div class=&#34;tabbed-labels&#34;&gt;&lt;label for=&#34;__tabbed_2_1&#34;&gt;gradle&lt;/label&gt;&lt;label for=&#34;__tabbed_2_2&#34;&gt;maven&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-content&#34;&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-6-1&#34;&gt;&lt;a id=&#34;__codelineno-6-1&#34; name=&#34;__codelineno-6-1&#34; href=&#34;#__codelineno-6-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-6-2&#34;&gt;&lt;a id=&#34;__codelineno-6-2&#34; name=&#34;__codelineno-6-2&#34; href=&#34;#__codelineno-6-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// Spigot server&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-6-3&#34;&gt;&lt;a id=&#34;__codelineno-6-3&#34; name=&#34;__codelineno-6-3&#34; href=&#34;#__codelineno-6-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;implementation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.eldoria.jacksonbukkit&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;bukkit&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;2.0.0&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-6-4&#34;&gt;&lt;a id=&#34;__codelineno-6-4&#34; name=&#34;__codelineno-6-4&#34; href=&#34;#__codelineno-6-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// Paper server&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-6-5&#34;&gt;&lt;a id=&#34;__codelineno-6-5&#34; name=&#34;__codelineno-6-5&#34; href=&#34;#__codelineno-6-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;implementation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.eldoria.jacksonbukkit&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;paper&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;2.0.0&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-6-6&#34;&gt;&lt;a id=&#34;__codelineno-6-6&#34; name=&#34;__codelineno-6-6&#34; href=&#34;#__codelineno-6-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;div class=&#34;language-xml highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-7-1&#34;&gt;&lt;a id=&#34;__codelineno-7-1&#34; name=&#34;__codelineno-7-1&#34; href=&#34;#__codelineno-7-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-2&#34;&gt;&lt;a id=&#34;__codelineno-7-2&#34; name=&#34;__codelineno-7-2&#34; href=&#34;#__codelineno-7-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;&amp;lt;!-- Spigot Server --&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-3&#34;&gt;&lt;a id=&#34;__codelineno-7-3&#34; name=&#34;__codelineno-7-3&#34; href=&#34;#__codelineno-7-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-4&#34;&gt;&lt;a id=&#34;__codelineno-7-4&#34; name=&#34;__codelineno-7-4&#34; href=&#34;#__codelineno-7-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;de.eldoria.jacksonbukkit&lt;span class=&#34;nt&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-5&#34;&gt;&lt;a id=&#34;__codelineno-7-5&#34; name=&#34;__codelineno-7-5&#34; href=&#34;#__codelineno-7-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spigot&lt;span class=&#34;nt&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-6&#34;&gt;&lt;a id=&#34;__codelineno-7-6&#34; name=&#34;__codelineno-7-6&#34; href=&#34;#__codelineno-7-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;2.0.0&lt;span class=&#34;nt&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-7&#34;&gt;&lt;a id=&#34;__codelineno-7-7&#34; name=&#34;__codelineno-7-7&#34; href=&#34;#__codelineno-7-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-8&#34;&gt;&lt;a id=&#34;__codelineno-7-8&#34; name=&#34;__codelineno-7-8&#34; href=&#34;#__codelineno-7-8&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-9&#34;&gt;&lt;a id=&#34;__codelineno-7-9&#34; name=&#34;__codelineno-7-9&#34; href=&#34;#__codelineno-7-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;&amp;lt;!-- Paper Server--&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-10&#34;&gt;&lt;a id=&#34;__codelineno-7-10&#34; name=&#34;__codelineno-7-10&#34; href=&#34;#__codelineno-7-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-11&#34;&gt;&lt;a id=&#34;__codelineno-7-11&#34; name=&#34;__codelineno-7-11&#34; href=&#34;#__codelineno-7-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;de.eldoria.jacksonbukkit&lt;span class=&#34;nt&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-12&#34;&gt;&lt;a id=&#34;__codelineno-7-12&#34; name=&#34;__codelineno-7-12&#34; href=&#34;#__codelineno-7-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;paper&lt;span class=&#34;nt&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-13&#34;&gt;&lt;a id=&#34;__codelineno-7-13&#34; name=&#34;__codelineno-7-13&#34; href=&#34;#__codelineno-7-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;2.0.0&lt;span class=&#34;nt&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-14&#34;&gt;&lt;a id=&#34;__codelineno-7-14&#34; name=&#34;__codelineno-7-14&#34; href=&#34;#__codelineno-7-14&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-15&#34;&gt;&lt;a id=&#34;__codelineno-7-15&#34; name=&#34;__codelineno-7-15&#34; href=&#34;#__codelineno-7-15&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;Please only use the module you need depending on your server version&lt;/p&gt;&lt;/div&gt;&lt;h2 id=&#34;module-creation&#34;&gt;Module Creation&lt;/h2&gt;&lt;p&gt;You can either build the &lt;code&gt;JacksonBukkit&lt;/code&gt; and &lt;code&gt;JacksonPaper&lt;/code&gt; modules directly, or use the builder for easy modification.Use of the builder is recommended.The builder for bukkit and paper can both be accessed via the corresponding class.&lt;/p&gt;&lt;div class=&#34;tabbed-set tabbed-alternate&#34; data-tabs=&#34;3:2&#34;&gt;&lt;input checked=&#34;checked&#34; id=&#34;__tabbed_3_1&#34; name=&#34;__tabbed_3&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_3_2&#34; name=&#34;__tabbed_3&#34; type=&#34;radio&#34; /&gt;&lt;div class=&#34;tabbed-labels&#34;&gt;&lt;label for=&#34;__tabbed_3_1&#34;&gt;Creating a Spigot Module&lt;/label&gt;&lt;label for=&#34;__tabbed_3_2&#34;&gt;Creating a Paper Module&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-content&#34;&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-8-1&#34;&gt;&lt;a id=&#34;__codelineno-8-1&#34; name=&#34;__codelineno-8-1&#34; href=&#34;#__codelineno-8-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;ObjectMapper&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSON&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JsonMapper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;builder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-8-2&#34;&gt;&lt;a id=&#34;__codelineno-8-2&#34; name=&#34;__codelineno-8-2&#34; href=&#34;#__codelineno-8-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;addModule&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JacksonBukkit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;builder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-8-3&#34;&gt;&lt;a id=&#34;__codelineno-8-3&#34; name=&#34;__codelineno-8-3&#34; href=&#34;#__codelineno-8-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-9-1&#34;&gt;&lt;a id=&#34;__codelineno-9-1&#34; name=&#34;__codelineno-9-1&#34; href=&#34;#__codelineno-9-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;ObjectMapper&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSON&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JsonMapper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;builder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-9-2&#34;&gt;&lt;a id=&#34;__codelineno-9-2&#34; name=&#34;__codelineno-9-2&#34; href=&#34;#__codelineno-9-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;addModule&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JacksonPaper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;builder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-9-3&#34;&gt;&lt;a id=&#34;__codelineno-9-3&#34; name=&#34;__codelineno-9-3&#34; href=&#34;#__codelineno-9-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Of course you can also use TOML or YAML or whatever else Jackson supports.&lt;/p&gt;&lt;p&gt;The module builder also has more configuration options, which can be found &lt;a href=&#34;https://github.com/eldoriarpg/jackson-bukkit#more-customization&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&#34;difference-between-paper-and-bukkit-module&#34;&gt;Difference between Paper and Bukkit module&lt;/h2&gt;&lt;p&gt;The paper module tries to support all the features available in paper.The deserialiser will automatically detect the current format when using a legacy format and convert it to the new format when saving.Therefore, a config created on 1.15 will contain the legacy map, and once the server is running on 1.16, the byte array will be used instead.&lt;/p&gt;&lt;p&gt;Paper serialises &lt;code&gt;ItemStack&lt;/code&gt; to a base64 encoded byte array instead of using spigots serialisation.This will only work on paper servers on 1.16 or later, not on spigot servers.The builder allows you to use spigots serialisation on paper servers, but this is not recommended.&lt;/p&gt;&lt;p&gt;When building a &lt;a href=&#34;https://docs.papermc.io/paper/reference/paper-plugins&#34;&gt;paper plugin&lt;/a&gt; the &lt;code&gt;JacksonBukkit&lt;/code&gt; module is no longer able to serialise &lt;code&gt;ItemStacks&lt;/code&gt;.You will need to use &lt;code&gt;JacksonPaper&lt;/code&gt; in this case, and make sure you are not using legacy serialisation.&lt;/p&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Class&lt;/th&gt;&lt;th&gt;Paper&lt;/th&gt;&lt;th&gt;Spigot&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Color&lt;/td&gt;&lt;td&gt;RGB or HEX RGB &amp;lt; 1.19 &amp;lt;= RGBA or HEX RGBA&lt;/td&gt;&lt;td&gt;RGB or HEX RGB&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ItemStack&lt;/td&gt;&lt;td&gt;legacy Map &amp;lt; 1.16 &amp;lt;= NBT byte array&lt;/td&gt;&lt;td&gt;Legacy Map&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Component&lt;/td&gt;&lt;td&gt;MiniMessage String when MiniMessages is present. Otherwise Json Object.&lt;/td&gt;&lt;td&gt;Nope c:&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;In general, all classes that implement or have implemented the `ConfigurationSerializable&#39; interface are supported.A complete list of supported classes can be found &lt;a href=&#34;https://github.com/eldoriarpg/jackson-bukkit#supported-classes&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&#34;creating-your-first-configuration-file&#34;&gt;Creating your first configuration file&lt;/h2&gt;&lt;p&gt;We want to store player homes for our first config file.To do this, we create a base class called &lt;code&gt;Homes&lt;/code&gt;, which holds a map of &lt;code&gt;PlayerHomes&lt;/code&gt; with one entry per player.&lt;/p&gt;&lt;details&gt;&lt;summary&gt;Homes&lt;/summary&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-10-1&#34;&gt;&lt;a id=&#34;__codelineno-10-1&#34; name=&#34;__codelineno-10-1&#34; href=&#34;#__codelineno-10-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Homes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-2&#34;&gt;&lt;a id=&#34;__codelineno-10-2&#34; name=&#34;__codelineno-10-2&#34; href=&#34;#__codelineno-10-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Map&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UUID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PlayerHomes&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;playerHomes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-3&#34;&gt;&lt;a id=&#34;__codelineno-10-3&#34; name=&#34;__codelineno-10-3&#34; href=&#34;#__codelineno-10-3&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-4&#34;&gt;&lt;a id=&#34;__codelineno-10-4&#34; name=&#34;__codelineno-10-4&#34; href=&#34;#__codelineno-10-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@JsonCreator&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-5&#34;&gt;&lt;a id=&#34;__codelineno-10-5&#34; name=&#34;__codelineno-10-5&#34; href=&#34;#__codelineno-10-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Homes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@JsonProperty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;playerHomes&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Map&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UUID&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PlayerHomes&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;playerHomes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-6&#34;&gt;&lt;a id=&#34;__codelineno-10-6&#34; name=&#34;__codelineno-10-6&#34; href=&#34;#__codelineno-10-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;playerHomes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;playerHomes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-7&#34;&gt;&lt;a id=&#34;__codelineno-10-7&#34; name=&#34;__codelineno-10-7&#34; href=&#34;#__codelineno-10-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-8&#34;&gt;&lt;a id=&#34;__codelineno-10-8&#34; name=&#34;__codelineno-10-8&#34; href=&#34;#__codelineno-10-8&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-9&#34;&gt;&lt;a id=&#34;__codelineno-10-9&#34; name=&#34;__codelineno-10-9&#34; href=&#34;#__codelineno-10-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Homes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-10&#34;&gt;&lt;a id=&#34;__codelineno-10-10&#34; name=&#34;__codelineno-10-10&#34; href=&#34;#__codelineno-10-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HashMap&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-11&#34;&gt;&lt;a id=&#34;__codelineno-10-11&#34; name=&#34;__codelineno-10-11&#34; href=&#34;#__codelineno-10-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-12&#34;&gt;&lt;a id=&#34;__codelineno-10-12&#34; name=&#34;__codelineno-10-12&#34; href=&#34;#__codelineno-10-12&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-13&#34;&gt;&lt;a id=&#34;__codelineno-10-13&#34; name=&#34;__codelineno-10-13&#34; href=&#34;#__codelineno-10-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PlayerHomes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UUID&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-14&#34;&gt;&lt;a id=&#34;__codelineno-10-14&#34; name=&#34;__codelineno-10-14&#34; href=&#34;#__codelineno-10-14&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;playerHomes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;computeIfAbsent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;k&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PlayerHomes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-15&#34;&gt;&lt;a id=&#34;__codelineno-10-15&#34; name=&#34;__codelineno-10-15&#34; href=&#34;#__codelineno-10-15&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-16&#34;&gt;&lt;a id=&#34;__codelineno-10-16&#34; name=&#34;__codelineno-10-16&#34; href=&#34;#__codelineno-10-16&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;The &lt;code&gt;PlayerHomes&lt;/code&gt; class is the same just with a map containing the names of the homes.&lt;/p&gt;&lt;details&gt;&lt;summary&gt;PlayerHomes&lt;/summary&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-11-1&#34;&gt;&lt;a id=&#34;__codelineno-11-1&#34; name=&#34;__codelineno-11-1&#34; href=&#34;#__codelineno-11-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;PlayerHomes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-2&#34;&gt;&lt;a id=&#34;__codelineno-11-2&#34; name=&#34;__codelineno-11-2&#34; href=&#34;#__codelineno-11-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Map&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Location&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;homes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-3&#34;&gt;&lt;a id=&#34;__codelineno-11-3&#34; name=&#34;__codelineno-11-3&#34; href=&#34;#__codelineno-11-3&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-4&#34;&gt;&lt;a id=&#34;__codelineno-11-4&#34; name=&#34;__codelineno-11-4&#34; href=&#34;#__codelineno-11-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@JsonCreator&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-5&#34;&gt;&lt;a id=&#34;__codelineno-11-5&#34; name=&#34;__codelineno-11-5&#34; href=&#34;#__codelineno-11-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;PlayerHomes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@JsonProperty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;homes&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Map&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Location&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;homes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-6&#34;&gt;&lt;a id=&#34;__codelineno-11-6&#34; name=&#34;__codelineno-11-6&#34; href=&#34;#__codelineno-11-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;homes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;homes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-7&#34;&gt;&lt;a id=&#34;__codelineno-11-7&#34; name=&#34;__codelineno-11-7&#34; href=&#34;#__codelineno-11-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-8&#34;&gt;&lt;a id=&#34;__codelineno-11-8&#34; name=&#34;__codelineno-11-8&#34; href=&#34;#__codelineno-11-8&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-9&#34;&gt;&lt;a id=&#34;__codelineno-11-9&#34; name=&#34;__codelineno-11-9&#34; href=&#34;#__codelineno-11-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;PlayerHomes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-10&#34;&gt;&lt;a id=&#34;__codelineno-11-10&#34; name=&#34;__codelineno-11-10&#34; href=&#34;#__codelineno-11-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;this&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HashMap&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-11&#34;&gt;&lt;a id=&#34;__codelineno-11-11&#34; name=&#34;__codelineno-11-11&#34; href=&#34;#__codelineno-11-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-12&#34;&gt;&lt;a id=&#34;__codelineno-11-12&#34; name=&#34;__codelineno-11-12&#34; href=&#34;#__codelineno-11-12&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-13&#34;&gt;&lt;a id=&#34;__codelineno-11-13&#34; name=&#34;__codelineno-11-13&#34; href=&#34;#__codelineno-11-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-14&#34;&gt;&lt;a id=&#34;__codelineno-11-14&#34; name=&#34;__codelineno-11-14&#34; href=&#34;#__codelineno-11-14&#34;&gt;&lt;/a&gt;&lt;span class=&#34;cm&#34;&gt; * Retrieves the location associated with the given name.&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-15&#34;&gt;&lt;a id=&#34;__codelineno-11-15&#34; name=&#34;__codelineno-11-15&#34; href=&#34;#__codelineno-11-15&#34;&gt;&lt;/a&gt;&lt;span class=&#34;cm&#34;&gt; *&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-16&#34;&gt;&lt;a id=&#34;__codelineno-11-16&#34; name=&#34;__codelineno-11-16&#34; href=&#34;#__codelineno-11-16&#34;&gt;&lt;/a&gt;&lt;span class=&#34;cm&#34;&gt; * @param name the name of the home. Case-insensitive&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-17&#34;&gt;&lt;a id=&#34;__codelineno-11-17&#34; name=&#34;__codelineno-11-17&#34; href=&#34;#__codelineno-11-17&#34;&gt;&lt;/a&gt;&lt;span class=&#34;cm&#34;&gt; * @return the location associated with the given name, or null if the name is not found&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-18&#34;&gt;&lt;a id=&#34;__codelineno-11-18&#34; name=&#34;__codelineno-11-18&#34; href=&#34;#__codelineno-11-18&#34;&gt;&lt;/a&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-19&#34;&gt;&lt;a id=&#34;__codelineno-11-19&#34; name=&#34;__codelineno-11-19&#34; href=&#34;#__codelineno-11-19&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Nullable&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-20&#34;&gt;&lt;a id=&#34;__codelineno-11-20&#34; name=&#34;__codelineno-11-20&#34; href=&#34;#__codelineno-11-20&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Location&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-21&#34;&gt;&lt;a id=&#34;__codelineno-11-21&#34; name=&#34;__codelineno-11-21&#34; href=&#34;#__codelineno-11-21&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;homes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toLowerCase&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-22&#34;&gt;&lt;a id=&#34;__codelineno-11-22&#34; name=&#34;__codelineno-11-22&#34; href=&#34;#__codelineno-11-22&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-23&#34;&gt;&lt;a id=&#34;__codelineno-11-23&#34; name=&#34;__codelineno-11-23&#34; href=&#34;#__codelineno-11-23&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-24&#34;&gt;&lt;a id=&#34;__codelineno-11-24&#34; name=&#34;__codelineno-11-24&#34; href=&#34;#__codelineno-11-24&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-25&#34;&gt;&lt;a id=&#34;__codelineno-11-25&#34; name=&#34;__codelineno-11-25&#34; href=&#34;#__codelineno-11-25&#34;&gt;&lt;/a&gt;&lt;span class=&#34;cm&#34;&gt; * Puts a new entry in the homes map with the specified name and location.&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-26&#34;&gt;&lt;a id=&#34;__codelineno-11-26&#34; name=&#34;__codelineno-11-26&#34; href=&#34;#__codelineno-11-26&#34;&gt;&lt;/a&gt;&lt;span class=&#34;cm&#34;&gt; *&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-27&#34;&gt;&lt;a id=&#34;__codelineno-11-27&#34; name=&#34;__codelineno-11-27&#34; href=&#34;#__codelineno-11-27&#34;&gt;&lt;/a&gt;&lt;span class=&#34;cm&#34;&gt; * @param name the name of the entry. Will be converted to lower case&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-28&#34;&gt;&lt;a id=&#34;__codelineno-11-28&#34; name=&#34;__codelineno-11-28&#34; href=&#34;#__codelineno-11-28&#34;&gt;&lt;/a&gt;&lt;span class=&#34;cm&#34;&gt; * @param location the location associated with the entry&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-29&#34;&gt;&lt;a id=&#34;__codelineno-11-29&#34; name=&#34;__codelineno-11-29&#34; href=&#34;#__codelineno-11-29&#34;&gt;&lt;/a&gt;&lt;span class=&#34;cm&#34;&gt; */&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-30&#34;&gt;&lt;a id=&#34;__codelineno-11-30&#34; name=&#34;__codelineno-11-30&#34; href=&#34;#__codelineno-11-30&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;put&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;String&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Location&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;location&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-31&#34;&gt;&lt;a id=&#34;__codelineno-11-31&#34; name=&#34;__codelineno-11-31&#34; href=&#34;#__codelineno-11-31&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;homes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;put&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toLowerCase&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;location&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-32&#34;&gt;&lt;a id=&#34;__codelineno-11-32&#34; name=&#34;__codelineno-11-32&#34; href=&#34;#__codelineno-11-32&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-33&#34;&gt;&lt;a id=&#34;__codelineno-11-33&#34; name=&#34;__codelineno-11-33&#34; href=&#34;#__codelineno-11-33&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;Let&#39;s take a look at what we&#39;ve done here.&lt;/p&gt;&lt;p&gt;We have created two classes that contain the information we need and added some utility methods to get the houses and register new houses.&lt;/p&gt;&lt;p&gt;The most important part is our constructor, which is used to create our instances when we read our configuration file.These are the constructors annotated with &lt;code&gt;@JsonCreator&lt;/code&gt;.These classes will be used by jackson.After that, we just need to annotate the input fields with their corresponding names using the &lt;code&gt;@JsonProperty&lt;/code&gt; annotation.&lt;/p&gt;&lt;p&gt;That&#39;s all we need to do.&lt;/p&gt;&lt;h2 id=&#34;creating-our-objectmapper&#34;&gt;Creating our ObjectMapper&lt;/h2&gt;&lt;p&gt;As mentioned earlier, Jackson uses object mapper to map objects from and to our dataformat.Since we want to continue using yaml, we need to import the yaml dataformat.The latest version is shown above.&lt;/p&gt;&lt;div class=&#34;tabbed-set tabbed-alternate&#34; data-tabs=&#34;4:2&#34;&gt;&lt;input checked=&#34;checked&#34; id=&#34;__tabbed_4_1&#34; name=&#34;__tabbed_4&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_4_2&#34; name=&#34;__tabbed_4&#34; type=&#34;radio&#34; /&gt;&lt;div class=&#34;tabbed-labels&#34;&gt;&lt;label for=&#34;__tabbed_4_1&#34;&gt;gradle&lt;/label&gt;&lt;label for=&#34;__tabbed_4_2&#34;&gt;maven&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-content&#34;&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-12-1&#34;&gt;&lt;a id=&#34;__codelineno-12-1&#34; name=&#34;__codelineno-12-1&#34; href=&#34;#__codelineno-12-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-12-2&#34;&gt;&lt;a id=&#34;__codelineno-12-2&#34; name=&#34;__codelineno-12-2&#34; href=&#34;#__codelineno-12-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;implementation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;com.fasterxml.jackson.dataformat&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;jackson-dataformat-yaml&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;2.21.3&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-12-3&#34;&gt;&lt;a id=&#34;__codelineno-12-3&#34; name=&#34;__codelineno-12-3&#34; href=&#34;#__codelineno-12-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;div class=&#34;language-xml highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-13-1&#34;&gt;&lt;a id=&#34;__codelineno-13-1&#34; name=&#34;__codelineno-13-1&#34; href=&#34;#__codelineno-13-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-13-2&#34;&gt;&lt;a id=&#34;__codelineno-13-2&#34; name=&#34;__codelineno-13-2&#34; href=&#34;#__codelineno-13-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-13-3&#34;&gt;&lt;a id=&#34;__codelineno-13-3&#34; name=&#34;__codelineno-13-3&#34; href=&#34;#__codelineno-13-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.fasterxml.jackson.dataformat&lt;span class=&#34;nt&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-13-4&#34;&gt;&lt;a id=&#34;__codelineno-13-4&#34; name=&#34;__codelineno-13-4&#34; href=&#34;#__codelineno-13-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;jackson-dataformat-yaml&lt;span class=&#34;nt&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-13-5&#34;&gt;&lt;a id=&#34;__codelineno-13-5&#34; name=&#34;__codelineno-13-5&#34; href=&#34;#__codelineno-13-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;2.21.3&lt;span class=&#34;nt&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-13-6&#34;&gt;&lt;a id=&#34;__codelineno-13-6&#34; name=&#34;__codelineno-13-6&#34; href=&#34;#__codelineno-13-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-13-7&#34;&gt;&lt;a id=&#34;__codelineno-13-7&#34; name=&#34;__codelineno-13-7&#34; href=&#34;#__codelineno-13-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Once we imported the yaml dataformat we can use it to create an object mapper and configure it.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-14-1&#34;&gt;&lt;a id=&#34;__codelineno-14-1&#34; name=&#34;__codelineno-14-1&#34; href=&#34;#__codelineno-14-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;ObjectMapper&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mapper&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;YAMLMapper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;builder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;addModule&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JacksonPaper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;builder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-14-2&#34;&gt;&lt;a id=&#34;__codelineno-14-2&#34; name=&#34;__codelineno-14-2&#34; href=&#34;#__codelineno-14-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-14-3&#34;&gt;&lt;a id=&#34;__codelineno-14-3&#34; name=&#34;__codelineno-14-3&#34; href=&#34;#__codelineno-14-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setVisibility&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PropertyAccessor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;FIELD&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JsonAutoDetect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Visibility&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;ANY&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-14-4&#34;&gt;&lt;a id=&#34;__codelineno-14-4&#34; name=&#34;__codelineno-14-4&#34; href=&#34;#__codelineno-14-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setVisibility&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PropertyAccessor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;GETTER&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JsonAutoDetect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Visibility&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;NONE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We also configure the mapper to use the fields in our classes and ignore the get prefixed methods.This saves us some time and is what you usually want. If you want to exclude a field in your class from being written, you can add the &lt;code&gt;@JsonIgnore&lt;/code&gt; annotation to it.&lt;/p&gt;&lt;h2 id=&#34;writing-our-config-file&#34;&gt;Writing our config file&lt;/h2&gt;&lt;p&gt;Once you added some data to your homes object we need to write it into a file.For that we will use the ObjectMapper we created above and will use it to write it to a file in our plugins directory.&lt;/p&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;I created some sample data here after creating my homes instance.&lt;/p&gt;&lt;/div&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-15-1&#34;&gt;&lt;a id=&#34;__codelineno-15-1&#34; name=&#34;__codelineno-15-1&#34; href=&#34;#__codelineno-15-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;ObjectMapper&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mapper&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;YAMLMapper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;builder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;addModule&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JacksonPaper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;builder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-15-2&#34;&gt;&lt;a id=&#34;__codelineno-15-2&#34; name=&#34;__codelineno-15-2&#34; href=&#34;#__codelineno-15-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-15-3&#34;&gt;&lt;a id=&#34;__codelineno-15-3&#34; name=&#34;__codelineno-15-3&#34; href=&#34;#__codelineno-15-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setVisibility&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PropertyAccessor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;FIELD&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JsonAutoDetect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Visibility&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;ANY&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-15-4&#34;&gt;&lt;a id=&#34;__codelineno-15-4&#34; name=&#34;__codelineno-15-4&#34; href=&#34;#__codelineno-15-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setVisibility&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PropertyAccessor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;GETTER&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JsonAutoDetect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Visibility&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;NONE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-15-5&#34;&gt;&lt;a id=&#34;__codelineno-15-5&#34; name=&#34;__codelineno-15-5&#34; href=&#34;#__codelineno-15-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;Homes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;homes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Homes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-15-6&#34;&gt;&lt;a id=&#34;__codelineno-15-6&#34; name=&#34;__codelineno-15-6&#34; href=&#34;#__codelineno-15-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;mapper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;writeValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;plugin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getDataFolder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toPath&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;resolve&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;homes.yml&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;homes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;admonition warning&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Warning&lt;/p&gt;&lt;p&gt;Handle the IOException properly&lt;/p&gt;&lt;/div&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;You should cache your ObjectMapper and reuse it instead of creating it again on every usage.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;And now we have written our homes object as a yaml file directly to disk.&lt;/p&gt;&lt;p&gt;Our config file looks something like this:&lt;/p&gt;&lt;details&gt;&lt;summary&gt;homes.yml&lt;/summary&gt;&lt;div class=&#34;language-yaml highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-16-1&#34;&gt;&lt;a id=&#34;__codelineno-16-1&#34; name=&#34;__codelineno-16-1&#34; href=&#34;#__codelineno-16-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nn&#34;&gt;---&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-2&#34;&gt;&lt;a id=&#34;__codelineno-16-2&#34; name=&#34;__codelineno-16-2&#34; href=&#34;#__codelineno-16-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nt&#34;&gt;playerHomes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-3&#34;&gt;&lt;a id=&#34;__codelineno-16-3&#34; name=&#34;__codelineno-16-3&#34; href=&#34;#__codelineno-16-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;5c4a58ce-2c5e-417e-9022-328489126845&amp;quot;&lt;/span&gt;&lt;span class=&#34;p p-Indicator&#34;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-4&#34;&gt;&lt;a id=&#34;__codelineno-16-4&#34; name=&#34;__codelineno-16-4&#34; href=&#34;#__codelineno-16-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;homes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-5&#34;&gt;&lt;a id=&#34;__codelineno-16-5&#34; name=&#34;__codelineno-16-5&#34; href=&#34;#__codelineno-16-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;home&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-6&#34;&gt;&lt;a id=&#34;__codelineno-16-6&#34; name=&#34;__codelineno-16-6&#34; href=&#34;#__codelineno-16-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;uid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;f3a41fe9-64b0-45ee-948e-a29ce4a92b15&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-7&#34;&gt;&lt;a id=&#34;__codelineno-16-7&#34; name=&#34;__codelineno-16-7&#34; href=&#34;#__codelineno-16-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;world&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-8&#34;&gt;&lt;a id=&#34;__codelineno-16-8&#34; name=&#34;__codelineno-16-8&#34; href=&#34;#__codelineno-16-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;xCoord&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;-98.0&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-9&#34;&gt;&lt;a id=&#34;__codelineno-16-9&#34; name=&#34;__codelineno-16-9&#34; href=&#34;#__codelineno-16-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;yCoord&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;54.0&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-10&#34;&gt;&lt;a id=&#34;__codelineno-16-10&#34; name=&#34;__codelineno-16-10&#34; href=&#34;#__codelineno-16-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;zCoord&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;54.0&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-11&#34;&gt;&lt;a id=&#34;__codelineno-16-11&#34; name=&#34;__codelineno-16-11&#34; href=&#34;#__codelineno-16-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;yaw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;59.0&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-12&#34;&gt;&lt;a id=&#34;__codelineno-16-12&#34; name=&#34;__codelineno-16-12&#34; href=&#34;#__codelineno-16-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;pitch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;300.0&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-13&#34;&gt;&lt;a id=&#34;__codelineno-16-13&#34; name=&#34;__codelineno-16-13&#34; href=&#34;#__codelineno-16-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;333bea57-90f2-4f62-a9a4-911294c79d77&amp;quot;&lt;/span&gt;&lt;span class=&#34;p p-Indicator&#34;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-14&#34;&gt;&lt;a id=&#34;__codelineno-16-14&#34; name=&#34;__codelineno-16-14&#34; href=&#34;#__codelineno-16-14&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;homes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-15&#34;&gt;&lt;a id=&#34;__codelineno-16-15&#34; name=&#34;__codelineno-16-15&#34; href=&#34;#__codelineno-16-15&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;home&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-16&#34;&gt;&lt;a id=&#34;__codelineno-16-16&#34; name=&#34;__codelineno-16-16&#34; href=&#34;#__codelineno-16-16&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;uid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;f3a41fe9-64b0-45ee-948e-a29ce4a92b15&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-17&#34;&gt;&lt;a id=&#34;__codelineno-16-17&#34; name=&#34;__codelineno-16-17&#34; href=&#34;#__codelineno-16-17&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;world&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-18&#34;&gt;&lt;a id=&#34;__codelineno-16-18&#34; name=&#34;__codelineno-16-18&#34; href=&#34;#__codelineno-16-18&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;xCoord&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;-55.0&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-19&#34;&gt;&lt;a id=&#34;__codelineno-16-19&#34; name=&#34;__codelineno-16-19&#34; href=&#34;#__codelineno-16-19&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;yCoord&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;-46.0&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-20&#34;&gt;&lt;a id=&#34;__codelineno-16-20&#34; name=&#34;__codelineno-16-20&#34; href=&#34;#__codelineno-16-20&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;zCoord&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;72.0&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-21&#34;&gt;&lt;a id=&#34;__codelineno-16-21&#34; name=&#34;__codelineno-16-21&#34; href=&#34;#__codelineno-16-21&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;yaw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;301.0&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-22&#34;&gt;&lt;a id=&#34;__codelineno-16-22&#34; name=&#34;__codelineno-16-22&#34; href=&#34;#__codelineno-16-22&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;pitch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;189.0&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-23&#34;&gt;&lt;a id=&#34;__codelineno-16-23&#34; name=&#34;__codelineno-16-23&#34; href=&#34;#__codelineno-16-23&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ff88dace-9ef3-47a6-9c70-d93ddcf781f2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-24&#34;&gt;&lt;a id=&#34;__codelineno-16-24&#34; name=&#34;__codelineno-16-24&#34; href=&#34;#__codelineno-16-24&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;homes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-25&#34;&gt;&lt;a id=&#34;__codelineno-16-25&#34; name=&#34;__codelineno-16-25&#34; href=&#34;#__codelineno-16-25&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;another_home&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-26&#34;&gt;&lt;a id=&#34;__codelineno-16-26&#34; name=&#34;__codelineno-16-26&#34; href=&#34;#__codelineno-16-26&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;uid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;f3a41fe9-64b0-45ee-948e-a29ce4a92b15&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-27&#34;&gt;&lt;a id=&#34;__codelineno-16-27&#34; name=&#34;__codelineno-16-27&#34; href=&#34;#__codelineno-16-27&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;world&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-28&#34;&gt;&lt;a id=&#34;__codelineno-16-28&#34; name=&#34;__codelineno-16-28&#34; href=&#34;#__codelineno-16-28&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;xCoord&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;50.0&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-29&#34;&gt;&lt;a id=&#34;__codelineno-16-29&#34; name=&#34;__codelineno-16-29&#34; href=&#34;#__codelineno-16-29&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;yCoord&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;-99.0&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-30&#34;&gt;&lt;a id=&#34;__codelineno-16-30&#34; name=&#34;__codelineno-16-30&#34; href=&#34;#__codelineno-16-30&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;zCoord&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;-55.0&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-31&#34;&gt;&lt;a id=&#34;__codelineno-16-31&#34; name=&#34;__codelineno-16-31&#34; href=&#34;#__codelineno-16-31&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;yaw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;19.0&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-32&#34;&gt;&lt;a id=&#34;__codelineno-16-32&#34; name=&#34;__codelineno-16-32&#34; href=&#34;#__codelineno-16-32&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;pitch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;154.0&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-33&#34;&gt;&lt;a id=&#34;__codelineno-16-33&#34; name=&#34;__codelineno-16-33&#34; href=&#34;#__codelineno-16-33&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;my_home&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-34&#34;&gt;&lt;a id=&#34;__codelineno-16-34&#34; name=&#34;__codelineno-16-34&#34; href=&#34;#__codelineno-16-34&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;uid&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;f3a41fe9-64b0-45ee-948e-a29ce4a92b15&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-35&#34;&gt;&lt;a id=&#34;__codelineno-16-35&#34; name=&#34;__codelineno-16-35&#34; href=&#34;#__codelineno-16-35&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;world&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-36&#34;&gt;&lt;a id=&#34;__codelineno-16-36&#34; name=&#34;__codelineno-16-36&#34; href=&#34;#__codelineno-16-36&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;xCoord&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;97.0&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-37&#34;&gt;&lt;a id=&#34;__codelineno-16-37&#34; name=&#34;__codelineno-16-37&#34; href=&#34;#__codelineno-16-37&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;yCoord&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;-66.0&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-38&#34;&gt;&lt;a id=&#34;__codelineno-16-38&#34; name=&#34;__codelineno-16-38&#34; href=&#34;#__codelineno-16-38&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;zCoord&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;-4.0&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-39&#34;&gt;&lt;a id=&#34;__codelineno-16-39&#34; name=&#34;__codelineno-16-39&#34; href=&#34;#__codelineno-16-39&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;yaw&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;20.0&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-40&#34;&gt;&lt;a id=&#34;__codelineno-16-40&#34; name=&#34;__codelineno-16-40&#34; href=&#34;#__codelineno-16-40&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;pitch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;167.0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;You can see that the location has been automatically broken down into a nice readable format.Worlds are stored with their uid and name for readability.&lt;/p&gt;&lt;h2 id=&#34;reading-our-configuration-file&#34;&gt;Reading our configuration file&lt;/h2&gt;&lt;p&gt;Reading the configuration file is as simple as writing it.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-17-1&#34;&gt;&lt;a id=&#34;__codelineno-17-1&#34; name=&#34;__codelineno-17-1&#34; href=&#34;#__codelineno-17-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;ObjectMapper&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mapper&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;YAMLMapper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;builder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;addModule&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JacksonPaper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;builder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-17-2&#34;&gt;&lt;a id=&#34;__codelineno-17-2&#34; name=&#34;__codelineno-17-2&#34; href=&#34;#__codelineno-17-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-17-3&#34;&gt;&lt;a id=&#34;__codelineno-17-3&#34; name=&#34;__codelineno-17-3&#34; href=&#34;#__codelineno-17-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setVisibility&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PropertyAccessor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;FIELD&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JsonAutoDetect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Visibility&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;ANY&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-17-4&#34;&gt;&lt;a id=&#34;__codelineno-17-4&#34; name=&#34;__codelineno-17-4&#34; href=&#34;#__codelineno-17-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setVisibility&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;PropertyAccessor&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;GETTER&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JsonAutoDetect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Visibility&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;NONE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-17-5&#34;&gt;&lt;a id=&#34;__codelineno-17-5&#34; name=&#34;__codelineno-17-5&#34; href=&#34;#__codelineno-17-5&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-17-6&#34;&gt;&lt;a id=&#34;__codelineno-17-6&#34; name=&#34;__codelineno-17-6&#34; href=&#34;#__codelineno-17-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;Homes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;homes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mapper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;readValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;plugin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getDataFolder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toPath&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;resolve&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;homes.yml&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Homes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If the file doesn&#39;t exist it will fail, so you might want to add an existence check and create an empty config file:&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-18-1&#34;&gt;&lt;a id=&#34;__codelineno-18-1&#34; name=&#34;__codelineno-18-1&#34; href=&#34;#__codelineno-18-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;File&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;homesFile&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;plugin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getDataFolder&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toPath&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;resolve&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;homes.yml&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-18-2&#34;&gt;&lt;a id=&#34;__codelineno-18-2&#34; name=&#34;__codelineno-18-2&#34; href=&#34;#__codelineno-18-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;homesFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;exists&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mapper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;writeValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;homesFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Homes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;());&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-18-3&#34;&gt;&lt;a id=&#34;__codelineno-18-3&#34; name=&#34;__codelineno-18-3&#34; href=&#34;#__codelineno-18-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;Homes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;homes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mapper&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;readValue&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;homesFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Homes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;using-a-config-wrapper-for-configuration-files&#34;&gt;Using a config wrapper for configuration files&lt;/h2&gt;&lt;p&gt;Of course, this can all be done much more easily.I have written a wrapper that allows easy handling of configuration files with jackson.&lt;/p&gt;&lt;p&gt;It is also available in Maven Central and can be imported with maven or gradle:&lt;/p&gt;&lt;div class=&#34;tabbed-set tabbed-alternate&#34; data-tabs=&#34;5:2&#34;&gt;&lt;input checked=&#34;checked&#34; id=&#34;__tabbed_5_1&#34; name=&#34;__tabbed_5&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_5_2&#34; name=&#34;__tabbed_5&#34; type=&#34;radio&#34; /&gt;&lt;div class=&#34;tabbed-labels&#34;&gt;&lt;label for=&#34;__tabbed_5_1&#34;&gt;gradle&lt;/label&gt;&lt;label for=&#34;__tabbed_5_2&#34;&gt;maven&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-content&#34;&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-19-1&#34;&gt;&lt;a id=&#34;__codelineno-19-1&#34; name=&#34;__codelineno-19-1&#34; href=&#34;#__codelineno-19-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-19-2&#34;&gt;&lt;a id=&#34;__codelineno-19-2&#34; name=&#34;__codelineno-19-2&#34; href=&#34;#__codelineno-19-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;implementation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.eldoria.jacksonbukkit&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;jackson-configuration&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;2.1.11&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-19-3&#34;&gt;&lt;a id=&#34;__codelineno-19-3&#34; name=&#34;__codelineno-19-3&#34; href=&#34;#__codelineno-19-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;div class=&#34;language-xml highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-20-1&#34;&gt;&lt;a id=&#34;__codelineno-20-1&#34; name=&#34;__codelineno-20-1&#34; href=&#34;#__codelineno-20-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;dependencies&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-20-2&#34;&gt;&lt;a id=&#34;__codelineno-20-2&#34; name=&#34;__codelineno-20-2&#34; href=&#34;#__codelineno-20-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-20-3&#34;&gt;&lt;a id=&#34;__codelineno-20-3&#34; name=&#34;__codelineno-20-3&#34; href=&#34;#__codelineno-20-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;de.eldoria.jacksonbukkit&lt;span class=&#34;nt&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-20-4&#34;&gt;&lt;a id=&#34;__codelineno-20-4&#34; name=&#34;__codelineno-20-4&#34; href=&#34;#__codelineno-20-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;jackson-configuration&lt;span class=&#34;nt&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-20-5&#34;&gt;&lt;a id=&#34;__codelineno-20-5&#34; name=&#34;__codelineno-20-5&#34; href=&#34;#__codelineno-20-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;2.1.11&lt;span class=&#34;nt&#34;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-20-6&#34;&gt;&lt;a id=&#34;__codelineno-20-6&#34; name=&#34;__codelineno-20-6&#34; href=&#34;#__codelineno-20-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-20-7&#34;&gt;&lt;a id=&#34;__codelineno-20-7&#34; name=&#34;__codelineno-20-7&#34; href=&#34;#__codelineno-20-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/dependencies&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;The jackson configuration wrapper is designed to handle multiple files, with one file set as the default, aka main configuration file.Configuration files are defined using &lt;code&gt;ConfigKeys&lt;/code&gt; which provide a human readable name, path to the file and also a default value for the class.&lt;/p&gt;&lt;p&gt;The config key for our homes file would look like this &lt;code&gt;ConfigKey.of(&#34;homes&#34;, Path.of(&#34;homes.yml&#34;), Homes.class, Homes::new)&lt;/code&gt;.First we define the human readable name, which is &lt;code&gt;homes&lt;/code&gt;, followed by the path within the plugin directory.Then we pass the class and a default value if the file doesn&#39;t exist yet.&lt;/p&gt;&lt;p&gt;The default key for the &lt;code&gt;config.yml&lt;/code&gt; can be created a bit easier with &lt;code&gt;ConfigKey.defaultConfig(Configuration.class, Configuration::new)&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;The quickest way to access our files is to simply create an instance of &lt;code&gt;JacksonConfig&lt;/code&gt; and pass it our homes file as the default configuration.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-21-1&#34;&gt;&lt;a id=&#34;__codelineno-21-1&#34; name=&#34;__codelineno-21-1&#34; href=&#34;#__codelineno-21-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;c1&#34;&gt;// Create the config key for our homes file&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-2&#34;&gt;&lt;a id=&#34;__codelineno-21-2&#34; name=&#34;__codelineno-21-2&#34; href=&#34;#__codelineno-21-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;ConfigKey&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Homes&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;homesKey&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConfigKey&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;of&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;homes&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;of&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;homes.yml&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Homes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Homes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-3&#34;&gt;&lt;a id=&#34;__codelineno-21-3&#34; name=&#34;__codelineno-21-3&#34; href=&#34;#__codelineno-21-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;c1&#34;&gt;// Create a new instance and set the homes.yml as main configuration&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-4&#34;&gt;&lt;a id=&#34;__codelineno-21-4&#34; name=&#34;__codelineno-21-4&#34; href=&#34;#__codelineno-21-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;JacksonConfig&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Homes&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;config&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JacksonConfig&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;plugin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;homesKey&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-5&#34;&gt;&lt;a id=&#34;__codelineno-21-5&#34; name=&#34;__codelineno-21-5&#34; href=&#34;#__codelineno-21-5&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-6&#34;&gt;&lt;a id=&#34;__codelineno-21-6&#34; name=&#34;__codelineno-21-6&#34; href=&#34;#__codelineno-21-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;c1&#34;&gt;// Get the instance of our main configuration&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-7&#34;&gt;&lt;a id=&#34;__codelineno-21-7&#34; name=&#34;__codelineno-21-7&#34; href=&#34;#__codelineno-21-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;Homes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;config&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-8&#34;&gt;&lt;a id=&#34;__codelineno-21-8&#34; name=&#34;__codelineno-21-8&#34; href=&#34;#__codelineno-21-8&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-9&#34;&gt;&lt;a id=&#34;__codelineno-21-9&#34; name=&#34;__codelineno-21-9&#34; href=&#34;#__codelineno-21-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;c1&#34;&gt;// make some changes&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-10&#34;&gt;&lt;a id=&#34;__codelineno-21-10&#34; name=&#34;__codelineno-21-10&#34; href=&#34;#__codelineno-21-10&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-11&#34;&gt;&lt;a id=&#34;__codelineno-21-11&#34; name=&#34;__codelineno-21-11&#34; href=&#34;#__codelineno-21-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;c1&#34;&gt;// Save all configuration files&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-12&#34;&gt;&lt;a id=&#34;__codelineno-21-12&#34; name=&#34;__codelineno-21-12&#34; href=&#34;#__codelineno-21-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;config&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;save&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-13&#34;&gt;&lt;a id=&#34;__codelineno-21-13&#34; name=&#34;__codelineno-21-13&#34; href=&#34;#__codelineno-21-13&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-14&#34;&gt;&lt;a id=&#34;__codelineno-21-14&#34; name=&#34;__codelineno-21-14&#34; href=&#34;#__codelineno-21-14&#34;&gt;&lt;/a&gt;&lt;span class=&#34;c1&#34;&gt;// Only save the configuration with that key.&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-15&#34;&gt;&lt;a id=&#34;__codelineno-21-15&#34; name=&#34;__codelineno-21-15&#34; href=&#34;#__codelineno-21-15&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;config&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;save&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;homesKey&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The library takes care of the creation of our file and also allows us to easily save and retrieve it.&lt;/p&gt;&lt;p&gt;To load other files you just need to create a new &lt;code&gt;ConfigKey&lt;/code&gt; and call &lt;code&gt;JacksonConfig#secondary(ConfigKey)&lt;/code&gt; with it.&lt;/p&gt;&lt;p&gt;However, the nicer way is to create your own class based on the JacksonConfig class.You can also add a config.yml and use that as the main configuration and your homes file as the secondary configuration.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-22-1&#34;&gt;&lt;a id=&#34;__codelineno-22-1&#34; name=&#34;__codelineno-22-1&#34; href=&#34;#__codelineno-22-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;Configuration&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;extends&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JacksonConfig&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;General&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-2&#34;&gt;&lt;a id=&#34;__codelineno-22-2&#34; name=&#34;__codelineno-22-2&#34; href=&#34;#__codelineno-22-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConfigKey&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;General&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MAIN&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConfigKey&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;defaultConfig&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;General&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;General&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-3&#34;&gt;&lt;a id=&#34;__codelineno-22-3&#34; name=&#34;__codelineno-22-3&#34; href=&#34;#__codelineno-22-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConfigKey&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Homes&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HOMES&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ConfigKey&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;of&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;homes&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;of&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;homes.yml&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Homes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Homes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-4&#34;&gt;&lt;a id=&#34;__codelineno-22-4&#34; name=&#34;__codelineno-22-4&#34; href=&#34;#__codelineno-22-4&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-5&#34;&gt;&lt;a id=&#34;__codelineno-22-5&#34; name=&#34;__codelineno-22-5&#34; href=&#34;#__codelineno-22-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;Configuration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@NotNull&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Plugin&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;plugin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-6&#34;&gt;&lt;a id=&#34;__codelineno-22-6&#34; name=&#34;__codelineno-22-6&#34; href=&#34;#__codelineno-22-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;super&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;plugin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MAIN&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-7&#34;&gt;&lt;a id=&#34;__codelineno-22-7&#34; name=&#34;__codelineno-22-7&#34; href=&#34;#__codelineno-22-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-8&#34;&gt;&lt;a id=&#34;__codelineno-22-8&#34; name=&#34;__codelineno-22-8&#34; href=&#34;#__codelineno-22-8&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-9&#34;&gt;&lt;a id=&#34;__codelineno-22-9&#34; name=&#34;__codelineno-22-9&#34; href=&#34;#__codelineno-22-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Homes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;homes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-10&#34;&gt;&lt;a id=&#34;__codelineno-22-10&#34; name=&#34;__codelineno-22-10&#34; href=&#34;#__codelineno-22-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HOMES&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-11&#34;&gt;&lt;a id=&#34;__codelineno-22-11&#34; name=&#34;__codelineno-22-11&#34; href=&#34;#__codelineno-22-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-12&#34;&gt;&lt;a id=&#34;__codelineno-22-12&#34; name=&#34;__codelineno-22-12&#34; href=&#34;#__codelineno-22-12&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-13&#34;&gt;&lt;a id=&#34;__codelineno-22-13&#34; name=&#34;__codelineno-22-13&#34; href=&#34;#__codelineno-22-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Wrapper&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Homes&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;homesWrapped&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-14&#34;&gt;&lt;a id=&#34;__codelineno-22-14&#34; name=&#34;__codelineno-22-14&#34; href=&#34;#__codelineno-22-14&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;secondaryWrapped&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;HOMES&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-15&#34;&gt;&lt;a id=&#34;__codelineno-22-15&#34; name=&#34;__codelineno-22-15&#34; href=&#34;#__codelineno-22-15&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-16&#34;&gt;&lt;a id=&#34;__codelineno-22-16&#34; name=&#34;__codelineno-22-16&#34; href=&#34;#__codelineno-22-16&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And that&#39;s it.You can now use your &lt;code&gt;Configuration&lt;/code&gt; instance to access your main plugin.yml and also access your homes file via the custom method.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-23-1&#34;&gt;&lt;a id=&#34;__codelineno-23-1&#34; name=&#34;__codelineno-23-1&#34; href=&#34;#__codelineno-23-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;c1&#34;&gt;// Create a new configuration instance&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-2&#34;&gt;&lt;a id=&#34;__codelineno-23-2&#34; name=&#34;__codelineno-23-2&#34; href=&#34;#__codelineno-23-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;Configuration&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;configuration&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Configuration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;plugin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-3&#34;&gt;&lt;a id=&#34;__codelineno-23-3&#34; name=&#34;__codelineno-23-3&#34; href=&#34;#__codelineno-23-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;c1&#34;&gt;// Get the main configuration file&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-4&#34;&gt;&lt;a id=&#34;__codelineno-23-4&#34; name=&#34;__codelineno-23-4&#34; href=&#34;#__codelineno-23-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;General&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;general&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;configuration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-5&#34;&gt;&lt;a id=&#34;__codelineno-23-5&#34; name=&#34;__codelineno-23-5&#34; href=&#34;#__codelineno-23-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;c1&#34;&gt;// Get the homes configuration file&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-6&#34;&gt;&lt;a id=&#34;__codelineno-23-6&#34; name=&#34;__codelineno-23-6&#34; href=&#34;#__codelineno-23-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;Homes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;homes&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;configuration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;homes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-7&#34;&gt;&lt;a id=&#34;__codelineno-23-7&#34; name=&#34;__codelineno-23-7&#34; href=&#34;#__codelineno-23-7&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-8&#34;&gt;&lt;a id=&#34;__codelineno-23-8&#34; name=&#34;__codelineno-23-8&#34; href=&#34;#__codelineno-23-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;c1&#34;&gt;// Add a home to the player&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-9&#34;&gt;&lt;a id=&#34;__codelineno-23-9&#34; name=&#34;__codelineno-23-9&#34; href=&#34;#__codelineno-23-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;homes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;player&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;put&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;home&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;location&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-10&#34;&gt;&lt;a id=&#34;__codelineno-23-10&#34; name=&#34;__codelineno-23-10&#34; href=&#34;#__codelineno-23-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;c1&#34;&gt;// save all files&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-11&#34;&gt;&lt;a id=&#34;__codelineno-23-11&#34; name=&#34;__codelineno-23-11&#34; href=&#34;#__codelineno-23-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;configuration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;save&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-12&#34;&gt;&lt;a id=&#34;__codelineno-23-12&#34; name=&#34;__codelineno-23-12&#34; href=&#34;#__codelineno-23-12&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-13&#34;&gt;&lt;a id=&#34;__codelineno-23-13&#34; name=&#34;__codelineno-23-13&#34; href=&#34;#__codelineno-23-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;c1&#34;&gt;// Use the wrapper to automatically save once the wrapper is closed&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-14&#34;&gt;&lt;a id=&#34;__codelineno-23-14&#34; name=&#34;__codelineno-23-14&#34; href=&#34;#__codelineno-23-14&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;temp&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;configuration&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;homesWrapped&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-15&#34;&gt;&lt;a id=&#34;__codelineno-23-15&#34; name=&#34;__codelineno-23-15&#34; href=&#34;#__codelineno-23-15&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// Add a home to the player&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-16&#34;&gt;&lt;a id=&#34;__codelineno-23-16&#34; name=&#34;__codelineno-23-16&#34; href=&#34;#__codelineno-23-16&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;temp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;config&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;player&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;put&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;home&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;location&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-17&#34;&gt;&lt;a id=&#34;__codelineno-23-17&#34; name=&#34;__codelineno-23-17&#34; href=&#34;#__codelineno-23-17&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The wrapped method allows you to get the config wrapper into an auto closable, which will automatically save the file once the block is left.&lt;/p&gt;&lt;h2 id=&#34;migrating-from-configurationserializable&#34;&gt;Migrating from ConfigurationSerializable&lt;/h2&gt;&lt;p&gt;If you have used bukkit serialisation before, it is quite easy to use your new objects.All you need to do is mark your constructor as the json creator and remove the old map constructor.Of course, make sure that your users have already migrated before you remove the constructor completely from your project c:&lt;/p&gt;&lt;div class=&#34;language-diff highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-24-1&#34;&gt;&lt;a id=&#34;__codelineno-24-1&#34; name=&#34;__codelineno-24-1&#34; href=&#34;#__codelineno-24-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;-public final class PersonCS implements ConfigurationSerializable {&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-2&#34;&gt;&lt;a id=&#34;__codelineno-24-2&#34; name=&#34;__codelineno-24-2&#34; href=&#34;#__codelineno-24-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gi&#34;&gt;+public final class PersonCS {&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-3&#34;&gt;&lt;a id=&#34;__codelineno-24-3&#34; name=&#34;__codelineno-24-3&#34; href=&#34;#__codelineno-24-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt; private final String firstName;&lt;/span&gt;&lt;span id=&#34;__span-24-4&#34;&gt;&lt;a id=&#34;__codelineno-24-4&#34; name=&#34;__codelineno-24-4&#34; href=&#34;#__codelineno-24-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt; private final String secondName;&lt;/span&gt;&lt;span id=&#34;__span-24-5&#34;&gt;&lt;a id=&#34;__codelineno-24-5&#34; name=&#34;__codelineno-24-5&#34; href=&#34;#__codelineno-24-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt; private final int age;&lt;/span&gt;&lt;span id=&#34;__span-24-6&#34;&gt;&lt;a id=&#34;__codelineno-24-6&#34; name=&#34;__codelineno-24-6&#34; href=&#34;#__codelineno-24-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt; private final Address address;&lt;/span&gt;&lt;span id=&#34;__span-24-7&#34;&gt;&lt;a id=&#34;__codelineno-24-7&#34; name=&#34;__codelineno-24-7&#34; href=&#34;#__codelineno-24-7&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-8&#34;&gt;&lt;a id=&#34;__codelineno-24-8&#34; name=&#34;__codelineno-24-8&#34; href=&#34;#__codelineno-24-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- public PersonCS(Map&amp;lt;String, Object&amp;gt; map) {&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-9&#34;&gt;&lt;a id=&#34;__codelineno-24-9&#34; name=&#34;__codelineno-24-9&#34; href=&#34;#__codelineno-24-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- firstName = (String) map.get(&amp;quot;firstName&amp;quot;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-10&#34;&gt;&lt;a id=&#34;__codelineno-24-10&#34; name=&#34;__codelineno-24-10&#34; href=&#34;#__codelineno-24-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- secondName = (String) map.get(&amp;quot;secondName&amp;quot;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-11&#34;&gt;&lt;a id=&#34;__codelineno-24-11&#34; name=&#34;__codelineno-24-11&#34; href=&#34;#__codelineno-24-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- age = (Integer) map.get(&amp;quot;age&amp;quot;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-12&#34;&gt;&lt;a id=&#34;__codelineno-24-12&#34; name=&#34;__codelineno-24-12&#34; href=&#34;#__codelineno-24-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- address = (Address) map.get(&amp;quot;address&amp;quot;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-13&#34;&gt;&lt;a id=&#34;__codelineno-24-13&#34; name=&#34;__codelineno-24-13&#34; href=&#34;#__codelineno-24-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- }&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-14&#34;&gt;&lt;a id=&#34;__codelineno-24-14&#34; name=&#34;__codelineno-24-14&#34; href=&#34;#__codelineno-24-14&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-15&#34;&gt;&lt;a id=&#34;__codelineno-24-15&#34; name=&#34;__codelineno-24-15&#34; href=&#34;#__codelineno-24-15&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gi&#34;&gt;+ @JsonCreator&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-16&#34;&gt;&lt;a id=&#34;__codelineno-24-16&#34; name=&#34;__codelineno-24-16&#34; href=&#34;#__codelineno-24-16&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gi&#34;&gt;+ public PersonCS(@JsonProperty(&amp;quot;firstName&amp;quot;) String firstName,&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-17&#34;&gt;&lt;a id=&#34;__codelineno-24-17&#34; name=&#34;__codelineno-24-17&#34; href=&#34;#__codelineno-24-17&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gi&#34;&gt;+ @JsonProperty(&amp;quot;secondName&amp;quot;) String secondName,&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-18&#34;&gt;&lt;a id=&#34;__codelineno-24-18&#34; name=&#34;__codelineno-24-18&#34; href=&#34;#__codelineno-24-18&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gi&#34;&gt;+ @JsonProperty(&amp;quot;age&amp;quot;) int age,&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-19&#34;&gt;&lt;a id=&#34;__codelineno-24-19&#34; name=&#34;__codelineno-24-19&#34; href=&#34;#__codelineno-24-19&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gi&#34;&gt;+ @JsonProperty(&amp;quot;address&amp;quot;) Address address) {&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-20&#34;&gt;&lt;a id=&#34;__codelineno-24-20&#34; name=&#34;__codelineno-24-20&#34; href=&#34;#__codelineno-24-20&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt; this.firstName = firstName;&lt;/span&gt;&lt;span id=&#34;__span-24-21&#34;&gt;&lt;a id=&#34;__codelineno-24-21&#34; name=&#34;__codelineno-24-21&#34; href=&#34;#__codelineno-24-21&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt; this.secondName = secondName;&lt;/span&gt;&lt;span id=&#34;__span-24-22&#34;&gt;&lt;a id=&#34;__codelineno-24-22&#34; name=&#34;__codelineno-24-22&#34; href=&#34;#__codelineno-24-22&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt; this.age = age;&lt;/span&gt;&lt;span id=&#34;__span-24-23&#34;&gt;&lt;a id=&#34;__codelineno-24-23&#34; name=&#34;__codelineno-24-23&#34; href=&#34;#__codelineno-24-23&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt; this.address = address;&lt;/span&gt;&lt;span id=&#34;__span-24-24&#34;&gt;&lt;a id=&#34;__codelineno-24-24&#34; name=&#34;__codelineno-24-24&#34; href=&#34;#__codelineno-24-24&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt; }&lt;/span&gt;&lt;span id=&#34;__span-24-25&#34;&gt;&lt;a id=&#34;__codelineno-24-25&#34; name=&#34;__codelineno-24-25&#34; href=&#34;#__codelineno-24-25&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-26&#34;&gt;&lt;a id=&#34;__codelineno-24-26&#34; name=&#34;__codelineno-24-26&#34; href=&#34;#__codelineno-24-26&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- @Override&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-27&#34;&gt;&lt;a id=&#34;__codelineno-24-27&#34; name=&#34;__codelineno-24-27&#34; href=&#34;#__codelineno-24-27&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- public @NotNull Map&amp;lt;String, Object&amp;gt; serialize() {&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-28&#34;&gt;&lt;a id=&#34;__codelineno-24-28&#34; name=&#34;__codelineno-24-28&#34; href=&#34;#__codelineno-24-28&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- HashMap&amp;lt;String, Object&amp;gt; map = new HashMap&amp;lt;&amp;gt;();&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-29&#34;&gt;&lt;a id=&#34;__codelineno-24-29&#34; name=&#34;__codelineno-24-29&#34; href=&#34;#__codelineno-24-29&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- map.put(&amp;quot;firstName&amp;quot;, firstName);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-30&#34;&gt;&lt;a id=&#34;__codelineno-24-30&#34; name=&#34;__codelineno-24-30&#34; href=&#34;#__codelineno-24-30&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- map.put(&amp;quot;secondName&amp;quot;, secondName);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-31&#34;&gt;&lt;a id=&#34;__codelineno-24-31&#34; name=&#34;__codelineno-24-31&#34; href=&#34;#__codelineno-24-31&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- map.put(&amp;quot;age&amp;quot;, age);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-32&#34;&gt;&lt;a id=&#34;__codelineno-24-32&#34; name=&#34;__codelineno-24-32&#34; href=&#34;#__codelineno-24-32&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- map.put(&amp;quot;address&amp;quot;, address);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-33&#34;&gt;&lt;a id=&#34;__codelineno-24-33&#34; name=&#34;__codelineno-24-33&#34; href=&#34;#__codelineno-24-33&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- return map;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-34&#34;&gt;&lt;a id=&#34;__codelineno-24-34&#34; name=&#34;__codelineno-24-34&#34; href=&#34;#__codelineno-24-34&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- }&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-35&#34;&gt;&lt;a id=&#34;__codelineno-24-35&#34; name=&#34;__codelineno-24-35&#34; href=&#34;#__codelineno-24-35&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-36&#34;&gt;&lt;a id=&#34;__codelineno-24-36&#34; name=&#34;__codelineno-24-36&#34; href=&#34;#__codelineno-24-36&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt; /* GETTER */&lt;/span&gt;&lt;span id=&#34;__span-24-37&#34;&gt;&lt;a id=&#34;__codelineno-24-37&#34; name=&#34;__codelineno-24-37&#34; href=&#34;#__codelineno-24-37&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-38&#34;&gt;&lt;a id=&#34;__codelineno-24-38&#34; name=&#34;__codelineno-24-38&#34; href=&#34;#__codelineno-24-38&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt; public static final class Address implements ConfigurationSerializable {&lt;/span&gt;&lt;span id=&#34;__span-24-39&#34;&gt;&lt;a id=&#34;__codelineno-24-39&#34; name=&#34;__codelineno-24-39&#34; href=&#34;#__codelineno-24-39&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt; private final String street;&lt;/span&gt;&lt;span id=&#34;__span-24-40&#34;&gt;&lt;a id=&#34;__codelineno-24-40&#34; name=&#34;__codelineno-24-40&#34; href=&#34;#__codelineno-24-40&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt; private final String city;&lt;/span&gt;&lt;span id=&#34;__span-24-41&#34;&gt;&lt;a id=&#34;__codelineno-24-41&#34; name=&#34;__codelineno-24-41&#34; href=&#34;#__codelineno-24-41&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-42&#34;&gt;&lt;a id=&#34;__codelineno-24-42&#34; name=&#34;__codelineno-24-42&#34; href=&#34;#__codelineno-24-42&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- public Address(Map&amp;lt;String, Object&amp;gt; map) {&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-43&#34;&gt;&lt;a id=&#34;__codelineno-24-43&#34; name=&#34;__codelineno-24-43&#34; href=&#34;#__codelineno-24-43&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- street = (String) map.get(&amp;quot;street&amp;quot;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-44&#34;&gt;&lt;a id=&#34;__codelineno-24-44&#34; name=&#34;__codelineno-24-44&#34; href=&#34;#__codelineno-24-44&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- city = (String) map.get(&amp;quot;city&amp;quot;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-45&#34;&gt;&lt;a id=&#34;__codelineno-24-45&#34; name=&#34;__codelineno-24-45&#34; href=&#34;#__codelineno-24-45&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- }&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-46&#34;&gt;&lt;a id=&#34;__codelineno-24-46&#34; name=&#34;__codelineno-24-46&#34; href=&#34;#__codelineno-24-46&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-47&#34;&gt;&lt;a id=&#34;__codelineno-24-47&#34; name=&#34;__codelineno-24-47&#34; href=&#34;#__codelineno-24-47&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gi&#34;&gt;+ @JsonCreator&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-48&#34;&gt;&lt;a id=&#34;__codelineno-24-48&#34; name=&#34;__codelineno-24-48&#34; href=&#34;#__codelineno-24-48&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gi&#34;&gt;+ public Address(@JsonProperty(&amp;quot;street&amp;quot;) String street,&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-49&#34;&gt;&lt;a id=&#34;__codelineno-24-49&#34; name=&#34;__codelineno-24-49&#34; href=&#34;#__codelineno-24-49&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gi&#34;&gt;+ @JsonProperty(&amp;quot;city&amp;quot;) String city) {&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-50&#34;&gt;&lt;a id=&#34;__codelineno-24-50&#34; name=&#34;__codelineno-24-50&#34; href=&#34;#__codelineno-24-50&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt; this.street = street;&lt;/span&gt;&lt;span id=&#34;__span-24-51&#34;&gt;&lt;a id=&#34;__codelineno-24-51&#34; name=&#34;__codelineno-24-51&#34; href=&#34;#__codelineno-24-51&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt; this.city = city;&lt;/span&gt;&lt;span id=&#34;__span-24-52&#34;&gt;&lt;a id=&#34;__codelineno-24-52&#34; name=&#34;__codelineno-24-52&#34; href=&#34;#__codelineno-24-52&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt; }&lt;/span&gt;&lt;span id=&#34;__span-24-53&#34;&gt;&lt;a id=&#34;__codelineno-24-53&#34; name=&#34;__codelineno-24-53&#34; href=&#34;#__codelineno-24-53&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-54&#34;&gt;&lt;a id=&#34;__codelineno-24-54&#34; name=&#34;__codelineno-24-54&#34; href=&#34;#__codelineno-24-54&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- @Override&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-55&#34;&gt;&lt;a id=&#34;__codelineno-24-55&#34; name=&#34;__codelineno-24-55&#34; href=&#34;#__codelineno-24-55&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- @NotNull&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-56&#34;&gt;&lt;a id=&#34;__codelineno-24-56&#34; name=&#34;__codelineno-24-56&#34; href=&#34;#__codelineno-24-56&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- public Map&amp;lt;String, Object&amp;gt; serialize() {&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-57&#34;&gt;&lt;a id=&#34;__codelineno-24-57&#34; name=&#34;__codelineno-24-57&#34; href=&#34;#__codelineno-24-57&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- HashMap&amp;lt;String, Object&amp;gt; map = new HashMap&amp;lt;&amp;gt;();&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-58&#34;&gt;&lt;a id=&#34;__codelineno-24-58&#34; name=&#34;__codelineno-24-58&#34; href=&#34;#__codelineno-24-58&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- map.put(&amp;quot;street&amp;quot;, street);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-59&#34;&gt;&lt;a id=&#34;__codelineno-24-59&#34; name=&#34;__codelineno-24-59&#34; href=&#34;#__codelineno-24-59&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- map.put(&amp;quot;city&amp;quot;, city);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-60&#34;&gt;&lt;a id=&#34;__codelineno-24-60&#34; name=&#34;__codelineno-24-60&#34; href=&#34;#__codelineno-24-60&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- return map;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-61&#34;&gt;&lt;a id=&#34;__codelineno-24-61&#34; name=&#34;__codelineno-24-61&#34; href=&#34;#__codelineno-24-61&#34;&gt;&lt;/a&gt;&lt;span class=&#34;gd&#34;&gt;- }&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-62&#34;&gt;&lt;a id=&#34;__codelineno-24-62&#34; name=&#34;__codelineno-24-62&#34; href=&#34;#__codelineno-24-62&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-63&#34;&gt;&lt;a id=&#34;__codelineno-24-63&#34; name=&#34;__codelineno-24-63&#34; href=&#34;#__codelineno-24-63&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt; /* GETTER */&lt;/span&gt;&lt;span id=&#34;__span-24-64&#34;&gt;&lt;a id=&#34;__codelineno-24-64&#34; name=&#34;__codelineno-24-64&#34; href=&#34;#__codelineno-24-64&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt; }&lt;/span&gt;&lt;span id=&#34;__span-24-65&#34;&gt;&lt;a id=&#34;__codelineno-24-65&#34; name=&#34;__codelineno-24-65&#34; href=&#34;#__codelineno-24-65&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Instead of creating a constructor for your classes, you can also use the fields to map values.I just prefer constructors because they are less hacky than reflection stuff.&lt;/p&gt;&lt;h2 id=&#34;thank-you&#34;&gt;Thank you!&lt;/h2&gt;&lt;p&gt;Thank you for sticking with me so far.You can now easily create configuration files with jackson and use them in your plugins!&lt;/p&gt;&lt;p&gt;Thanks for reading!If you liked this post, or have some questions, feel free to come by my discord and have a chat!&lt;/p&gt;&lt;p&gt;&lt;a href=&#34;https://discord.chojo.dev&#34;&gt;&lt;img alt=&#34;Discord Server invite for Chojos Coding Hell&#34; src=&#34;https://discordapp.com/api/guilds/1120671561368748092/widget.png?style=banner3&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Or write me a mail at &lt;code&gt;mail [at] chojo [dot] dev&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;If you want to support me, feel free to sponsor me via &lt;a href=&#34;https://github.com/sponsors/rainbowdashlabs&#34;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</description><link>https://chojo.dev/blog/2023/10/30/jackson-bukkit---bukkit-serialization-done-the-right-way/</link> <pubDate>Sat, 26 Aug 2023 10:57:22 +0200</pubDate><source url="https://chojo.dev/feed_rss_created.xml">Chojo - Dev Blog and Portfolio</source><guid isPermaLink="true">https://chojo.dev/blog/2023/10/30/jackson-bukkit---bukkit-serialization-done-the-right-way/</guid> </item> <item> <title>Logging in Minecraft - The good and better way</title> <author>chojo</author> <description>&lt;h1 id=&#34;logging-in-minecraft-the-good-and-better-way&#34;&gt;Logging in Minecraft - The good and better way&lt;/h1&gt;&lt;p&gt;&lt;a href=&#34;../../../../de/minecraft_logging/&#34;&gt;German Version&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This blog post is about logging and writing information to the console in Minecraft.There are a lot of ways to write data to the Minecraft console.And there are a lot of bad or wrong ways to write to the Minecraft console.We&#39;ll start by looking at some bad practices, then move on to the built-in plugin logger, and finish with a look at slf4j.&lt;/p&gt;&lt;!-- more --&gt;&lt;h2 id=&#34;the-five-types-of-logging&#34;&gt;The five types of logging&lt;/h2&gt;&lt;p&gt;As mentioned earlier, there are several ways (at least five) to write to the console.Let&#39;s have a look at them before I explain them.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;class&lt;/span&gt; &lt;span class=&#34;nc&#34;&gt;MyPlugin&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;extends&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JavaPlugin&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-2&#34;&gt;&lt;a id=&#34;__codelineno-0-2&#34; name=&#34;__codelineno-0-2&#34; href=&#34;#__codelineno-0-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Logger&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LoggerFactory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getLogger&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyPlugin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-3&#34;&gt;&lt;a id=&#34;__codelineno-0-3&#34; name=&#34;__codelineno-0-3&#34; href=&#34;#__codelineno-0-3&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-4&#34;&gt;&lt;a id=&#34;__codelineno-0-4&#34; name=&#34;__codelineno-0-4&#34; href=&#34;#__codelineno-0-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nd&#34;&gt;@Override&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-5&#34;&gt;&lt;a id=&#34;__codelineno-0-5&#34; name=&#34;__codelineno-0-5&#34; href=&#34;#__codelineno-0-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;public&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kt&#34;&gt;void&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;onEnable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-6&#34;&gt;&lt;a id=&#34;__codelineno-0-6&#34; name=&#34;__codelineno-0-6&#34; href=&#34;#__codelineno-0-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;System&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;out&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;println&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Writing via std out&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-7&#34;&gt;&lt;a id=&#34;__codelineno-0-7&#34; name=&#34;__codelineno-0-7&#34; href=&#34;#__codelineno-0-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Bukkit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getConsoleSender&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;sendMessage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Writing via console sender&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-8&#34;&gt;&lt;a id=&#34;__codelineno-0-8&#34; name=&#34;__codelineno-0-8&#34; href=&#34;#__codelineno-0-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Bukkit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getLogger&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Writing via bukkit logger&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-9&#34;&gt;&lt;a id=&#34;__codelineno-0-9&#34; name=&#34;__codelineno-0-9&#34; href=&#34;#__codelineno-0-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getLogger&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Writing via plugin logger&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-10&#34;&gt;&lt;a id=&#34;__codelineno-0-10&#34; name=&#34;__codelineno-0-10&#34; href=&#34;#__codelineno-0-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Writing via slf4j logger&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-11&#34;&gt;&lt;a id=&#34;__codelineno-0-11&#34; name=&#34;__codelineno-0-11&#34; href=&#34;#__codelineno-0-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-12&#34;&gt;&lt;a id=&#34;__codelineno-0-12&#34; name=&#34;__codelineno-0-12&#34; href=&#34;#__codelineno-0-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This results in these outputs:&lt;/p&gt;&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-1-1&#34;&gt;&lt;a id=&#34;__codelineno-1-1&#34; name=&#34;__codelineno-1-1&#34; href=&#34;#__codelineno-1-1&#34;&gt;&lt;/a&gt;[15:39:35 INFO]: [MyPlugin] [STDOUT] Writing via std out&lt;/span&gt;&lt;span id=&#34;__span-1-2&#34;&gt;&lt;a id=&#34;__codelineno-1-2&#34; name=&#34;__codelineno-1-2&#34; href=&#34;#__codelineno-1-2&#34;&gt;&lt;/a&gt;[15:39:35 WARN]: Nag author(s): &amp;#39;[]&amp;#39; of &amp;#39;MyPlugin v1.0.0&amp;#39; about their usage of System.out/err.print. Please use your plugin&amp;#39;s logger instead (JavaPlugin#getLogger).&lt;/span&gt;&lt;span id=&#34;__span-1-3&#34;&gt;&lt;a id=&#34;__codelineno-1-3&#34; name=&#34;__codelineno-1-3&#34; href=&#34;#__codelineno-1-3&#34;&gt;&lt;/a&gt;[15:39:35 INFO]: Writing via console sender&lt;/span&gt;&lt;span id=&#34;__span-1-4&#34;&gt;&lt;a id=&#34;__codelineno-1-4&#34; name=&#34;__codelineno-1-4&#34; href=&#34;#__codelineno-1-4&#34;&gt;&lt;/a&gt;[15:39:35 INFO]: Writing via bukkit logger&lt;/span&gt;&lt;span id=&#34;__span-1-5&#34;&gt;&lt;a id=&#34;__codelineno-1-5&#34; name=&#34;__codelineno-1-5&#34; href=&#34;#__codelineno-1-5&#34;&gt;&lt;/a&gt;[15:39:35 INFO]: [MyPlugin] Writing via plugin logger&lt;/span&gt;&lt;span id=&#34;__span-1-6&#34;&gt;&lt;a id=&#34;__codelineno-1-6&#34; name=&#34;__codelineno-1-6&#34; href=&#34;#__codelineno-1-6&#34;&gt;&lt;/a&gt;[15:39:35 INFO]: [dev.chojo.myplugin.MyPlugin] Writing via slf4j logger&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You may have already noticed some important differences, but let us take a closer look.&lt;/p&gt;&lt;h2 id=&#34;donts&#34;&gt;Don&#39;ts&lt;/h2&gt;&lt;p&gt;All logging methods in this section are don&#39;ts.If you are only interested in how to do it properly, jump directly to &lt;a href=&#34;#dos&#34;&gt;dos&lt;/a&gt;&lt;/p&gt;&lt;h3 id=&#34;standard-output&#34;&gt;Standard output&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Don&#39;t do this!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;While &lt;code&gt;System.out.println&lt;/code&gt; is a valid use case when you need a quick response from your application, there are often much better ways.In general, it should always be avoided.It is probably the worst way if you are using Spigot, and still a bad way if you are using Paper.Paper captures everything a plugin writes to std and actually uses the &lt;a href=&#34;#plugin-logger&#34;&gt;plugin logger&lt;/a&gt; to write it.This way the reader actually knows where the print came from.This is not the case when using Spigot.People will just end up with a printout like when using the &lt;a href=&#34;#console-sender&#34;&gt;console sender&lt;/a&gt; or &lt;a href=&#34;#bukkit-logger&#34;&gt;bukkit logger&lt;/a&gt; method.You don&#39;t know where it came from.&lt;/p&gt;&lt;p&gt;If you use the default out to write, you will also get a nice message on Paper servers:&lt;/p&gt;&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-2-1&#34;&gt;&lt;a id=&#34;__codelineno-2-1&#34; name=&#34;__codelineno-2-1&#34; href=&#34;#__codelineno-2-1&#34;&gt;&lt;/a&gt;[15:39:35 INFO]: [MyPlugin] [STDOUT] Writing via std out&lt;/span&gt;&lt;span id=&#34;__span-2-2&#34;&gt;&lt;a id=&#34;__codelineno-2-2&#34; name=&#34;__codelineno-2-2&#34; href=&#34;#__codelineno-2-2&#34;&gt;&lt;/a&gt;[15:39:35 WARN]: Nag author(s): &amp;#39;[]&amp;#39; of &amp;#39;MyPlugin v1.0.0&amp;#39; about their usage of System.out/err.print. Please use your plugin&amp;#39;s logger instead (JavaPlugin#getLogger).&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It already suggests something else, the &lt;a href=&#34;#plugin-logger&#34;&gt;plugin logger&lt;/a&gt;, which we will look at later.&lt;/p&gt;&lt;h3 id=&#34;console-sender&#34;&gt;Console sender&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Don&#39;t do this!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The console sender is just as bad as standard output, except that it doesn&#39;t really tell you where the message came from.All you get is a simple text with some message that you may or may not understand.&lt;/p&gt;&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-3-1&#34;&gt;&lt;a id=&#34;__codelineno-3-1&#34; name=&#34;__codelineno-3-1&#34; href=&#34;#__codelineno-3-1&#34;&gt;&lt;/a&gt;[15:39:35 INFO]: Writing via console sender&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;bukkit-logger&#34;&gt;Bukkit Logger&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Don&#39;t do this!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;While the bukkit logger is actually a logger and can be used as such, it still lacks the information about which plugin sent the message.The only advantage it has is that it can log exceptions properly.Other than that, it is still as bad as the &lt;a href=&#34;#console-sender&#34;&gt;console sender&lt;/a&gt; and &lt;a href=&#34;#standard-output&#34;&gt;standard out&lt;/a&gt; methods.&lt;/p&gt;&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-4-1&#34;&gt;&lt;a id=&#34;__codelineno-4-1&#34; name=&#34;__codelineno-4-1&#34; href=&#34;#__codelineno-4-1&#34;&gt;&lt;/a&gt;[15:39:35 INFO]: Writing via bukkit logger &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;dos&#34;&gt;Do&#39;s&lt;/h2&gt;&lt;p&gt;These are the ways to go if you want to write something to the console.&lt;/p&gt;&lt;h3 id=&#34;plugin-logger&#34;&gt;Plugin Logger&lt;/h3&gt;&lt;p&gt;The &lt;code&gt;Plugin&#39; class provides a method called&lt;/code&gt;#getLogger()`.This method returns a &lt;a href=&#34;https://docs.oracle.com/javase/8/docs/api/java/util/logging/Logger.html&#34;&gt;Logger&lt;/a&gt; which allows you to write at different levels and also log exceptions properly.It also adds the name of your plugin to the top of your log message, so everyone can easily see which plugin sent the message.&lt;/p&gt;&lt;p&gt;To write on different levels you can use these methods:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;Logger#info(String)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;Logger#warning(String)&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;Logger#severe(String)&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;There are more levels like &lt;code&gt;config&lt;/code&gt;, &lt;code&gt;fine&lt;/code&gt;, &lt;code&gt;finer&lt;/code&gt; and &lt;code&gt;finest&lt;/code&gt;, but if you&#39;re using Paper or Spigot, these messages won&#39;t appear in your console or log file.There are workarounds, such as implementing a custom logger that simply delegates to the info level instead, or using reflections to change the logger configuration, but that is beyond the scope of this post.&lt;/p&gt;&lt;p&gt;If you are using the logger, it looks like this:&lt;/p&gt;&lt;p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-5-1&#34;&gt;&lt;a id=&#34;__codelineno-5-1&#34; name=&#34;__codelineno-5-1&#34; href=&#34;#__codelineno-5-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;getLogger&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;This is a info&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-2&#34;&gt;&lt;a id=&#34;__codelineno-5-2&#34; name=&#34;__codelineno-5-2&#34; href=&#34;#__codelineno-5-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;getLogger&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;warning&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;This is a warning&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-5-3&#34;&gt;&lt;a id=&#34;__codelineno-5-3&#34; name=&#34;__codelineno-5-3&#34; href=&#34;#__codelineno-5-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;getLogger&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;severe&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;This is an error&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-6-1&#34;&gt;&lt;a id=&#34;__codelineno-6-1&#34; name=&#34;__codelineno-6-1&#34; href=&#34;#__codelineno-6-1&#34;&gt;&lt;/a&gt;[16:13:08 INFO]: [MyPlugin] This is a info&lt;/span&gt;&lt;span id=&#34;__span-6-2&#34;&gt;&lt;a id=&#34;__codelineno-6-2&#34; name=&#34;__codelineno-6-2&#34; href=&#34;#__codelineno-6-2&#34;&gt;&lt;/a&gt;[16:13:08 WARN]: [MyPlugin] This is a warning&lt;/span&gt;&lt;span id=&#34;__span-6-3&#34;&gt;&lt;a id=&#34;__codelineno-6-3&#34; name=&#34;__codelineno-6-3&#34; href=&#34;#__codelineno-6-3&#34;&gt;&lt;/a&gt;[16:13:08 ERROR]: [MyPlugin] This is an error&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;&lt;h4 id=&#34;logging-exceptions&#34;&gt;Logging exceptions&lt;/h4&gt;&lt;p&gt;While in most cases it may be sufficient to simply write messages, we will probably want to log exceptions at some point.&lt;/p&gt;&lt;p&gt;You may have seen this in many cases:&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-7-1&#34;&gt;&lt;a id=&#34;__codelineno-7-1&#34; name=&#34;__codelineno-7-1&#34; href=&#34;#__codelineno-7-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-2&#34;&gt;&lt;a id=&#34;__codelineno-7-2&#34; name=&#34;__codelineno-7-2&#34; href=&#34;#__codelineno-7-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RuntimeException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;This is not good&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-3&#34;&gt;&lt;a id=&#34;__codelineno-7-3&#34; name=&#34;__codelineno-7-3&#34; href=&#34;#__codelineno-7-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Exception&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-4&#34;&gt;&lt;a id=&#34;__codelineno-7-4&#34; name=&#34;__codelineno-7-4&#34; href=&#34;#__codelineno-7-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;printStackTrace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-5&#34;&gt;&lt;a id=&#34;__codelineno-7-5&#34; name=&#34;__codelineno-7-5&#34; href=&#34;#__codelineno-7-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;details&gt;&lt;summary&gt;Output&lt;/summary&gt;&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-8-1&#34;&gt;&lt;a id=&#34;__codelineno-8-1&#34; name=&#34;__codelineno-8-1&#34; href=&#34;#__codelineno-8-1&#34;&gt;&lt;/a&gt;[16:13:08 WARN]: java.lang.RuntimeException: This is not good&lt;/span&gt;&lt;span id=&#34;__span-8-2&#34;&gt;&lt;a id=&#34;__codelineno-8-2&#34; name=&#34;__codelineno-8-2&#34; href=&#34;#__codelineno-8-2&#34;&gt;&lt;/a&gt;[16:13:08 WARN]: at myplugin-1.0.0.jar//dev.chojo.myplugin.MyPlugin.onEnable(MyPlugin.java:25)&lt;/span&gt;&lt;span id=&#34;__span-8-3&#34;&gt;&lt;a id=&#34;__codelineno-8-3&#34; name=&#34;__codelineno-8-3&#34; href=&#34;#__codelineno-8-3&#34;&gt;&lt;/a&gt;[16:13:08 WARN]: at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:281)&lt;/span&gt;&lt;span id=&#34;__span-8-4&#34;&gt;&lt;a id=&#34;__codelineno-8-4&#34; name=&#34;__codelineno-8-4&#34; href=&#34;#__codelineno-8-4&#34;&gt;&lt;/a&gt;[16:13:08 WARN]: at io.papermc.paper.plugin.manager.PaperPluginInstanceManager.enablePlugin(PaperPluginInstanceManager.java:189)&lt;/span&gt;&lt;span id=&#34;__span-8-5&#34;&gt;&lt;a id=&#34;__codelineno-8-5&#34; name=&#34;__codelineno-8-5&#34; href=&#34;#__codelineno-8-5&#34;&gt;&lt;/a&gt;[16:13:08 WARN]: at io.papermc.paper.plugin.manager.PaperPluginManagerImpl.enablePlugin(PaperPluginManagerImpl.java:104)&lt;/span&gt;&lt;span id=&#34;__span-8-6&#34;&gt;&lt;a id=&#34;__codelineno-8-6&#34; name=&#34;__codelineno-8-6&#34; href=&#34;#__codelineno-8-6&#34;&gt;&lt;/a&gt;[16:13:08 WARN]: at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:507)&lt;/span&gt;&lt;span id=&#34;__span-8-7&#34;&gt;&lt;a id=&#34;__codelineno-8-7&#34; name=&#34;__codelineno-8-7&#34; href=&#34;#__codelineno-8-7&#34;&gt;&lt;/a&gt;[16:13:08 WARN]: at org.bukkit.craftbukkit.v1_20_R1.CraftServer.enablePlugin(CraftServer.java:640)&lt;/span&gt;&lt;span id=&#34;__span-8-8&#34;&gt;&lt;a id=&#34;__codelineno-8-8&#34; name=&#34;__codelineno-8-8&#34; href=&#34;#__codelineno-8-8&#34;&gt;&lt;/a&gt;[16:13:08 WARN]: at org.bukkit.craftbukkit.v1_20_R1.CraftServer.enablePlugins(CraftServer.java:551)&lt;/span&gt;&lt;span id=&#34;__span-8-9&#34;&gt;&lt;a id=&#34;__codelineno-8-9&#34; name=&#34;__codelineno-8-9&#34; href=&#34;#__codelineno-8-9&#34;&gt;&lt;/a&gt;[16:13:08 WARN]: at net.minecraft.server.MinecraftServer.loadWorld0(MinecraftServer.java:636)&lt;/span&gt;&lt;span id=&#34;__span-8-10&#34;&gt;&lt;a id=&#34;__codelineno-8-10&#34; name=&#34;__codelineno-8-10&#34; href=&#34;#__codelineno-8-10&#34;&gt;&lt;/a&gt;[16:13:08 WARN]: at net.minecraft.server.MinecraftServer.loadLevel(MinecraftServer.java:435)&lt;/span&gt;&lt;span id=&#34;__span-8-11&#34;&gt;&lt;a id=&#34;__codelineno-8-11&#34; name=&#34;__codelineno-8-11&#34; href=&#34;#__codelineno-8-11&#34;&gt;&lt;/a&gt;[16:13:08 WARN]: at net.minecraft.server.dedicated.DedicatedServer.e(DedicatedServer.java:308)&lt;/span&gt;&lt;span id=&#34;__span-8-12&#34;&gt;&lt;a id=&#34;__codelineno-8-12&#34; name=&#34;__codelineno-8-12&#34; href=&#34;#__codelineno-8-12&#34;&gt;&lt;/a&gt;[16:13:08 WARN]: at net.minecraft.server.MinecraftServer.w(MinecraftServer.java:1101)&lt;/span&gt;&lt;span id=&#34;__span-8-13&#34;&gt;&lt;a id=&#34;__codelineno-8-13&#34; name=&#34;__codelineno-8-13&#34; href=&#34;#__codelineno-8-13&#34;&gt;&lt;/a&gt;[16:13:08 WARN]: at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:318)&lt;/span&gt;&lt;span id=&#34;__span-8-14&#34;&gt;&lt;a id=&#34;__codelineno-8-14&#34; name=&#34;__codelineno-8-14&#34; href=&#34;#__codelineno-8-14&#34;&gt;&lt;/a&gt;[16:13:08 WARN]: at java.base/java.lang.Thread.run(Thread.java:833)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;This is bad, don&#39;t do it!&lt;/p&gt;&lt;p&gt;Instead, you need to use the &lt;code&gt;#log(Level, String, Throwable)&lt;/code&gt; method of your logger.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-9-1&#34;&gt;&lt;a id=&#34;__codelineno-9-1&#34; name=&#34;__codelineno-9-1&#34; href=&#34;#__codelineno-9-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-9-2&#34;&gt;&lt;a id=&#34;__codelineno-9-2&#34; name=&#34;__codelineno-9-2&#34; href=&#34;#__codelineno-9-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RuntimeException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;This is not good&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-9-3&#34;&gt;&lt;a id=&#34;__codelineno-9-3&#34; name=&#34;__codelineno-9-3&#34; href=&#34;#__codelineno-9-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Exception&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-9-4&#34;&gt;&lt;a id=&#34;__codelineno-9-4&#34; name=&#34;__codelineno-9-4&#34; href=&#34;#__codelineno-9-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;getLogger&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Level&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;SEVERE&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Something went wrong&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-9-5&#34;&gt;&lt;a id=&#34;__codelineno-9-5&#34; name=&#34;__codelineno-9-5&#34; href=&#34;#__codelineno-9-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;a href=&#34;https://docs.oracle.com/javase/8/docs/api/java/util/logging/Level.html&#34;&gt;Level&lt;/a&gt; class is a built-in Java class that is part of the &lt;code&gt;java.util.logging&lt;/code&gt; package.Calling this method will print your exception nicely, containing a message, the exception message and a stack trace.&lt;/p&gt;&lt;div class=&#34;admonition warning&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Warning&lt;/p&gt;&lt;p&gt;If you cannot make sense of this, I recommend reading this &lt;a href=&#34;https://stackoverflow.com/a/3988794&#34;&gt;stackoverflow post&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-10-1&#34;&gt;&lt;a id=&#34;__codelineno-10-1&#34; name=&#34;__codelineno-10-1&#34; href=&#34;#__codelineno-10-1&#34;&gt;&lt;/a&gt;[16:10:43 ERROR]: [MyPlugin] Something went wrong&lt;/span&gt;&lt;span id=&#34;__span-10-2&#34;&gt;&lt;a id=&#34;__codelineno-10-2&#34; name=&#34;__codelineno-10-2&#34; href=&#34;#__codelineno-10-2&#34;&gt;&lt;/a&gt;java.lang.RuntimeException: This is not good&lt;/span&gt;&lt;span id=&#34;__span-10-3&#34;&gt;&lt;a id=&#34;__codelineno-10-3&#34; name=&#34;__codelineno-10-3&#34; href=&#34;#__codelineno-10-3&#34;&gt;&lt;/a&gt; at dev.chojo.myplugin.MyPlugin.onEnable(MyPlugin.java:25) ~[myplugin-1.0.0.jar:?]&lt;/span&gt;&lt;span id=&#34;__span-10-4&#34;&gt;&lt;a id=&#34;__codelineno-10-4&#34; name=&#34;__codelineno-10-4&#34; href=&#34;#__codelineno-10-4&#34;&gt;&lt;/a&gt; at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:281) ~[paper-api-1.20.1-R0.1-SNAPSHOT.jar:?]&lt;/span&gt;&lt;span id=&#34;__span-10-5&#34;&gt;&lt;a id=&#34;__codelineno-10-5&#34; name=&#34;__codelineno-10-5&#34; href=&#34;#__codelineno-10-5&#34;&gt;&lt;/a&gt; at io.papermc.paper.plugin.manager.PaperPluginInstanceManager.enablePlugin(PaperPluginInstanceManager.java:189) ~[paper-1.20.1.jar:git-Paper-117]&lt;/span&gt;&lt;span id=&#34;__span-10-6&#34;&gt;&lt;a id=&#34;__codelineno-10-6&#34; name=&#34;__codelineno-10-6&#34; href=&#34;#__codelineno-10-6&#34;&gt;&lt;/a&gt; at io.papermc.paper.plugin.manager.PaperPluginManagerImpl.enablePlugin(PaperPluginManagerImpl.java:104) ~[paper-1.20.1.jar:git-Paper-117]&lt;/span&gt;&lt;span id=&#34;__span-10-7&#34;&gt;&lt;a id=&#34;__codelineno-10-7&#34; name=&#34;__codelineno-10-7&#34; href=&#34;#__codelineno-10-7&#34;&gt;&lt;/a&gt; at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:507) ~[paper-api-1.20.1-R0.1-SNAPSHOT.jar:?]&lt;/span&gt;&lt;span id=&#34;__span-10-8&#34;&gt;&lt;a id=&#34;__codelineno-10-8&#34; name=&#34;__codelineno-10-8&#34; href=&#34;#__codelineno-10-8&#34;&gt;&lt;/a&gt; at org.bukkit.craftbukkit.v1_20_R1.CraftServer.enablePlugin(CraftServer.java:640) ~[paper-1.20.1.jar:git-Paper-117]&lt;/span&gt;&lt;span id=&#34;__span-10-9&#34;&gt;&lt;a id=&#34;__codelineno-10-9&#34; name=&#34;__codelineno-10-9&#34; href=&#34;#__codelineno-10-9&#34;&gt;&lt;/a&gt; at org.bukkit.craftbukkit.v1_20_R1.CraftServer.enablePlugins(CraftServer.java:551) ~[paper-1.20.1.jar:git-Paper-117]&lt;/span&gt;&lt;span id=&#34;__span-10-10&#34;&gt;&lt;a id=&#34;__codelineno-10-10&#34; name=&#34;__codelineno-10-10&#34; href=&#34;#__codelineno-10-10&#34;&gt;&lt;/a&gt; at net.minecraft.server.MinecraftServer.loadWorld0(MinecraftServer.java:636) ~[paper-1.20.1.jar:git-Paper-117]&lt;/span&gt;&lt;span id=&#34;__span-10-11&#34;&gt;&lt;a id=&#34;__codelineno-10-11&#34; name=&#34;__codelineno-10-11&#34; href=&#34;#__codelineno-10-11&#34;&gt;&lt;/a&gt; at net.minecraft.server.MinecraftServer.loadLevel(MinecraftServer.java:435) ~[paper-1.20.1.jar:git-Paper-117]&lt;/span&gt;&lt;span id=&#34;__span-10-12&#34;&gt;&lt;a id=&#34;__codelineno-10-12&#34; name=&#34;__codelineno-10-12&#34; href=&#34;#__codelineno-10-12&#34;&gt;&lt;/a&gt; at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:308) ~[paper-1.20.1.jar:git-Paper-117]&lt;/span&gt;&lt;span id=&#34;__span-10-13&#34;&gt;&lt;a id=&#34;__codelineno-10-13&#34; name=&#34;__codelineno-10-13&#34; href=&#34;#__codelineno-10-13&#34;&gt;&lt;/a&gt; at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1101) ~[paper-1.20.1.jar:git-Paper-117]&lt;/span&gt;&lt;span id=&#34;__span-10-14&#34;&gt;&lt;a id=&#34;__codelineno-10-14&#34; name=&#34;__codelineno-10-14&#34; href=&#34;#__codelineno-10-14&#34;&gt;&lt;/a&gt; at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:318) ~[paper-1.20.1.jar:git-Paper-117]&lt;/span&gt;&lt;span id=&#34;__span-10-15&#34;&gt;&lt;a id=&#34;__codelineno-10-15&#34; name=&#34;__codelineno-10-15&#34; href=&#34;#__codelineno-10-15&#34;&gt;&lt;/a&gt; at java.lang.Thread.run(Thread.java:833) ~[?:?]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;the-slf4j-logger&#34;&gt;The SLF4J logger&lt;/h3&gt;&lt;p&gt;Internally, Paper and Spigot uses a framework called &lt;a href=&#34;https://www.slf4j.org/&#34;&gt;slf4j&lt;/a&gt; with an implementation called &lt;a href=&#34;https://github.com/apache/logging-log4j2&#34;&gt;log4j&lt;/a&gt;.Even if you use the &lt;a href=&#34;#plugin-logger&#34;&gt;plugin logger&lt;/a&gt;, you are still using the slf4j framework.So you can actually use it directly.Instead of prefixing your message with the plugin name, the slf4j logger will prefix your output with the class name that is sending the message.This gives you even more detail about where the message is coming from.&lt;/p&gt;&lt;p&gt;Aside from its practical use in Minecraft, slf4j is also widely used in other projects, and you will encounter it very often outside the Minecraft world.This makes it generally good to know if you are going to go out and work with other frameworks and libraries.&lt;/p&gt;&lt;p&gt;To get a logger instance for your class, you need the &lt;code&gt;LoggerFactory&lt;/code&gt; class, call the &lt;code&gt;#getLogger(Class)&lt;/code&gt; method and pass your current class.As this is some lame manual work, you can simply create a &lt;a href=&#34;https://www.jetbrains.com/help/idea/using-live-templates.html&#34;&gt;live template&lt;/a&gt; for it if you are using IntelliJ.&lt;/p&gt;&lt;p&gt;The live template looks like this (an import template is in the spoiler below):&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-11-1&#34;&gt;&lt;a id=&#34;__codelineno-11-1&#34; name=&#34;__codelineno-11-1&#34; href=&#34;#__codelineno-11-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;slf4j&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Logger&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;org&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;slf4j&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;LoggerFactory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getLogger&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;$class$&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;details&gt;&lt;summary&gt;XML Template for import&lt;/summary&gt;To import this, create a new Java Live template, copy the XML code above and paste it into your newly created template.&lt;div class=&#34;language-xml highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-12-1&#34;&gt;&lt;a id=&#34;__codelineno-12-1&#34; name=&#34;__codelineno-12-1&#34; href=&#34;#__codelineno-12-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;template&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;log&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger($class$.class);&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;description=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;insert a default logger&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toReformat=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;toShortenFQNames=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;useStaticImport=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-12-2&#34;&gt;&lt;a id=&#34;__codelineno-12-2&#34; name=&#34;__codelineno-12-2&#34; href=&#34;#__codelineno-12-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;variable&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;class&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;expression=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;className()&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;defaultValue=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;className()&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;alwaysStopAt=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;false&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-12-3&#34;&gt;&lt;a id=&#34;__codelineno-12-3&#34; name=&#34;__codelineno-12-3&#34; href=&#34;#__codelineno-12-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;context&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-12-4&#34;&gt;&lt;a id=&#34;__codelineno-12-4&#34; name=&#34;__codelineno-12-4&#34; href=&#34;#__codelineno-12-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;option&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;name=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;JAVA_DECLARATION&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;na&#34;&gt;value=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;true&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-12-5&#34;&gt;&lt;a id=&#34;__codelineno-12-5&#34; name=&#34;__codelineno-12-5&#34; href=&#34;#__codelineno-12-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/context&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-12-6&#34;&gt;&lt;a id=&#34;__codelineno-12-6&#34; name=&#34;__codelineno-12-6&#34; href=&#34;#__codelineno-12-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;/template&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;If you register this with the abbreviation &lt;code&gt;log&lt;/code&gt;, all you have to do is type &lt;code&gt;log&lt;/code&gt; in your class and the logger will be inserted.You will end up with something like this:&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-13-1&#34;&gt;&lt;a id=&#34;__codelineno-13-1&#34; name=&#34;__codelineno-13-1&#34; href=&#34;#__codelineno-13-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kd&#34;&gt;private&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;static&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;final&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Logger&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LoggerFactory&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getLogger&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MyPlugin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;class&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Using this logger instance is very similar to using the &lt;a href=&#34;#plugin-logger&#34;&gt;plugin logger&lt;/a&gt;, but there are some differences.&lt;/p&gt;&lt;p&gt;Let&#39;s look at basic logging first.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-14-1&#34;&gt;&lt;a id=&#34;__codelineno-14-1&#34; name=&#34;__codelineno-14-1&#34; href=&#34;#__codelineno-14-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;This is a info&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-14-2&#34;&gt;&lt;a id=&#34;__codelineno-14-2&#34; name=&#34;__codelineno-14-2&#34; href=&#34;#__codelineno-14-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;warn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;This is a warning&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-14-3&#34;&gt;&lt;a id=&#34;__codelineno-14-3&#34; name=&#34;__codelineno-14-3&#34; href=&#34;#__codelineno-14-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;This is an error&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-15-1&#34;&gt;&lt;a id=&#34;__codelineno-15-1&#34; name=&#34;__codelineno-15-1&#34; href=&#34;#__codelineno-15-1&#34;&gt;&lt;/a&gt;[16:32:03 INFO]: [dev.chojo.myplugin.MyPlugin] This is a info&lt;/span&gt;&lt;span id=&#34;__span-15-2&#34;&gt;&lt;a id=&#34;__codelineno-15-2&#34; name=&#34;__codelineno-15-2&#34; href=&#34;#__codelineno-15-2&#34;&gt;&lt;/a&gt;[16:32:03 WARN]: [dev.chojo.myplugin.MyPlugin] This is a warning&lt;/span&gt;&lt;span id=&#34;__span-15-3&#34;&gt;&lt;a id=&#34;__codelineno-15-3&#34; name=&#34;__codelineno-15-3&#34; href=&#34;#__codelineno-15-3&#34;&gt;&lt;/a&gt;[16:32:03 ERROR]: [dev.chojo.myplugin.MyPlugin] This is an error&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can see that we now have the plugin class as a prefix to our message.Instead of &lt;code&gt;warning&lt;/code&gt; we now use &lt;code&gt;warn&lt;/code&gt; and instead of &lt;code&gt;severe&lt;/code&gt; we use &lt;code&gt;error&lt;/code&gt;.&lt;/p&gt;&lt;h4 id=&#34;logging-exceptions_1&#34;&gt;Logging exceptions&lt;/h4&gt;&lt;p&gt;Logging exceptions is easier with slf4j.All we need to do is pass it as a second argument after our message.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-16-1&#34;&gt;&lt;a id=&#34;__codelineno-16-1&#34; name=&#34;__codelineno-16-1&#34; href=&#34;#__codelineno-16-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-2&#34;&gt;&lt;a id=&#34;__codelineno-16-2&#34; name=&#34;__codelineno-16-2&#34; href=&#34;#__codelineno-16-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;new&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RuntimeException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;This is not good&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-3&#34;&gt;&lt;a id=&#34;__codelineno-16-3&#34; name=&#34;__codelineno-16-3&#34; href=&#34;#__codelineno-16-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Exception&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-4&#34;&gt;&lt;a id=&#34;__codelineno-16-4&#34; name=&#34;__codelineno-16-4&#34; href=&#34;#__codelineno-16-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Something went wrong&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-5&#34;&gt;&lt;a id=&#34;__codelineno-16-5&#34; name=&#34;__codelineno-16-5&#34; href=&#34;#__codelineno-16-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The output remains the same as with &lt;a href=&#34;#plugin-logger&#34;&gt;plugin logger&lt;/a&gt;, except that we now have the class prefix again.&lt;/p&gt;&lt;details&gt;&lt;summary&gt;Output&lt;/summary&gt;&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-17-1&#34;&gt;&lt;a id=&#34;__codelineno-17-1&#34; name=&#34;__codelineno-17-1&#34; href=&#34;#__codelineno-17-1&#34;&gt;&lt;/a&gt;[16:34:49 ERROR]: [dev.chojo.myplugin.MyPlugin] Something went wrong&lt;/span&gt;&lt;span id=&#34;__span-17-2&#34;&gt;&lt;a id=&#34;__codelineno-17-2&#34; name=&#34;__codelineno-17-2&#34; href=&#34;#__codelineno-17-2&#34;&gt;&lt;/a&gt;java.lang.RuntimeException: This is not good&lt;/span&gt;&lt;span id=&#34;__span-17-3&#34;&gt;&lt;a id=&#34;__codelineno-17-3&#34; name=&#34;__codelineno-17-3&#34; href=&#34;#__codelineno-17-3&#34;&gt;&lt;/a&gt; at dev.chojo.myplugin.MyPlugin.onEnable(MyPlugin.java:40) ~[myplugin-1.0.0.jar:?]&lt;/span&gt;&lt;span id=&#34;__span-17-4&#34;&gt;&lt;a id=&#34;__codelineno-17-4&#34; name=&#34;__codelineno-17-4&#34; href=&#34;#__codelineno-17-4&#34;&gt;&lt;/a&gt; at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:281) ~[paper-api-1.20.1-R0.1-SNAPSHOT.jar:?]&lt;/span&gt;&lt;span id=&#34;__span-17-5&#34;&gt;&lt;a id=&#34;__codelineno-17-5&#34; name=&#34;__codelineno-17-5&#34; href=&#34;#__codelineno-17-5&#34;&gt;&lt;/a&gt; at io.papermc.paper.plugin.manager.PaperPluginInstanceManager.enablePlugin(PaperPluginInstanceManager.java:189) ~[paper-1.20.1.jar:git-Paper-117]&lt;/span&gt;&lt;span id=&#34;__span-17-6&#34;&gt;&lt;a id=&#34;__codelineno-17-6&#34; name=&#34;__codelineno-17-6&#34; href=&#34;#__codelineno-17-6&#34;&gt;&lt;/a&gt; at io.papermc.paper.plugin.manager.PaperPluginManagerImpl.enablePlugin(PaperPluginManagerImpl.java:104) ~[paper-1.20.1.jar:git-Paper-117]&lt;/span&gt;&lt;span id=&#34;__span-17-7&#34;&gt;&lt;a id=&#34;__codelineno-17-7&#34; name=&#34;__codelineno-17-7&#34; href=&#34;#__codelineno-17-7&#34;&gt;&lt;/a&gt; at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:507) ~[paper-api-1.20.1-R0.1-SNAPSHOT.jar:?]&lt;/span&gt;&lt;span id=&#34;__span-17-8&#34;&gt;&lt;a id=&#34;__codelineno-17-8&#34; name=&#34;__codelineno-17-8&#34; href=&#34;#__codelineno-17-8&#34;&gt;&lt;/a&gt; at org.bukkit.craftbukkit.v1_20_R1.CraftServer.enablePlugin(CraftServer.java:640) ~[paper-1.20.1.jar:git-Paper-117]&lt;/span&gt;&lt;span id=&#34;__span-17-9&#34;&gt;&lt;a id=&#34;__codelineno-17-9&#34; name=&#34;__codelineno-17-9&#34; href=&#34;#__codelineno-17-9&#34;&gt;&lt;/a&gt; at org.bukkit.craftbukkit.v1_20_R1.CraftServer.enablePlugins(CraftServer.java:551) ~[paper-1.20.1.jar:git-Paper-117]&lt;/span&gt;&lt;span id=&#34;__span-17-10&#34;&gt;&lt;a id=&#34;__codelineno-17-10&#34; name=&#34;__codelineno-17-10&#34; href=&#34;#__codelineno-17-10&#34;&gt;&lt;/a&gt; at net.minecraft.server.MinecraftServer.loadWorld0(MinecraftServer.java:636) ~[paper-1.20.1.jar:git-Paper-117]&lt;/span&gt;&lt;span id=&#34;__span-17-11&#34;&gt;&lt;a id=&#34;__codelineno-17-11&#34; name=&#34;__codelineno-17-11&#34; href=&#34;#__codelineno-17-11&#34;&gt;&lt;/a&gt; at net.minecraft.server.MinecraftServer.loadLevel(MinecraftServer.java:435) ~[paper-1.20.1.jar:git-Paper-117]&lt;/span&gt;&lt;span id=&#34;__span-17-12&#34;&gt;&lt;a id=&#34;__codelineno-17-12&#34; name=&#34;__codelineno-17-12&#34; href=&#34;#__codelineno-17-12&#34;&gt;&lt;/a&gt; at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:308) ~[paper-1.20.1.jar:git-Paper-117]&lt;/span&gt;&lt;span id=&#34;__span-17-13&#34;&gt;&lt;a id=&#34;__codelineno-17-13&#34; name=&#34;__codelineno-17-13&#34; href=&#34;#__codelineno-17-13&#34;&gt;&lt;/a&gt; at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1101) ~[paper-1.20.1.jar:git-Paper-117]&lt;/span&gt;&lt;span id=&#34;__span-17-14&#34;&gt;&lt;a id=&#34;__codelineno-17-14&#34; name=&#34;__codelineno-17-14&#34; href=&#34;#__codelineno-17-14&#34;&gt;&lt;/a&gt; at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:318) ~[paper-1.20.1.jar:git-Paper-117]&lt;/span&gt;&lt;span id=&#34;__span-17-15&#34;&gt;&lt;a id=&#34;__codelineno-17-15&#34; name=&#34;__codelineno-17-15&#34; href=&#34;#__codelineno-17-15&#34;&gt;&lt;/a&gt; at java.lang.Thread.run(Thread.java:833) ~[?:?]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;h4 id=&#34;using-placeholders-in-messages&#34;&gt;Using placeholders in messages&lt;/h4&gt;&lt;p&gt;slf4j has a nice feature for placeholders.To add additional information to your message, you can define placeholders with &lt;code&gt;{}&lt;/code&gt; and pass the values after your message in the correct order.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-18-1&#34;&gt;&lt;a id=&#34;__codelineno-18-1&#34; name=&#34;__codelineno-18-1&#34; href=&#34;#__codelineno-18-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;info&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Hello {}. How was your {}? Is it already past {}?&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Chojo&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;day&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-19-1&#34;&gt;&lt;a id=&#34;__codelineno-19-1&#34; name=&#34;__codelineno-19-1&#34; href=&#34;#__codelineno-19-1&#34;&gt;&lt;/a&gt;[16:39:49 INFO]: [dev.chojo.myplugin.MyPlugin] Hello Chojo. How was your day? Is it already past 2?&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can see that the values are simply inserted into your message.&lt;/p&gt;&lt;p&gt;This also works with exceptions.Just make sure that your last argument is the exception itself, and that any replacements are specified first.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-20-1&#34;&gt;&lt;a id=&#34;__codelineno-20-1&#34; name=&#34;__codelineno-20-1&#34; href=&#34;#__codelineno-20-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;first&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-20-2&#34;&gt;&lt;a id=&#34;__codelineno-20-2&#34; name=&#34;__codelineno-20-2&#34; href=&#34;#__codelineno-20-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;second&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-20-3&#34;&gt;&lt;a id=&#34;__codelineno-20-3&#34; name=&#34;__codelineno-20-3&#34; href=&#34;#__codelineno-20-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-20-4&#34;&gt;&lt;a id=&#34;__codelineno-20-4&#34; name=&#34;__codelineno-20-4&#34; href=&#34;#__codelineno-20-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kd&#34;&gt;var&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;result&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;first&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;second&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-20-5&#34;&gt;&lt;a id=&#34;__codelineno-20-5&#34; name=&#34;__codelineno-20-5&#34; href=&#34;#__codelineno-20-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Exception&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-20-6&#34;&gt;&lt;a id=&#34;__codelineno-20-6&#34; name=&#34;__codelineno-20-6&#34; href=&#34;#__codelineno-20-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;I tried to divide {} through {} and it went up in flames&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;first&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;second&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-20-7&#34;&gt;&lt;a id=&#34;__codelineno-20-7&#34; name=&#34;__codelineno-20-7&#34; href=&#34;#__codelineno-20-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-21-1&#34;&gt;&lt;a id=&#34;__codelineno-21-1&#34; name=&#34;__codelineno-21-1&#34; href=&#34;#__codelineno-21-1&#34;&gt;&lt;/a&gt;[16:39:49 ERROR]: [dev.chojo.myplugin.MyPlugin] I tried to divide 5 through 0 and it went up in flames&lt;/span&gt;&lt;span id=&#34;__span-21-2&#34;&gt;&lt;a id=&#34;__codelineno-21-2&#34; name=&#34;__codelineno-21-2&#34; href=&#34;#__codelineno-21-2&#34;&gt;&lt;/a&gt;java.lang.ArithmeticException: / by zero&lt;/span&gt;&lt;span id=&#34;__span-21-3&#34;&gt;&lt;a id=&#34;__codelineno-21-3&#34; name=&#34;__codelineno-21-3&#34; href=&#34;#__codelineno-21-3&#34;&gt;&lt;/a&gt; at dev.chojo.myplugin.MyPlugin.onEnable(MyPlugin.java:51) ~[myplugin-1.0.0.jar:?]&lt;/span&gt;&lt;span id=&#34;__span-21-4&#34;&gt;&lt;a id=&#34;__codelineno-21-4&#34; name=&#34;__codelineno-21-4&#34; href=&#34;#__codelineno-21-4&#34;&gt;&lt;/a&gt; at ... #Shortened by me&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Works like a charm and makes it very easy to add extra information to your output message!&lt;/p&gt;&lt;h2 id=&#34;adding-a-prefix&#34;&gt;Adding a prefix&lt;/h2&gt;&lt;p&gt;While adding a prefix when using any of the methods in the &lt;a href=&#34;#donts&#34;&gt;don&#39;t&lt;/a&gt; section might help a bit, it&#39;s still bad.Why use a bad way when there are good ways.&lt;/p&gt;&lt;h2 id=&#34;thank-you&#34;&gt;Thank you!&lt;/h2&gt;&lt;p&gt;Now you know how to log into your Minecraft project properly!&lt;/p&gt;&lt;p&gt;Thanks for reading!If you liked this post, or have some questions, feel free to come by my discord and have a chat!&lt;/p&gt;&lt;p&gt;&lt;a href=&#34;https://discord.chojo.dev&#34;&gt;&lt;img alt=&#34;Discord Server invite for Chojos Coding Hell&#34; src=&#34;https://discordapp.com/api/guilds/1120671561368748092/widget.png?style=banner3&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Or write me a mail at &lt;code&gt;mail [at] chojo [dot] dev&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;If you want to support me, feel free to sponsor me via &lt;a href=&#34;https://github.com/sponsors/rainbowdashlabs&#34;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</description><link>https://chojo.dev/blog/2023/08/10/logging-in-minecraft---the-good-and-better-way/</link> <pubDate>Thu, 10 Aug 2023 15:11:20 +0200</pubDate><source url="https://chojo.dev/feed_rss_created.xml">Chojo - Dev Blog and Portfolio</source><guid isPermaLink="true">https://chojo.dev/blog/2023/08/10/logging-in-minecraft---the-good-and-better-way/</guid> </item> <item> <title>Redirecting to an external domain with traefik</title> <author>chojo</author> <description>&lt;h1 id=&#34;redirecting-to-an-external-domain-with-traefik&#34;&gt;Redirecting to an external domain with traefik&lt;/h1&gt;&lt;p&gt;&lt;a href=&#34;../../../../de/docker_traefik_redirect/&#34;&gt;German Version&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Welcome to another blog post!This time we will look at how to redirect to an external url using &lt;a href=&#34;https://doc.traefik.io/traefik/&#34;&gt;traefik&lt;/a&gt; without using a container.Docker is completely optional, but I run my traefik with docker, so I will refer to that as well.This should also work with others, but I have not tested or done so yet.&lt;/p&gt;&lt;!-- more --&gt;&lt;h2 id=&#34;setting-up-the-file-provider&#34;&gt;Setting up the file provider&lt;/h2&gt;&lt;p&gt;To inject our redirects into traefik we will use the &lt;a href=&#34;https://doc.traefik.io/traefik/providers/file/&#34;&gt;file provider&lt;/a&gt;.To do this we need to do two things&lt;/p&gt;&lt;h3 id=&#34;create-a-file-provider-directory&#34;&gt;Create a file provider directory&lt;/h3&gt;&lt;p&gt;Create a new directory &lt;code&gt;provider&lt;/code&gt; next to your &lt;a href=&#34;https://docs.docker.com/compose/compose-file/compose-file-v3/&#34;&gt;compose file&lt;/a&gt; and mount it into your container.&lt;/p&gt;&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt; volumes:&lt;/span&gt;&lt;span id=&#34;__span-0-2&#34;&gt;&lt;a id=&#34;__codelineno-0-2&#34; name=&#34;__codelineno-0-2&#34; href=&#34;#__codelineno-0-2&#34;&gt;&lt;/a&gt; - &amp;quot;./provider/:/provider/&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;enabling-the-file-provider-in-the-configuration&#34;&gt;Enabling the file provider in the configuration&lt;/h3&gt;&lt;p&gt;Now we need to modify our &lt;code&gt;traefik.yaml&lt;/code&gt; and add a &lt;a href=&#34;https://doc.traefik.io/traefik/providers/file/&#34;&gt;file provider&lt;/a&gt;.&lt;/p&gt;&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-1-1&#34;&gt;&lt;a id=&#34;__codelineno-1-1&#34; name=&#34;__codelineno-1-1&#34; href=&#34;#__codelineno-1-1&#34;&gt;&lt;/a&gt;providers:&lt;/span&gt;&lt;span id=&#34;__span-1-2&#34;&gt;&lt;a id=&#34;__codelineno-1-2&#34; name=&#34;__codelineno-1-2&#34; href=&#34;#__codelineno-1-2&#34;&gt;&lt;/a&gt; file:&lt;/span&gt;&lt;span id=&#34;__span-1-3&#34;&gt;&lt;a id=&#34;__codelineno-1-3&#34; name=&#34;__codelineno-1-3&#34; href=&#34;#__codelineno-1-3&#34;&gt;&lt;/a&gt; directory: &amp;quot;/provider/&amp;quot;&lt;/span&gt;&lt;span id=&#34;__span-1-4&#34;&gt;&lt;a id=&#34;__codelineno-1-4&#34; name=&#34;__codelineno-1-4&#34; href=&#34;#__codelineno-1-4&#34;&gt;&lt;/a&gt; watch: true&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will make traefik watch every file in our provider directory.This allows us to use multiple files to group our providers and keep them more organised.Traefik will also watch for changes to our providers, so as soon as we edit, create or delete a file, those changes will instantly affect traefik&#39;s routing.&lt;/p&gt;&lt;div class=&#34;admonition warning&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Warning&lt;/p&gt;&lt;p&gt;Traefik only monitors files in the root directory, so you cannot use subdirectories.&lt;/p&gt;&lt;/div&gt;&lt;div class=&#34;admonition warning&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Warning&lt;/p&gt;&lt;p&gt;Do not forget to restart your traefik container.&lt;/p&gt;&lt;/div&gt;&lt;h2 id=&#34;creating-a-redirect&#34;&gt;Creating a redirect&lt;/h2&gt;&lt;p&gt;To create a redirect we need two things, a &lt;code&gt;redirectRegex&lt;/code&gt; &lt;a href=&#34;https://doc.traefik.io/traefik/middlewares/http/redirectregex/&#34;&gt;middleware&lt;/a&gt; and a &lt;a href=&#34;https://doc.traefik.io/traefik/routing/routers/&#34;&gt;router&lt;/a&gt; to accept the requests.For this we will create a file &lt;code&gt;redirect.yml&lt;/code&gt; (the name can be anything) in our new &lt;code&gt;provider&lt;/code&gt; directory.&lt;/p&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;Alternatively you can create one file for each redirect.A shell script for this can be found &lt;a href=&#34;#using-a-shell-script-to-create-redirects&#34;&gt;below&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;h3 id=&#34;setting-up-the-redirectregex-middleware&#34;&gt;Setting up the redirectRegex middleware&lt;/h3&gt;&lt;div class=&#34;language-yaml highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-2-1&#34;&gt;&lt;a id=&#34;__codelineno-2-1&#34; name=&#34;__codelineno-2-1&#34; href=&#34;#__codelineno-2-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nt&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-2&#34;&gt;&lt;a id=&#34;__codelineno-2-2&#34; name=&#34;__codelineno-2-2&#34; href=&#34;#__codelineno-2-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;middlewares&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# (1)!&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-3&#34;&gt;&lt;a id=&#34;__codelineno-2-3&#34; name=&#34;__codelineno-2-3&#34; href=&#34;#__codelineno-2-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;chojo-dev-redirect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# (2)!&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-4&#34;&gt;&lt;a id=&#34;__codelineno-2-4&#34; name=&#34;__codelineno-2-4&#34; href=&#34;#__codelineno-2-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;redirectRegex&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# (3)!&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-5&#34;&gt;&lt;a id=&#34;__codelineno-2-5&#34; name=&#34;__codelineno-2-5&#34; href=&#34;#__codelineno-2-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;regex&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;(.*)&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# (4)!&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-6&#34;&gt;&lt;a id=&#34;__codelineno-2-6&#34; name=&#34;__codelineno-2-6&#34; href=&#34;#__codelineno-2-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;replacement&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;https://chojo.dev/&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# (5)!&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-2-7&#34;&gt;&lt;a id=&#34;__codelineno-2-7&#34; name=&#34;__codelineno-2-7&#34; href=&#34;#__codelineno-2-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;permanent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# (6)!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;We create middlewares, so we use the middleware section.&lt;/li&gt;&lt;li&gt;Define a new middleware with the name &lt;code&gt;chojo-dev-redirect&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Define the type of the middleware as &lt;code&gt;redirectRegex&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;Define the regex pattern as &lt;code&gt;(.*)&lt;/code&gt;, which will basically match anything. This is the part of the url we want to replace.So we really want to replace all of the string.&lt;/li&gt;&lt;li&gt;Define the new url we want to redirect to.&lt;/li&gt;&lt;li&gt;Mark the redirect as temporary.This will prevent the browser from caching, and changes to our redirect will take effect immediately.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;If you want to know what each line does, look at the comments.&lt;/p&gt;&lt;h3 id=&#34;setting-up-the-router&#34;&gt;Setting up the router&lt;/h3&gt;&lt;p&gt;Every router needs a service to which it is connected.Of course, we could use Docker to start a service for each of our redirections, or we could start a single service and reuse it.Luckily traefik already has us covered and offers a service for exactly this use case called &lt;code&gt;noop@internal&lt;/code&gt;.&lt;/p&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;The &lt;code&gt;middlewares&lt;/code&gt; section is still there, I&#39;m just not showing it.&lt;/p&gt;&lt;/div&gt;&lt;div class=&#34;language-yaml highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-3-1&#34;&gt;&lt;a id=&#34;__codelineno-3-1&#34; name=&#34;__codelineno-3-1&#34; href=&#34;#__codelineno-3-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nt&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-2&#34;&gt;&lt;a id=&#34;__codelineno-3-2&#34; name=&#34;__codelineno-3-2&#34; href=&#34;#__codelineno-3-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;routers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# (1)!&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-3&#34;&gt;&lt;a id=&#34;__codelineno-3-3&#34; name=&#34;__codelineno-3-3&#34; href=&#34;#__codelineno-3-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;chojo-dev-redirect&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# (2)!&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-4&#34;&gt;&lt;a id=&#34;__codelineno-3-4&#34; name=&#34;__codelineno-3-4&#34; href=&#34;#__codelineno-3-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;service&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;noop@internal&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# (3)!&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-5&#34;&gt;&lt;a id=&#34;__codelineno-3-5&#34; name=&#34;__codelineno-3-5&#34; href=&#34;#__codelineno-3-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;entrypoints&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;https&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# (4)!&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-6&#34;&gt;&lt;a id=&#34;__codelineno-3-6&#34; name=&#34;__codelineno-3-6&#34; href=&#34;#__codelineno-3-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;rule&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;Host(`my.host.com`)&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# (5)!&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-7&#34;&gt;&lt;a id=&#34;__codelineno-3-7&#34; name=&#34;__codelineno-3-7&#34; href=&#34;#__codelineno-3-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;middlewares&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;chojo-dev-redirect&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# (6)!&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-8&#34;&gt;&lt;a id=&#34;__codelineno-3-8&#34; name=&#34;__codelineno-3-8&#34; href=&#34;#__codelineno-3-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;tls&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-3-9&#34;&gt;&lt;a id=&#34;__codelineno-3-9&#34; name=&#34;__codelineno-3-9&#34; href=&#34;#__codelineno-3-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;certresolver&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l l-Scalar l-Scalar-Plain&#34;&gt;my_cert_resolver&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;# (7)!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;We are going to create a router, so we will use the routers section.&lt;/li&gt;&lt;li&gt;Define a new router called &lt;code&gt;chojo-dev-redirect&lt;/code&gt;. I recommend using the same name as the middleware, but it is not required.&lt;/li&gt;&lt;li&gt;Add the &lt;code&gt;noop@internal&lt;/code&gt; service to our router.&lt;/li&gt;&lt;li&gt;Assign the &lt;code&gt;https&lt;/code&gt; &lt;code&gt;entrypoint&lt;/code&gt;. This may vary depending on your setup.&lt;/li&gt;&lt;li&gt;Assign the rule to our host&lt;/li&gt;&lt;li&gt;Assign the redirect middleware we defined earlier&lt;/li&gt;&lt;li&gt;Assign our cert resolver to the assigned rule&lt;/li&gt;&lt;/ol&gt;&lt;div class=&#34;admonition warning&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Warning&lt;/p&gt;&lt;p&gt;Make sure you adapt &lt;code&gt;entrypoint&lt;/code&gt;, &lt;code&gt;rule&lt;/code&gt; and &lt;code&gt;certresolver&lt;/code&gt; to your needs!&lt;/p&gt;&lt;/div&gt;&lt;p&gt;This will create our service.Anything matching our rule will now be redirected to the domain defined in the redirect middleware.&lt;/p&gt;&lt;h2 id=&#34;using-a-shell-script-to-create-redirects&#34;&gt;Using a shell script to create redirects.&lt;/h2&gt;&lt;p&gt;I use a bash script to create my redirects.&lt;/p&gt;&lt;details&gt;&lt;summary&gt;Script&lt;/summary&gt;&lt;div class=&#34;language-shell highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-4-1&#34;&gt;&lt;a id=&#34;__codelineno-4-1&#34; name=&#34;__codelineno-4-1&#34; href=&#34;#__codelineno-4-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ch&#34;&gt;#!/usr/bin/env sh&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-2&#34;&gt;&lt;a id=&#34;__codelineno-4-2&#34; name=&#34;__codelineno-4-2&#34; href=&#34;#__codelineno-4-2&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-3&#34;&gt;&lt;a id=&#34;__codelineno-4-3&#34; name=&#34;__codelineno-4-3&#34; href=&#34;#__codelineno-4-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;read&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-rp&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Enter the name for the router and middleware: &amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;NAME&lt;/span&gt;&lt;span id=&#34;__span-4-4&#34;&gt;&lt;a id=&#34;__codelineno-4-4&#34; name=&#34;__codelineno-4-4&#34; href=&#34;#__codelineno-4-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-z&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$NAME&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-5&#34;&gt;&lt;a id=&#34;__codelineno-4-5&#34; name=&#34;__codelineno-4-5&#34; href=&#34;#__codelineno-4-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Name cannot be empty. Exiting...&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-6&#34;&gt;&lt;a id=&#34;__codelineno-4-6&#34; name=&#34;__codelineno-4-6&#34; href=&#34;#__codelineno-4-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-7&#34;&gt;&lt;a id=&#34;__codelineno-4-7&#34; name=&#34;__codelineno-4-7&#34; href=&#34;#__codelineno-4-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-8&#34;&gt;&lt;a id=&#34;__codelineno-4-8&#34; name=&#34;__codelineno-4-8&#34; href=&#34;#__codelineno-4-8&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-9&#34;&gt;&lt;a id=&#34;__codelineno-4-9&#34; name=&#34;__codelineno-4-9&#34; href=&#34;#__codelineno-4-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;read&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-rp&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Enter the target URL you want to redirect to: &amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;TARGET&lt;/span&gt;&lt;span id=&#34;__span-4-10&#34;&gt;&lt;a id=&#34;__codelineno-4-10&#34; name=&#34;__codelineno-4-10&#34; href=&#34;#__codelineno-4-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-z&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$TARGET&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-11&#34;&gt;&lt;a id=&#34;__codelineno-4-11&#34; name=&#34;__codelineno-4-11&#34; href=&#34;#__codelineno-4-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Target URL cannot be empty. Exiting...&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-12&#34;&gt;&lt;a id=&#34;__codelineno-4-12&#34; name=&#34;__codelineno-4-12&#34; href=&#34;#__codelineno-4-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-13&#34;&gt;&lt;a id=&#34;__codelineno-4-13&#34; name=&#34;__codelineno-4-13&#34; href=&#34;#__codelineno-4-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-14&#34;&gt;&lt;a id=&#34;__codelineno-4-14&#34; name=&#34;__codelineno-4-14&#34; href=&#34;#__codelineno-4-14&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-15&#34;&gt;&lt;a id=&#34;__codelineno-4-15&#34; name=&#34;__codelineno-4-15&#34; href=&#34;#__codelineno-4-15&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;read&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-rp&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Enter the host that should be redirected: &amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;HOST&lt;/span&gt;&lt;span id=&#34;__span-4-16&#34;&gt;&lt;a id=&#34;__codelineno-4-16&#34; name=&#34;__codelineno-4-16&#34; href=&#34;#__codelineno-4-16&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-z&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$HOST&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-17&#34;&gt;&lt;a id=&#34;__codelineno-4-17&#34; name=&#34;__codelineno-4-17&#34; href=&#34;#__codelineno-4-17&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Host cannot be empty. Exiting...&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-18&#34;&gt;&lt;a id=&#34;__codelineno-4-18&#34; name=&#34;__codelineno-4-18&#34; href=&#34;#__codelineno-4-18&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-19&#34;&gt;&lt;a id=&#34;__codelineno-4-19&#34; name=&#34;__codelineno-4-19&#34; href=&#34;#__codelineno-4-19&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-20&#34;&gt;&lt;a id=&#34;__codelineno-4-20&#34; name=&#34;__codelineno-4-20&#34; href=&#34;#__codelineno-4-20&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-21&#34;&gt;&lt;a id=&#34;__codelineno-4-21&#34; name=&#34;__codelineno-4-21&#34; href=&#34;#__codelineno-4-21&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;read&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-rp&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Enter the cert resolver: &amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;CERT&lt;/span&gt;&lt;span id=&#34;__span-4-22&#34;&gt;&lt;a id=&#34;__codelineno-4-22&#34; name=&#34;__codelineno-4-22&#34; href=&#34;#__codelineno-4-22&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-z&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$CERT&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-23&#34;&gt;&lt;a id=&#34;__codelineno-4-23&#34; name=&#34;__codelineno-4-23&#34; href=&#34;#__codelineno-4-23&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Cert resolver cannot be empty. Exiting...&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-24&#34;&gt;&lt;a id=&#34;__codelineno-4-24&#34; name=&#34;__codelineno-4-24&#34; href=&#34;#__codelineno-4-24&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-25&#34;&gt;&lt;a id=&#34;__codelineno-4-25&#34; name=&#34;__codelineno-4-25&#34; href=&#34;#__codelineno-4-25&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-26&#34;&gt;&lt;a id=&#34;__codelineno-4-26&#34; name=&#34;__codelineno-4-26&#34; href=&#34;#__codelineno-4-26&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-27&#34;&gt;&lt;a id=&#34;__codelineno-4-27&#34; name=&#34;__codelineno-4-27&#34; href=&#34;#__codelineno-4-27&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;read&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;-rp&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Do you want the redirection to be permanent? [y/N]: &amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;PERMANENT_INPUT&lt;/span&gt;&lt;span id=&#34;__span-4-28&#34;&gt;&lt;a id=&#34;__codelineno-4-28&#34; name=&#34;__codelineno-4-28&#34; href=&#34;#__codelineno-4-28&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nv&#34;&gt;PERMANENT_INPUT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PERMANENT_INPUT&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;:-&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-29&#34;&gt;&lt;a id=&#34;__codelineno-4-29&#34; name=&#34;__codelineno-4-29&#34; href=&#34;#__codelineno-4-29&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-30&#34;&gt;&lt;a id=&#34;__codelineno-4-30&#34; name=&#34;__codelineno-4-30&#34; href=&#34;#__codelineno-4-30&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nv&#34;&gt;PERMANENT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;false&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-31&#34;&gt;&lt;a id=&#34;__codelineno-4-31&#34; name=&#34;__codelineno-4-31&#34; href=&#34;#__codelineno-4-31&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-32&#34;&gt;&lt;a id=&#34;__codelineno-4-32&#34; name=&#34;__codelineno-4-32&#34; href=&#34;#__codelineno-4-32&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PERMANENT_INPUT&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;y&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;||&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PERMANENT_INPUT&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Y&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-33&#34;&gt;&lt;a id=&#34;__codelineno-4-33&#34; name=&#34;__codelineno-4-33&#34; href=&#34;#__codelineno-4-33&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PERMANENT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-34&#34;&gt;&lt;a id=&#34;__codelineno-4-34&#34; name=&#34;__codelineno-4-34&#34; href=&#34;#__codelineno-4-34&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;elif&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PERMANENT_INPUT&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;!&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;n&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PERMANENT_INPUT&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;!&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;N&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-35&#34;&gt;&lt;a id=&#34;__codelineno-4-35&#34; name=&#34;__codelineno-4-35&#34; href=&#34;#__codelineno-4-35&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;Invalid input for permanent value.&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-36&#34;&gt;&lt;a id=&#34;__codelineno-4-36&#34; name=&#34;__codelineno-4-36&#34; href=&#34;#__codelineno-4-36&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-37&#34;&gt;&lt;a id=&#34;__codelineno-4-37&#34; name=&#34;__codelineno-4-37&#34; href=&#34;#__codelineno-4-37&#34;&gt;&lt;/a&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-38&#34;&gt;&lt;a id=&#34;__codelineno-4-38&#34; name=&#34;__codelineno-4-38&#34; href=&#34;#__codelineno-4-38&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-39&#34;&gt;&lt;a id=&#34;__codelineno-4-39&#34; name=&#34;__codelineno-4-39&#34; href=&#34;#__codelineno-4-39&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nv&#34;&gt;TEXT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;http:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-40&#34;&gt;&lt;a id=&#34;__codelineno-4-40&#34; name=&#34;__codelineno-4-40&#34; href=&#34;#__codelineno-4-40&#34;&gt;&lt;/a&gt;&lt;span class=&#34;s2&#34;&gt; middlewares:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-41&#34;&gt;&lt;a id=&#34;__codelineno-4-41&#34; name=&#34;__codelineno-4-41&#34; href=&#34;#__codelineno-4-41&#34;&gt;&lt;/a&gt;&lt;span class=&#34;s2&#34;&gt; &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;NAME&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;-redirect:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-42&#34;&gt;&lt;a id=&#34;__codelineno-4-42&#34; name=&#34;__codelineno-4-42&#34; href=&#34;#__codelineno-4-42&#34;&gt;&lt;/a&gt;&lt;span class=&#34;s2&#34;&gt; redirectRegex:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-43&#34;&gt;&lt;a id=&#34;__codelineno-4-43&#34; name=&#34;__codelineno-4-43&#34; href=&#34;#__codelineno-4-43&#34;&gt;&lt;/a&gt;&lt;span class=&#34;s2&#34;&gt; regex: \&amp;quot;(.*)\&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-44&#34;&gt;&lt;a id=&#34;__codelineno-4-44&#34; name=&#34;__codelineno-4-44&#34; href=&#34;#__codelineno-4-44&#34;&gt;&lt;/a&gt;&lt;span class=&#34;s2&#34;&gt; replacement: \&amp;quot;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;TARGET&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-45&#34;&gt;&lt;a id=&#34;__codelineno-4-45&#34; name=&#34;__codelineno-4-45&#34; href=&#34;#__codelineno-4-45&#34;&gt;&lt;/a&gt;&lt;span class=&#34;s2&#34;&gt; permanent: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PERMANENT&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-46&#34;&gt;&lt;a id=&#34;__codelineno-4-46&#34; name=&#34;__codelineno-4-46&#34; href=&#34;#__codelineno-4-46&#34;&gt;&lt;/a&gt;&lt;span class=&#34;s2&#34;&gt; routers:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-47&#34;&gt;&lt;a id=&#34;__codelineno-4-47&#34; name=&#34;__codelineno-4-47&#34; href=&#34;#__codelineno-4-47&#34;&gt;&lt;/a&gt;&lt;span class=&#34;s2&#34;&gt; &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;NAME&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;-redirect:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-48&#34;&gt;&lt;a id=&#34;__codelineno-4-48&#34; name=&#34;__codelineno-4-48&#34; href=&#34;#__codelineno-4-48&#34;&gt;&lt;/a&gt;&lt;span class=&#34;s2&#34;&gt; service: noop@internal&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-49&#34;&gt;&lt;a id=&#34;__codelineno-4-49&#34; name=&#34;__codelineno-4-49&#34; href=&#34;#__codelineno-4-49&#34;&gt;&lt;/a&gt;&lt;span class=&#34;s2&#34;&gt; entrypoints: \&amp;quot;https\&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-50&#34;&gt;&lt;a id=&#34;__codelineno-4-50&#34; name=&#34;__codelineno-4-50&#34; href=&#34;#__codelineno-4-50&#34;&gt;&lt;/a&gt;&lt;span class=&#34;s2&#34;&gt; rule: \&amp;quot;Host(\`&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;HOST&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;\`)\&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-51&#34;&gt;&lt;a id=&#34;__codelineno-4-51&#34; name=&#34;__codelineno-4-51&#34; href=&#34;#__codelineno-4-51&#34;&gt;&lt;/a&gt;&lt;span class=&#34;s2&#34;&gt; middlewares: \&amp;quot;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;NAME&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;-redirect\&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-52&#34;&gt;&lt;a id=&#34;__codelineno-4-52&#34; name=&#34;__codelineno-4-52&#34; href=&#34;#__codelineno-4-52&#34;&gt;&lt;/a&gt;&lt;span class=&#34;s2&#34;&gt; tls:&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-53&#34;&gt;&lt;a id=&#34;__codelineno-4-53&#34; name=&#34;__codelineno-4-53&#34; href=&#34;#__codelineno-4-53&#34;&gt;&lt;/a&gt;&lt;span class=&#34;s2&#34;&gt; certresolver: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;CERT&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-54&#34;&gt;&lt;a id=&#34;__codelineno-4-54&#34; name=&#34;__codelineno-4-54&#34; href=&#34;#__codelineno-4-54&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-55&#34;&gt;&lt;a id=&#34;__codelineno-4-55&#34; name=&#34;__codelineno-4-55&#34; href=&#34;#__codelineno-4-55&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$TEXT&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&amp;gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;NAME&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;-redirect.yml&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-56&#34;&gt;&lt;a id=&#34;__codelineno-4-56&#34; name=&#34;__codelineno-4-56&#34; href=&#34;#__codelineno-4-56&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$TEXT&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-4-57&#34;&gt;&lt;a id=&#34;__codelineno-4-57&#34; name=&#34;__codelineno-4-57&#34; href=&#34;#__codelineno-4-57&#34;&gt;&lt;/a&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;quot;File &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;NAME&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;-redirect.yml created.&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;&lt;p&gt;You can get it with&lt;/p&gt;&lt;div class=&#34;language-sh highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-5-1&#34;&gt;&lt;a id=&#34;__codelineno-5-1&#34; name=&#34;__codelineno-5-1&#34; href=&#34;#__codelineno-5-1&#34;&gt;&lt;/a&gt;wget&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;https://chojo.dev/assets/files/redirect.sh&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;chmod&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;+x&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;redirect.sh&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;admonition warning&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Warning&lt;/p&gt;&lt;p&gt;Never run a bash script without looking at them!&lt;/p&gt;&lt;/div&gt;&lt;p&gt;The bash script creates a file for each redirect.This makes them easy to find.If you want to change it, just create it again with the same name.&lt;/p&gt;&lt;h2 id=&#34;thank-you&#34;&gt;Thank you&lt;/h2&gt;&lt;p&gt;Thanks for reading!If you liked this post, or have some questions, feel free to come by my discord and have a chat!&lt;/p&gt;&lt;p&gt;&lt;a href=&#34;https://discord.chojo.dev&#34;&gt;&lt;img alt=&#34;Discord Server invite for Chojos Coding Hell&#34; src=&#34;https://discordapp.com/api/guilds/1120671561368748092/widget.png?style=banner3&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Or write me a mail at &lt;code&gt;mail [at] chojo [dot] dev&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;If you want to support me, feel free to sponsor me via &lt;a href=&#34;https://github.com/sponsors/rainbowdashlabs&#34;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</description><link>https://chojo.dev/blog/2023/08/05/redirecting-to-an-external-domain-with-traefik/</link> <pubDate>Sat, 05 Aug 2023 10:38:40 +0200</pubDate><source url="https://chojo.dev/feed_rss_created.xml">Chojo - Dev Blog and Portfolio</source><guid isPermaLink="true">https://chojo.dev/blog/2023/08/05/redirecting-to-an-external-domain-with-traefik/</guid> </item> <item> <title>Minecraft Development with Gradle: Basic and Advanced | A guide</title> <author>chojo</author> <description>&lt;h1 id=&#34;minecraft-development-with-gradle-basic-and-advanced-a-guide&#34;&gt;Minecraft Development with Gradle: Basic and Advanced | A guide&lt;/h1&gt;&lt;p&gt;&lt;a href=&#34;../../../../de/gradle_minecraft_basic_and_advanced/&#34;&gt;German Version&lt;/a&gt;&lt;/p&gt;&lt;p&gt;This blog post is about developing Minecraft plugins for Paper and Spigot servers using Gradle.The Minecraft community has built a huge ecosystem for Minecraft around the Gradle build tool.Instead of throwing a sample Gradle file at you, we will go through this step by step.We will start with the basic Gradle layout, set up repositories and dependencies, and move on to plugins.&lt;/p&gt;&lt;!-- more --&gt;&lt;h2 id=&#34;what-is-gradle&#34;&gt;What is Gradle?&lt;/h2&gt;&lt;p&gt;Gradle is a project management system or build tool.It basically takes care of your build process, resolves dependencies, runs tests and can do all sorts of things, even start a Minecraft server.Gradle uses Kotlin or Groovy for the build file.I recommend using Kotlin.Where you need custom plugins in maven, you can simply write your own logic directly into the build file when using Gradle.But enough of examples, time to get started.&lt;/p&gt;&lt;h2 id=&#34;install-gradle&#34;&gt;Install Gradle&lt;/h2&gt;&lt;p&gt;If you haven&#39;t already installed Gradle, you should do so first.I will not go into detail on this as Gradle itself has great &lt;a href=&#34;https://gradle.org/install/&#34;&gt;documentation&lt;/a&gt; on this.We will only use Gradle to initialise the project, and then use the Gradle wrapper.&lt;/p&gt;&lt;h2 id=&#34;the-gradle-wrapper&#34;&gt;The Gradle wrapper&lt;/h2&gt;&lt;p&gt;The Gradle wrapper is essentially a portable Gradle installation.It does not require a Gradle installation on the system and can be used to build anywhere.This is why it has its own version.To update this version you only need one command:&lt;/p&gt;&lt;div class=&#34;language-shell highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;./gradlew&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;wrapper&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--gradle-version&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;9&lt;/span&gt;.5.1&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--distribution-type&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;bin&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This works on Unix systems as well as in Windows PowerShell or git bash.If you are using windows cmd, you will need to use &lt;code&gt;gradlew.bat&lt;/code&gt; instead.&lt;/p&gt;&lt;p&gt;Check the &lt;a href=&#34;https://gradle.org/releases/&#34;&gt;Gradle website&lt;/a&gt; for the latest version.&lt;/p&gt;&lt;h2 id=&#34;setting-up-a-gradle-project&#34;&gt;Setting up a Gradle project&lt;/h2&gt;&lt;div class=&#34;tabbed-set tabbed-alternate&#34; data-tabs=&#34;1:3&#34;&gt;&lt;input checked=&#34;checked&#34; id=&#34;__tabbed_1_1&#34; name=&#34;__tabbed_1&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_1_2&#34; name=&#34;__tabbed_1&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_1_3&#34; name=&#34;__tabbed_1&#34; type=&#34;radio&#34; /&gt;&lt;div class=&#34;tabbed-labels&#34;&gt;&lt;label for=&#34;__tabbed_1_1&#34;&gt;Using IntelliJ&lt;/label&gt;&lt;label for=&#34;__tabbed_1_2&#34;&gt;Using Eclipse&lt;/label&gt;&lt;label for=&#34;__tabbed_1_3&#34;&gt;Using CLI&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-content&#34;&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;&lt;img alt=&#34;img.png&#34; src=&#34;../../../../../assets/images/gradle_setup.png&#34; /&gt;&lt;/p&gt;&lt;p&gt;We will look at the marks one after another. Most of the settings will be set by default already.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;We select &lt;strong&gt;New Project&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;We add our project id aka name.&lt;br /&gt;This name is your &lt;strong&gt;plugin name in lower case&lt;/strong&gt; with &lt;code&gt;-&lt;/code&gt; where a space would be.&lt;br /&gt;So &lt;code&gt;MyPlugin&lt;/code&gt; becomes &lt;code&gt;my-plugin&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Make sure that a &lt;strong&gt;git repository&lt;/strong&gt; will be created&lt;/li&gt;&lt;li&gt;Select &lt;strong&gt;Java&lt;/strong&gt; as language or &lt;strong&gt;Kotlin&lt;/strong&gt; if you like this more, but I will only use Java here.&lt;/li&gt;&lt;li&gt;Select &lt;strong&gt;Gradle as build system&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Select &lt;strong&gt;Kotlin as Gradle DSL&lt;/strong&gt; &lt;/li&gt;&lt;li&gt;Let intellij add some sample code.&lt;br /&gt;This will be removed later, but will create the most important directories.&lt;/li&gt;&lt;li&gt;Select the wrapper as your Gradle distribution&lt;/li&gt;&lt;li&gt;Enter the latest Gradle version, as mentioned on the &lt;a href=&#34;https://gradle.org/releases/&#34;&gt;Gradle website&lt;/a&gt;.&lt;br /&gt;This may not be available to select in the drop down menu, but you can enter it yourself.&lt;/li&gt;&lt;li&gt;Enter your group id here.If you don&#39;t know what to write here have a log at my other &lt;a href=&#34;../../03/the-plugin-main-class-a-constant-naming-discussion/#1-namespace-conflicts&#34;&gt;post&lt;/a&gt;If you don&#39;t have a domain, see &lt;a href=&#34;../../03/the-plugin-main-class-a-constant-naming-discussion/#i-dont-have-a-domain&#34;&gt;here&lt;/a&gt;&lt;/li&gt;&lt;li&gt;This is the same as your name in &lt;strong&gt;2.&lt;/strong&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;Sorry Eclipse users.Time to use an actually good IDE.Switch to IntelliJ c:&lt;/p&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;If you already have a project, you can easily set it up from the command line.If your project is currently a Maven project, Gradle will offer to convert it to a Gradle project.&lt;/p&gt;&lt;p&gt;We will look at how to set up a new Gradle project without importing anything from Maven.&lt;/p&gt;&lt;p&gt;First we start by initialising Gradle with &lt;code&gt;Gradle init&lt;/code&gt;.We&#39;re using the installed version of Gradle for this, so you need to have it installed.&lt;/p&gt;&lt;p&gt;You will end up with this dialogue&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-1-1&#34;&gt;&lt;a id=&#34;__codelineno-1-1&#34; name=&#34;__codelineno-1-1&#34; href=&#34;#__codelineno-1-1&#34;&gt;&lt;/a&gt;Select type of project to generate:&lt;/span&gt;&lt;span id=&#34;__span-1-2&#34;&gt;&lt;a id=&#34;__codelineno-1-2&#34; name=&#34;__codelineno-1-2&#34; href=&#34;#__codelineno-1-2&#34;&gt;&lt;/a&gt; 1: basic&lt;/span&gt;&lt;span id=&#34;__span-1-3&#34;&gt;&lt;a id=&#34;__codelineno-1-3&#34; name=&#34;__codelineno-1-3&#34; href=&#34;#__codelineno-1-3&#34;&gt;&lt;/a&gt; 2: application&lt;/span&gt;&lt;span id=&#34;__span-1-4&#34;&gt;&lt;a id=&#34;__codelineno-1-4&#34; name=&#34;__codelineno-1-4&#34; href=&#34;#__codelineno-1-4&#34;&gt;&lt;/a&gt; 3: library&lt;/span&gt;&lt;span id=&#34;__span-1-5&#34;&gt;&lt;a id=&#34;__codelineno-1-5&#34; name=&#34;__codelineno-1-5&#34; href=&#34;#__codelineno-1-5&#34;&gt;&lt;/a&gt; 4: Gradle plugin&lt;/span&gt;&lt;span id=&#34;__span-1-6&#34;&gt;&lt;a id=&#34;__codelineno-1-6&#34; name=&#34;__codelineno-1-6&#34; href=&#34;#__codelineno-1-6&#34;&gt;&lt;/a&gt;Enter selection (default: basic) [1..4]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;Choose 1 here by simply typing &lt;code&gt;1&lt;/code&gt;, or just hit enter since &lt;code&gt;basic&lt;/code&gt; is the default.This will create a basic Gradle project.&lt;/p&gt;&lt;p&gt;If you want to create a library instead, you can choose &lt;code&gt;3&lt;/code&gt;.However, all this does is to apply some basic plugins beforehand, which we will get through later anyway.&lt;/p&gt;&lt;p&gt;The next step is to select the language for our Gradle DSL&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-2-1&#34;&gt;&lt;a id=&#34;__codelineno-2-1&#34; name=&#34;__codelineno-2-1&#34; href=&#34;#__codelineno-2-1&#34;&gt;&lt;/a&gt;Select build script DSL:&lt;/span&gt;&lt;span id=&#34;__span-2-2&#34;&gt;&lt;a id=&#34;__codelineno-2-2&#34; name=&#34;__codelineno-2-2&#34; href=&#34;#__codelineno-2-2&#34;&gt;&lt;/a&gt; 1: Kotlin&lt;/span&gt;&lt;span id=&#34;__span-2-3&#34;&gt;&lt;a id=&#34;__codelineno-2-3&#34; name=&#34;__codelineno-2-3&#34; href=&#34;#__codelineno-2-3&#34;&gt;&lt;/a&gt; 2: Groovy&lt;/span&gt;&lt;span id=&#34;__span-2-4&#34;&gt;&lt;a id=&#34;__codelineno-2-4&#34; name=&#34;__codelineno-2-4&#34; href=&#34;#__codelineno-2-4&#34;&gt;&lt;/a&gt;Enter selection (default: Kotlin) [1..2]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;Again, choose 1 by typing &lt;code&gt;1&lt;/code&gt; or just hit enter since Kotlin is the default.&lt;/p&gt;&lt;p&gt;Now we need to enter our project name.I recommend using your plugin name in lower case and adding &lt;code&gt;-&lt;/code&gt; where there would be spaces.So &lt;code&gt;MyPlugin&lt;/code&gt; becomes &lt;code&gt;my-plugin&lt;/code&gt;.&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-3-1&#34;&gt;&lt;a id=&#34;__codelineno-3-1&#34; name=&#34;__codelineno-3-1&#34; href=&#34;#__codelineno-3-1&#34;&gt;&lt;/a&gt;Project name (default: directory): &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;&lt;p&gt;Next is a question about Gradle stuff. &lt;br /&gt;&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-4-1&#34;&gt;&lt;a id=&#34;__codelineno-4-1&#34; name=&#34;__codelineno-4-1&#34; href=&#34;#__codelineno-4-1&#34;&gt;&lt;/a&gt;Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no] &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;I recommend using the default no. So just press enter or type &lt;code&gt;no&lt;/code&gt;.And you&#39;re done.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2 id=&#34;gradle-files&#34;&gt;Gradle files&lt;/h2&gt;&lt;p&gt;Now you have a bunch of new files.Let&#39;s go through them one by one.&lt;/p&gt;&lt;h3 id=&#34;gradle-directory&#34;&gt;Gradle directory&lt;/h3&gt;&lt;p&gt;The Gradle directory contains the wrapper directory, which in turn contains a `gradle-wrapper.jar&#39;, which is your Gradle wrapper.This is your portable Gradle installation as mentioned earlier.&lt;/p&gt;&lt;p&gt;The &lt;code&gt;gradle-wrapper.properties&lt;/code&gt; contains the settings of the wrapper.The most important part is the version.You can also change it here if you forgot to use the command shown in the previous &lt;a href=&#34;#the-gradle-wrapper&#34;&gt;section&lt;/a&gt;.&lt;/p&gt;&lt;h3 id=&#34;buildgradlekts&#34;&gt;build.gradle.kts&lt;/h3&gt;&lt;p&gt;The build.gradle.kts is the heart of our project.Almost all the configuration of our project is done in this file.It contains dependencies, repositories and lots of other stuff.&lt;/p&gt;&lt;h3 id=&#34;gradlew-and-gradlewbat&#34;&gt;gradlew and gradlew.bat&lt;/h3&gt;&lt;p&gt;These are the Gradle wrapper files.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;gradlew&lt;/code&gt; for Unix systems, Windows powershell and git bash on Windows.&lt;/li&gt;&lt;li&gt;&lt;code&gt;gradlew.bat&lt;/code&gt; for the windows cmd&lt;/li&gt;&lt;/ul&gt;&lt;h3 id=&#34;settingsgradlekts&#34;&gt;settings.gradle.kts&lt;/h3&gt;&lt;p&gt;The settings can be used to apply project wide settings such as plugin repositories (not dependency repositories!).You can also define submodules here if you have a multi-module project, or create a &lt;a href=&#34;https://docs.gradle.org/current/userguide/platforms.html&#34;&gt;version catalogue&lt;/a&gt;.&lt;/p&gt;&lt;h3 id=&#34;src-directory&#34;&gt;src directory&lt;/h3&gt;&lt;p&gt;While this directory is not strictly seen as part of Gradle, it is still important to have a specific structure:&lt;/p&gt;&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-5-1&#34;&gt;&lt;a id=&#34;__codelineno-5-1&#34; name=&#34;__codelineno-5-1&#34; href=&#34;#__codelineno-5-1&#34;&gt;&lt;/a&gt;.&lt;/span&gt;&lt;span id=&#34;__span-5-2&#34;&gt;&lt;a id=&#34;__codelineno-5-2&#34; name=&#34;__codelineno-5-2&#34; href=&#34;#__codelineno-5-2&#34;&gt;&lt;/a&gt;└── src/&lt;/span&gt;&lt;span id=&#34;__span-5-3&#34;&gt;&lt;a id=&#34;__codelineno-5-3&#34; name=&#34;__codelineno-5-3&#34; href=&#34;#__codelineno-5-3&#34;&gt;&lt;/a&gt; ├── main/&lt;/span&gt;&lt;span id=&#34;__span-5-4&#34;&gt;&lt;a id=&#34;__codelineno-5-4&#34; name=&#34;__codelineno-5-4&#34; href=&#34;#__codelineno-5-4&#34;&gt;&lt;/a&gt; │ ├── java&lt;/span&gt;&lt;span id=&#34;__span-5-5&#34;&gt;&lt;a id=&#34;__codelineno-5-5&#34; name=&#34;__codelineno-5-5&#34; href=&#34;#__codelineno-5-5&#34;&gt;&lt;/a&gt; │ └── resources&lt;/span&gt;&lt;span id=&#34;__span-5-6&#34;&gt;&lt;a id=&#34;__codelineno-5-6&#34; name=&#34;__codelineno-5-6&#34; href=&#34;#__codelineno-5-6&#34;&gt;&lt;/a&gt; └── test/&lt;/span&gt;&lt;span id=&#34;__span-5-7&#34;&gt;&lt;a id=&#34;__codelineno-5-7&#34; name=&#34;__codelineno-5-7&#34; href=&#34;#__codelineno-5-7&#34;&gt;&lt;/a&gt; ├── java&lt;/span&gt;&lt;span id=&#34;__span-5-8&#34;&gt;&lt;a id=&#34;__codelineno-5-8&#34; name=&#34;__codelineno-5-8&#34; href=&#34;#__codelineno-5-8&#34;&gt;&lt;/a&gt; └── resources&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If these directories do not exist in your src directory, please create them.&lt;/p&gt;&lt;h2 id=&#34;the-basic-buildgradlekts&#34;&gt;The basic build.gradle.kts&lt;/h2&gt;&lt;p&gt;Let&#39;s start by taking a look at our build.gradle.kts.It should be empty at the moment if you used the cli approach, or already have some stuff in it if you set it up using IntelliJ.&lt;/p&gt;&lt;p&gt;Let&#39;s get you on the same page by adding some sections to start with a fresh file.&lt;/p&gt;&lt;h3 id=&#34;the-plugin-section&#34;&gt;The plugin section&lt;/h3&gt;&lt;p&gt;The top section of our file will always be the `plugins&#39; section.So we start by adding it first.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-6-1&#34;&gt;&lt;a id=&#34;__codelineno-6-1&#34; name=&#34;__codelineno-6-1&#34; href=&#34;#__codelineno-6-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-6-2&#34;&gt;&lt;a id=&#34;__codelineno-6-2&#34; name=&#34;__codelineno-6-2&#34; href=&#34;#__codelineno-6-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The whole logic of Gradle is that plugins add tasks that we execute.Since we want to build a Java application, we need to add the &lt;code&gt;java&lt;/code&gt; plugin.This can be done by simply adding &lt;code&gt;java&lt;/code&gt; to the &lt;code&gt;plugins&lt;/code&gt; block.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-7-1&#34;&gt;&lt;a id=&#34;__codelineno-7-1&#34; name=&#34;__codelineno-7-1&#34; href=&#34;#__codelineno-7-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-2&#34;&gt;&lt;a id=&#34;__codelineno-7-2&#34; name=&#34;__codelineno-7-2&#34; href=&#34;#__codelineno-7-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-7-3&#34;&gt;&lt;a id=&#34;__codelineno-7-3&#34; name=&#34;__codelineno-7-3&#34; href=&#34;#__codelineno-7-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And that&#39;s it. We are done with our plugin setup for now.&lt;/p&gt;&lt;h3 id=&#34;declare-group-and-version&#34;&gt;Declare group and version&lt;/h3&gt;&lt;p&gt;Now we need to declare our group and version.This is not a section, just two values we assign.Your group id, if not already set, should be a domain you &lt;strong&gt;own&lt;/strong&gt; in reverse order.If you don&#39;t have a domain, see my other &lt;a href=&#34;../../03/the-plugin-main-class-a-constant-naming-discussion/#i-dont-have-a-domain&#34;&gt;post&lt;/a&gt;.I recommend using &lt;a href=&#34;https://dev.to/nialljoemaher/an-introduction-to-semantic-versioning-26n9&#34;&gt;semantic versioning (semver)&lt;/a&gt; for your version.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-8-1&#34;&gt;&lt;a id=&#34;__codelineno-8-1&#34; name=&#34;__codelineno-8-1&#34; href=&#34;#__codelineno-8-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;group&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;dev.chojo&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-8-2&#34;&gt;&lt;a id=&#34;__codelineno-8-2&#34; name=&#34;__codelineno-8-2&#34; href=&#34;#__codelineno-8-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;1.0.0-SNAPSHOT&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;repositories-section&#34;&gt;Repositories section&lt;/h3&gt;&lt;p&gt;The repositories section is where we define which repositories our dependencies will be in.&lt;/p&gt;&lt;p&gt;We will most likely need two repositories.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;mavenCentral()&lt;/code&gt; &lt;br /&gt; This is the Maven Central repository where most of the dependencies we will need are located. If you have been using Maven: With Maven you did not need to import this specifically, but with Gradle you will need to do so.&lt;/li&gt;&lt;li&gt;&lt;code&gt;maven(&#34;https://repo.papermc.io/repository/maven-public/&#34;)&lt;/code&gt;&lt;br /&gt; This will import the &lt;code&gt;paper-mc&lt;/code&gt; repository. Of course you can do the same with any other repository.&lt;/li&gt;&lt;/ul&gt;&lt;div class=&#34;language-text highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-9-1&#34;&gt;&lt;a id=&#34;__codelineno-9-1&#34; name=&#34;__codelineno-9-1&#34; href=&#34;#__codelineno-9-1&#34;&gt;&lt;/a&gt;repositories {&lt;/span&gt;&lt;span id=&#34;__span-9-2&#34;&gt;&lt;a id=&#34;__codelineno-9-2&#34; name=&#34;__codelineno-9-2&#34; href=&#34;#__codelineno-9-2&#34;&gt;&lt;/a&gt; mavenCentral()&lt;/span&gt;&lt;span id=&#34;__span-9-3&#34;&gt;&lt;a id=&#34;__codelineno-9-3&#34; name=&#34;__codelineno-9-3&#34; href=&#34;#__codelineno-9-3&#34;&gt;&lt;/a&gt; maven(&amp;quot;https://repo.papermc.io/repository/maven-public/&amp;quot;)&lt;/span&gt;&lt;span id=&#34;__span-9-4&#34;&gt;&lt;a id=&#34;__codelineno-9-4&#34; name=&#34;__codelineno-9-4&#34; href=&#34;#__codelineno-9-4&#34;&gt;&lt;/a&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Order is important!&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The order in which you assign repositories in this section is the order in which Gradle will search for dependencies.It will take the first found location where the dependency exists.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Maven local&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;If you want to use dependencies from your local Maven repository, you need to add &lt;code&gt;mavenLocal()&lt;/code&gt; at the top of the section.I strongly recommend doing this &lt;strong&gt;only for local development&lt;/strong&gt;, as it destroys the ability to build on other machines.&lt;/p&gt;&lt;h3 id=&#34;dependencies-section&#34;&gt;Dependencies section&lt;/h3&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;If you have test imports from junit here, you can delete them for now.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Inside the dependencies section, we can define two different dependency types for now:&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-10-1&#34;&gt;&lt;a id=&#34;__codelineno-10-1&#34; name=&#34;__codelineno-10-1&#34; href=&#34;#__codelineno-10-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-2&#34;&gt;&lt;a id=&#34;__codelineno-10-2&#34; name=&#34;__codelineno-10-2&#34; href=&#34;#__codelineno-10-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;compileOnly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;io.papermc.paper:paper-api:26.1.2.build.63-stable&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-3&#34;&gt;&lt;a id=&#34;__codelineno-10-3&#34; name=&#34;__codelineno-10-3&#34; href=&#34;#__codelineno-10-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;implementation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.chojo.sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;2.3.9&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-10-4&#34;&gt;&lt;a id=&#34;__codelineno-10-4&#34; name=&#34;__codelineno-10-4&#34; href=&#34;#__codelineno-10-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;SADU is here only for demonstration purposes and not mandatory required&lt;/p&gt;&lt;/div&gt;&lt;p&gt;I have used two different ways of declaring dependencies here.Both are valid.You can either declare them as one string or as three separate strings.&lt;/p&gt;&lt;p&gt;&lt;a href=&#34;https://github.com/rainbowdashlabs/sadu&#34;&gt;SADU&lt;/a&gt; is a library I wrote to make using databases easier for beginners. Have a look at it c:&lt;/p&gt;&lt;div class=&#34;tabbed-set tabbed-alternate&#34; data-tabs=&#34;2:2&#34;&gt;&lt;input checked=&#34;checked&#34; id=&#34;__tabbed_2_1&#34; name=&#34;__tabbed_2&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_2_2&#34; name=&#34;__tabbed_2&#34; type=&#34;radio&#34; /&gt;&lt;div class=&#34;tabbed-labels&#34;&gt;&lt;label for=&#34;__tabbed_2_1&#34;&gt;As implementation&lt;/label&gt;&lt;label for=&#34;__tabbed_2_2&#34;&gt;As compileOnly&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-content&#34;&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;The &lt;code&gt;implementation&lt;/code&gt; imports are dependencies that are not part Paper, and therefore need to get into your plugin somehow.This will not work now, but we will fix this in a later step.&lt;/p&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;The &lt;code&gt;compileOnly&lt;/code&gt; imports are dependencies that we only need to build our project, but are either not needed to run it, or are provided in some other way.This means that dependencies like Paper, FAWE, LuckPerms and in general any other api by other plugins will be imported as &lt;code&gt;compileOnly&lt;/code&gt;.APIs that are not available as plugins on the server, which can be the case for Inventory APIs for example, must of course be imported as an &lt;code&gt;implementation&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3 id=&#34;tasks-section&#34;&gt;Tasks section&lt;/h3&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;You can delete anything currently in your tasks section &lt;/p&gt;&lt;/div&gt;&lt;p&gt;I told you earlier that everything in Gradle works with tasks.So there has to be a way to configure them, and this is where the tasks section comes in.For now we will just start with a simple empty section.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-11-1&#34;&gt;&lt;a id=&#34;__codelineno-11-1&#34; name=&#34;__codelineno-11-1&#34; href=&#34;#__codelineno-11-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;tasks&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-2&#34;&gt;&lt;a id=&#34;__codelineno-11-2&#34; name=&#34;__codelineno-11-2&#34; href=&#34;#__codelineno-11-2&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-11-3&#34;&gt;&lt;a id=&#34;__codelineno-11-3&#34; name=&#34;__codelineno-11-3&#34; href=&#34;#__codelineno-11-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;configuring-java&#34;&gt;Configuring Java&lt;/h2&gt;&lt;p&gt;Now that we have all the necessary sections in our file, we can finally start configuring our project.&lt;/p&gt;&lt;p&gt;The first thing we need to configure is the &lt;code&gt;java&lt;/code&gt; plugin, which we have already imported.While I have shown you the basic sections, there are more, as almost every plugin adds its own section for configuration.This means that we can not only configure the tasks of our plugins, but also the plugin itself.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-12-1&#34;&gt;&lt;a id=&#34;__codelineno-12-1&#34; name=&#34;__codelineno-12-1&#34; href=&#34;#__codelineno-12-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;java&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-12-2&#34;&gt;&lt;a id=&#34;__codelineno-12-2&#34; name=&#34;__codelineno-12-2&#34; href=&#34;#__codelineno-12-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;toolchain&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-12-3&#34;&gt;&lt;a id=&#34;__codelineno-12-3&#34; name=&#34;__codelineno-12-3&#34; href=&#34;#__codelineno-12-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;languageVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JavaLanguageVersion&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;of&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;21&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-12-4&#34;&gt;&lt;a id=&#34;__codelineno-12-4&#34; name=&#34;__codelineno-12-4&#34; href=&#34;#__codelineno-12-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-12-5&#34;&gt;&lt;a id=&#34;__codelineno-12-5&#34; name=&#34;__codelineno-12-5&#34; href=&#34;#__codelineno-12-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;withSourcesJar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-12-6&#34;&gt;&lt;a id=&#34;__codelineno-12-6&#34; name=&#34;__codelineno-12-6&#34; href=&#34;#__codelineno-12-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;withJavadocJar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-12-7&#34;&gt;&lt;a id=&#34;__codelineno-12-7&#34; name=&#34;__codelineno-12-7&#34; href=&#34;#__codelineno-12-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For &lt;code&gt;java&lt;/code&gt; we set the so-called toolchain.The toolchain controls the version of java used in our project.If you want to import a dependency compiled with java 17, you need to set your toolchain to 17 as well.On the other hand, using a java 17 toolchain will still allow you to import any dependency using an older version of java.&lt;/p&gt;&lt;p&gt;We also define that we want to build a source jar and a javadoc jar.This may not be important to us now, but it may be in the future.It doesn&#39;t hurt to have it in the end.&lt;/p&gt;&lt;p&gt;In addition to configuring our java plugin, we also want to configure its tasks.There are three tasks of interest to us:&lt;/p&gt;&lt;div class=&#34;tabbed-set tabbed-alternate&#34; data-tabs=&#34;3:3&#34;&gt;&lt;input checked=&#34;checked&#34; id=&#34;__tabbed_3_1&#34; name=&#34;__tabbed_3&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_3_2&#34; name=&#34;__tabbed_3&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_3_3&#34; name=&#34;__tabbed_3&#34; type=&#34;radio&#34; /&gt;&lt;div class=&#34;tabbed-labels&#34;&gt;&lt;label for=&#34;__tabbed_3_1&#34;&gt;compileJava&lt;/label&gt;&lt;label for=&#34;__tabbed_3_2&#34;&gt;compileJavaTest&lt;/label&gt;&lt;label for=&#34;__tabbed_3_3&#34;&gt;javadoc&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-content&#34;&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;This task is responsible for compiling our Java code.&lt;/p&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;This task handles the compilation of our test code written in Java.Although we do not have any tests yet, it cannot hurt to define them anyway.&lt;/p&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;This handles how our javadocs are built.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;All we want to define for these tasks is that we want to use &lt;code&gt;UTF-8&lt;/code&gt; encoding for them.This will avoid weird characters when using special characters.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-13-1&#34;&gt;&lt;a id=&#34;__codelineno-13-1&#34; name=&#34;__codelineno-13-1&#34; href=&#34;#__codelineno-13-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;tasks&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-13-2&#34;&gt;&lt;a id=&#34;__codelineno-13-2&#34; name=&#34;__codelineno-13-2&#34; href=&#34;#__codelineno-13-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;compileJava&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-13-3&#34;&gt;&lt;a id=&#34;__codelineno-13-3&#34; name=&#34;__codelineno-13-3&#34; href=&#34;#__codelineno-13-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;encoding&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-13-4&#34;&gt;&lt;a id=&#34;__codelineno-13-4&#34; name=&#34;__codelineno-13-4&#34; href=&#34;#__codelineno-13-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-13-5&#34;&gt;&lt;a id=&#34;__codelineno-13-5&#34; name=&#34;__codelineno-13-5&#34; href=&#34;#__codelineno-13-5&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-13-6&#34;&gt;&lt;a id=&#34;__codelineno-13-6&#34; name=&#34;__codelineno-13-6&#34; href=&#34;#__codelineno-13-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;compileTestJava&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-13-7&#34;&gt;&lt;a id=&#34;__codelineno-13-7&#34; name=&#34;__codelineno-13-7&#34; href=&#34;#__codelineno-13-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;encoding&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-13-8&#34;&gt;&lt;a id=&#34;__codelineno-13-8&#34; name=&#34;__codelineno-13-8&#34; href=&#34;#__codelineno-13-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-13-9&#34;&gt;&lt;a id=&#34;__codelineno-13-9&#34; name=&#34;__codelineno-13-9&#34; href=&#34;#__codelineno-13-9&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-13-10&#34;&gt;&lt;a id=&#34;__codelineno-13-10&#34; name=&#34;__codelineno-13-10&#34; href=&#34;#__codelineno-13-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;javadoc&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-13-11&#34;&gt;&lt;a id=&#34;__codelineno-13-11&#34; name=&#34;__codelineno-13-11&#34; href=&#34;#__codelineno-13-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;options&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;encoding&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;UTF-8&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-13-12&#34;&gt;&lt;a id=&#34;__codelineno-13-12&#34; name=&#34;__codelineno-13-12&#34; href=&#34;#__codelineno-13-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-13-13&#34;&gt;&lt;a id=&#34;__codelineno-13-13&#34; name=&#34;__codelineno-13-13&#34; href=&#34;#__codelineno-13-13&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And that&#39;s the configuration for our Java plugin.&lt;/p&gt;&lt;h2 id=&#34;building-the-plugin&#34;&gt;Building the plugin&lt;/h2&gt;&lt;p&gt;There is nothing stopping us from building our plugin now.All we need is a &lt;code&gt;plugin.yml&lt;/code&gt;.While we could stop here and just be happy that it works, there is still a lot (and by that I mean A LOT) of room for improvement.We also still have to fix the problem of not including our library that we previously imported with &lt;code&gt;implementation&lt;/code&gt;.So while you might be tempted to call it a day, I highly recommend you keep reading!&lt;/p&gt;&lt;p&gt;For now, I will just show you the two ways to run a Gradle task.&lt;/p&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;You can run not only the build task with this, but &lt;strong&gt;any other task&lt;/strong&gt; as well.If you are using IntelliJ you can have a look at the other tasks that are available.&lt;/p&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-set tabbed-alternate&#34; data-tabs=&#34;4:2&#34;&gt;&lt;input checked=&#34;checked&#34; id=&#34;__tabbed_4_1&#34; name=&#34;__tabbed_4&#34; type=&#34;radio&#34; /&gt;&lt;input id=&#34;__tabbed_4_2&#34; name=&#34;__tabbed_4&#34; type=&#34;radio&#34; /&gt;&lt;div class=&#34;tabbed-labels&#34;&gt;&lt;label for=&#34;__tabbed_4_1&#34;&gt;Via cli&lt;/label&gt;&lt;label for=&#34;__tabbed_4_2&#34;&gt;Via IntelliJ&lt;/label&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-content&#34;&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;Go into your cli and run &lt;code&gt;./gradlew build&#39; or&lt;/code&gt;gradlew.bat build&#39; depending on your operating system.&lt;/p&gt;&lt;/div&gt;&lt;div class=&#34;tabbed-block&#34;&gt;&lt;p&gt;Open the Gradle window on the right. Go to Tasks -&amp;gt; Build and run the build task by clicking on it.&lt;/p&gt;&lt;p&gt;&lt;img alt=&#34;Gradle task view&#34; src=&#34;../../../../../assets/images/gradle_build.png&#34; /&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;h3 id=&#34;getting-the-build-file&#34;&gt;Getting the build file&lt;/h3&gt;&lt;p&gt;You will now find your plugin in &lt;code&gt;build/libs/myplugin.jar&lt;/code&gt;.This is not on your server yet of course, but we have a very easy way to get it.&lt;/p&gt;&lt;h2 id=&#34;copy-a-jar-after-build&#34;&gt;Copy a jar after build&lt;/h2&gt;&lt;div class=&#34;admonition warning&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Warning&lt;/p&gt;&lt;p&gt;Instead of doing this, you can run a Paper server directly with your plugin in it.Have a look at the &lt;a href=&#34;#run-server-with-your-jar&#34;&gt;Running a server section&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;To copy our jar to our server, we can simply create our own task.&lt;/p&gt;&lt;p&gt;Have a look at the code. Explanations are shown by hovering over the plus sign for each line.&lt;/p&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;Although I have no other tasks in my tasks section at the moment, this does not mean that you should create a new task.I just do not show all available tasks every time to keep it as short as possible.&lt;/p&gt;&lt;/div&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-14-1&#34;&gt;&lt;a id=&#34;__codelineno-14-1&#34; name=&#34;__codelineno-14-1&#34; href=&#34;#__codelineno-14-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;tasks&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-14-2&#34;&gt;&lt;a id=&#34;__codelineno-14-2&#34; name=&#34;__codelineno-14-2&#34; href=&#34;#__codelineno-14-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/*(1)!*/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;register&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Copy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;copyToServer&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-14-3&#34;&gt;&lt;a id=&#34;__codelineno-14-3&#34; name=&#34;__codelineno-14-3&#34; href=&#34;#__codelineno-14-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/*(2)!*/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;props&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Properties&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-14-4&#34;&gt;&lt;a id=&#34;__codelineno-14-4&#34; name=&#34;__codelineno-14-4&#34; href=&#34;#__codelineno-14-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/*(3)!*/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;propFile&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;build.properties&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-14-5&#34;&gt;&lt;a id=&#34;__codelineno-14-5&#34; name=&#34;__codelineno-14-5&#34; href=&#34;#__codelineno-14-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/*(4)!*/&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;propFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;exists&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;propFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;createNewFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-14-6&#34;&gt;&lt;a id=&#34;__codelineno-14-6&#34; name=&#34;__codelineno-14-6&#34; href=&#34;#__codelineno-14-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/*(5)!*/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;build.properties&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;reader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;props&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;load&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;it&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-14-7&#34;&gt;&lt;a id=&#34;__codelineno-14-7&#34; name=&#34;__codelineno-14-7&#34; href=&#34;#__codelineno-14-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/*(6)!*/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;props&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getProperty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;targetDir&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-14-8&#34;&gt;&lt;a id=&#34;__codelineno-14-8&#34; name=&#34;__codelineno-14-8&#34; href=&#34;#__codelineno-14-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/*(7)!*/&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;isEmpty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RuntimeException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;targetDir is not set in build.properties&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-14-9&#34;&gt;&lt;a id=&#34;__codelineno-14-9&#34; name=&#34;__codelineno-14-9&#34; href=&#34;#__codelineno-14-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/*(8)!*/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;jar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-14-10&#34;&gt;&lt;a id=&#34;__codelineno-14-10&#34; name=&#34;__codelineno-14-10&#34; href=&#34;#__codelineno-14-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/*(9)!*/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;destinationDir&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;File&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-14-11&#34;&gt;&lt;a id=&#34;__codelineno-14-11&#34; name=&#34;__codelineno-14-11&#34; href=&#34;#__codelineno-14-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-14-12&#34;&gt;&lt;a id=&#34;__codelineno-14-12&#34; name=&#34;__codelineno-14-12&#34; href=&#34;#__codelineno-14-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;We register a new task of type &#39;Copy&#39; and name it &#39;copyToServer&#39;.&lt;/li&gt;&lt;li&gt;We create our properties&lt;br /&gt; You may need to add an import &lt;code&gt;import java.util.*&lt;/code&gt; at the top of the file.&lt;/li&gt;&lt;li&gt;Create a file called `build.properties&lt;/li&gt;&lt;li&gt;We create this file if it doesn&#39;t already exist.&lt;/li&gt;&lt;li&gt;We read the file and add it to the properties&lt;/li&gt;&lt;li&gt;We read the &lt;code&gt;targetDir&lt;/code&gt; property&lt;/li&gt;&lt;li&gt;We check if the path is empty and throw an error if it is&lt;/li&gt;&lt;li&gt;We define that we want to copy the output of our jar task&lt;/li&gt;&lt;li&gt;We set the target dir of the copy task&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&#34;creating-a-pluginyml-using-a-gradle-plugin&#34;&gt;Creating a plugin.yml using a Gradle plugin&lt;/h2&gt;&lt;p&gt;Now you may or may not have tried this.If you have already created a &lt;code&gt;plugin.yml&lt;/code&gt;, it may have worked and failed otherwise.&lt;/p&gt;&lt;p&gt;If you already have a &lt;code&gt;plugin.yml&lt;/code&gt; you can delete it now or wait until the end of this section.&lt;/p&gt;&lt;p&gt;To create our &lt;code&gt;plugin.yml&lt;/code&gt; we will use the &lt;code&gt;plugin-yml&lt;/code&gt; &lt;a href=&#34;https://github.com/Minecrell/plugin-yml&#34;&gt;Gradle plugin by minecrell&lt;/a&gt;.&lt;/p&gt;&lt;h3 id=&#34;importing&#34;&gt;Importing&lt;/h3&gt;&lt;p&gt;First we need to import it. See the latest version above.&lt;/p&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;Although I do not have any other plugins in my plugin section at the moment, this does not mean that you should create a new plugin section or delete the other plugins.I just do not show all available plugins every time to keep it as short as possible.&lt;/p&gt;&lt;/div&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-15-1&#34;&gt;&lt;a id=&#34;__codelineno-15-1&#34; name=&#34;__codelineno-15-1&#34; href=&#34;#__codelineno-15-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-15-2&#34;&gt;&lt;a id=&#34;__codelineno-15-2&#34; name=&#34;__codelineno-15-2&#34; href=&#34;#__codelineno-15-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.eldoria.plugin-yml.bukkit&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;0.9.0&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c1&#34;&gt;// (1)!&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-15-3&#34;&gt;&lt;a id=&#34;__codelineno-15-3&#34; name=&#34;__codelineno-15-3&#34; href=&#34;#__codelineno-15-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;Replace the version here with the version in the image above&lt;/li&gt;&lt;/ol&gt;&lt;h3 id=&#34;configuration&#34;&gt;Configuration&lt;/h3&gt;&lt;p&gt;Now that this is done, we need to configure our plugin.We do this, of course, in the section of the plugin called &lt;code&gt;bukkit&lt;/code&gt; in our case.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-16-1&#34;&gt;&lt;a id=&#34;__codelineno-16-1&#34; name=&#34;__codelineno-16-1&#34; href=&#34;#__codelineno-16-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;bukkit&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-2&#34;&gt;&lt;a id=&#34;__codelineno-16-2&#34; name=&#34;__codelineno-16-2&#34; href=&#34;#__codelineno-16-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;MyPlugin&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-3&#34;&gt;&lt;a id=&#34;__codelineno-16-3&#34; name=&#34;__codelineno-16-3&#34; href=&#34;#__codelineno-16-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;dev.chojo.myplugin.MyPlugin&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-4&#34;&gt;&lt;a id=&#34;__codelineno-16-4&#34; name=&#34;__codelineno-16-4&#34; href=&#34;#__codelineno-16-4&#34;&gt;&lt;/a&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-5&#34;&gt;&lt;a id=&#34;__codelineno-16-5&#34; name=&#34;__codelineno-16-5&#34; href=&#34;#__codelineno-16-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;commands&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-6&#34;&gt;&lt;a id=&#34;__codelineno-16-6&#34; name=&#34;__codelineno-16-6&#34; href=&#34;#__codelineno-16-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;register&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;test&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-7&#34;&gt;&lt;a id=&#34;__codelineno-16-7&#34; name=&#34;__codelineno-16-7&#34; href=&#34;#__codelineno-16-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;aliases&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;listOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;command&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-8&#34;&gt;&lt;a id=&#34;__codelineno-16-8&#34; name=&#34;__codelineno-16-8&#34; href=&#34;#__codelineno-16-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-9&#34;&gt;&lt;a id=&#34;__codelineno-16-9&#34; name=&#34;__codelineno-16-9&#34; href=&#34;#__codelineno-16-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-16-10&#34;&gt;&lt;a id=&#34;__codelineno-16-10&#34; name=&#34;__codelineno-16-10&#34; href=&#34;#__codelineno-16-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is the minimum setup. (Commands are not really needed)What are we doing here?&lt;/p&gt;&lt;ol&gt;&lt;li&gt;We define the plugin with the name &#34;MyPlugin&#34;.&lt;/li&gt;&lt;li&gt;We define our plugin class.&lt;br /&gt; Please don&#39;t make it &lt;code&gt;Main&lt;/code&gt; and choose a correct namespace. See my previous &lt;a href=&#34;../../03/the-plugin-main-class-a-constant-naming-discussion/&#34;&gt;blog post&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;We will register a command called &lt;code&gt;test&lt;/code&gt; with the alias &lt;code&gt;command&lt;/code&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Have a look at the &lt;a href=&#34;https://github.com/Minecrell/plugin-yml#bukkit&#34;&gt;GitHub page&lt;/a&gt; for further references.&lt;/p&gt;&lt;p&gt;The version is taken from your project version by default&lt;/p&gt;&lt;h3 id=&#34;bukkit-libraries-the-better-alternative-to-shading&#34;&gt;Bukkit Libraries - The better alternative to shading&lt;/h3&gt;&lt;p&gt;You probably remember our dependencies section looking like this:&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-17-1&#34;&gt;&lt;a id=&#34;__codelineno-17-1&#34; name=&#34;__codelineno-17-1&#34; href=&#34;#__codelineno-17-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-17-2&#34;&gt;&lt;a id=&#34;__codelineno-17-2&#34; name=&#34;__codelineno-17-2&#34; href=&#34;#__codelineno-17-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;compileOnly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;io.papermc.paper:paper-api:26.1.2.build.63-stable&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-17-3&#34;&gt;&lt;a id=&#34;__codelineno-17-3&#34; name=&#34;__codelineno-17-3&#34; href=&#34;#__codelineno-17-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;implementation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.chojo.sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;2.3.9&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-17-4&#34;&gt;&lt;a id=&#34;__codelineno-17-4&#34; name=&#34;__codelineno-17-4&#34; href=&#34;#__codelineno-17-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Previously we had the problem that SADU was not included in our jar.If we use the &lt;code&gt;plugin-yml&lt;/code&gt; plugin and are using Minecraft 1.16.5 or later, we can use the library loader.All we need to do is change &lt;code&gt;implementation&lt;/code&gt; to &lt;code&gt;bukkitLibrary&lt;/code&gt;:&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-18-1&#34;&gt;&lt;a id=&#34;__codelineno-18-1&#34; name=&#34;__codelineno-18-1&#34; href=&#34;#__codelineno-18-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-18-2&#34;&gt;&lt;a id=&#34;__codelineno-18-2&#34; name=&#34;__codelineno-18-2&#34; href=&#34;#__codelineno-18-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;compileOnly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;io.papermc.paper:paper-api:26.1.2.build.63-stable&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-18-3&#34;&gt;&lt;a id=&#34;__codelineno-18-3&#34; name=&#34;__codelineno-18-3&#34; href=&#34;#__codelineno-18-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bukkitLibrary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.chojo.sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;2.3.9&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-18-4&#34;&gt;&lt;a id=&#34;__codelineno-18-4&#34; name=&#34;__codelineno-18-4&#34; href=&#34;#__codelineno-18-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now our library is loaded by Spigot/Paper when it loads our plugin and is available at runtime.This works because SADU is located at Maven Central and Spigot/Paper downloads libraries from there.Libraries not located at Maven Central still need to be shadowed.&lt;/p&gt;&lt;h4 id=&#34;paper-plugins&#34;&gt;Paper plugins&lt;/h4&gt;&lt;p&gt;Paper plugins are a type of plugin exclusively for Paper servers.They are very experimental.They also lack a build in solution for commands and configuration files.If you are a beginner, I strongly advise against using them.&lt;/p&gt;&lt;p&gt;In Paper plugins you can also load dependencies from custom repositories. You can read more about this &lt;a href=&#34;https://github.com/Minecrell/plugin-yml#plugin-libraries-json&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;More about Paper plugins can be found &lt;a href=&#34;https://docs.papermc.io/paper/reference/paper-plugins&#34;&gt;here&lt;/a&gt; and &lt;a href=&#34;https://docs.papermc.io/paper/dev/getting-started/paper-plugins&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;h2 id=&#34;shading-dependencies-into-our-jar&#34;&gt;Shading dependencies into our jar&lt;/h2&gt;&lt;p&gt;Let&#39;s assume that SADU is not located in Maven Central, and we cannot use the library loader.&lt;/p&gt;&lt;p&gt;In this case we need to use another plugin called shadow. The latest version is shown above. &lt;/p&gt;&lt;h3 id=&#34;importing_1&#34;&gt;Importing&lt;/h3&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-19-1&#34;&gt;&lt;a id=&#34;__codelineno-19-1&#34; name=&#34;__codelineno-19-1&#34; href=&#34;#__codelineno-19-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-19-2&#34;&gt;&lt;a id=&#34;__codelineno-19-2&#34; name=&#34;__codelineno-19-2&#34; href=&#34;#__codelineno-19-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;com.gradleup.shadow&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;9.4.1&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-19-3&#34;&gt;&lt;a id=&#34;__codelineno-19-3&#34; name=&#34;__codelineno-19-3&#34; href=&#34;#__codelineno-19-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;Replace the version here with the version in the image above&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Our dependencies look like this again:&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-20-1&#34;&gt;&lt;a id=&#34;__codelineno-20-1&#34; name=&#34;__codelineno-20-1&#34; href=&#34;#__codelineno-20-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-20-2&#34;&gt;&lt;a id=&#34;__codelineno-20-2&#34; name=&#34;__codelineno-20-2&#34; href=&#34;#__codelineno-20-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;compileOnly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;io.papermc.paper:paper-api:26.1.2.build.63-stable&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-20-3&#34;&gt;&lt;a id=&#34;__codelineno-20-3&#34; name=&#34;__codelineno-20-3&#34; href=&#34;#__codelineno-20-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;bukkitLibrary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.chojo.sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;2.3.9&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-20-4&#34;&gt;&lt;a id=&#34;__codelineno-20-4&#34; name=&#34;__codelineno-20-4&#34; href=&#34;#__codelineno-20-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The purpose of shadow is to copy everything marked as implementation to the output file.&lt;/p&gt;&lt;p&gt;This is already the case if we were to run the &lt;code&gt;shadowJar&lt;/code&gt; task instead of the &lt;code&gt;build&lt;/code&gt; task.However, building our plugin without shadowJar would result in a jar that is simply broken.&lt;/p&gt;&lt;h3 id=&#34;configuration_1&#34;&gt;Configuration&lt;/h3&gt;&lt;p&gt;We can fix this by telling Gradle that when we run &lt;code&gt;build&lt;/code&gt; we actually want to run &lt;code&gt;shadowJar&lt;/code&gt;.We do this by configuring the &lt;code&gt;build&lt;/code&gt; task to depend on &lt;code&gt;shadowJar&lt;/code&gt;.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-21-1&#34;&gt;&lt;a id=&#34;__codelineno-21-1&#34; name=&#34;__codelineno-21-1&#34; href=&#34;#__codelineno-21-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;tasks&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-2&#34;&gt;&lt;a id=&#34;__codelineno-21-2&#34; name=&#34;__codelineno-21-2&#34; href=&#34;#__codelineno-21-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-3&#34;&gt;&lt;a id=&#34;__codelineno-21-3&#34; name=&#34;__codelineno-21-3&#34; href=&#34;#__codelineno-21-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dependsOn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;shadowJar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-4&#34;&gt;&lt;a id=&#34;__codelineno-21-4&#34; name=&#34;__codelineno-21-4&#34; href=&#34;#__codelineno-21-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-21-5&#34;&gt;&lt;a id=&#34;__codelineno-21-5&#34; name=&#34;__codelineno-21-5&#34; href=&#34;#__codelineno-21-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;relocation&#34;&gt;Relocation&lt;/h4&gt;&lt;p&gt;Now that our libraries are shaded we need to do something called relocation.This is important to avoid conflicts with other plugins when you shade the same library.To do this we need to configure it, but this time we are not configuring the plugin, but the task called &lt;code&gt;shadowJar&lt;/code&gt;.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-22-1&#34;&gt;&lt;a id=&#34;__codelineno-22-1&#34; name=&#34;__codelineno-22-1&#34; href=&#34;#__codelineno-22-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;tasks&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-2&#34;&gt;&lt;a id=&#34;__codelineno-22-2&#34; name=&#34;__codelineno-22-2&#34; href=&#34;#__codelineno-22-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;shadowJar&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-3&#34;&gt;&lt;a id=&#34;__codelineno-22-3&#34; name=&#34;__codelineno-22-3&#34; href=&#34;#__codelineno-22-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mapping&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mapOf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;de.chojo.sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;to&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;sadu&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-4&#34;&gt;&lt;a id=&#34;__codelineno-22-4&#34; name=&#34;__codelineno-22-4&#34; href=&#34;#__codelineno-22-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;base&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;dev.chojo.myplugin.libs.&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-5&#34;&gt;&lt;a id=&#34;__codelineno-22-5&#34; name=&#34;__codelineno-22-5&#34; href=&#34;#__codelineno-22-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;((&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pattern&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;in&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mapping&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;relocate&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pattern&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;${base}${name}&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-6&#34;&gt;&lt;a id=&#34;__codelineno-22-6&#34; name=&#34;__codelineno-22-6&#34; href=&#34;#__codelineno-22-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-22-7&#34;&gt;&lt;a id=&#34;__codelineno-22-7&#34; name=&#34;__codelineno-22-7&#34; href=&#34;#__codelineno-22-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What this basically does is:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;We define a map with the packages we want to move and the directory we want them to move to.&lt;/li&gt;&lt;li&gt;We define the root of the new location of all our shaded libraries.&lt;/li&gt;&lt;li&gt;For each entry in our map, we call the relocate function of our task.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;So what does relocation do?&lt;br /&gt;Consider the class &lt;code&gt;de.chojo.sadu.Sadu&lt;/code&gt;. After the relocation it will be located at &lt;code&gt;dev.chojo.myplugin.libs.sadu.Sadu&lt;/code&gt;.Now that it is in your namespace and your plugin, it is no longer possible for it to collide with another plugin.Shadow will also replace any path to the class in your code with the new relocated path.&lt;/p&gt;&lt;h4 id=&#34;using-the-output-in-copy&#34;&gt;Using the output in copy&lt;/h4&gt;&lt;div class=&#34;admonition warning&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Warning&lt;/p&gt;&lt;p&gt;Instead of doing this you can directly run a Paper server with your plugin in it.Take a look at the &lt;a href=&#34;#run-server-with-your-jar&#34;&gt;server run section&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;To use the output of &lt;code&gt;shadowJar&lt;/code&gt; for our copy task, all you need to do is change the &lt;code&gt;jar&lt;/code&gt; task to the &lt;code&gt;shadowJar&lt;/code&gt; task.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-23-1&#34;&gt;&lt;a id=&#34;__codelineno-23-1&#34; name=&#34;__codelineno-23-1&#34; href=&#34;#__codelineno-23-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;tasks&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-2&#34;&gt;&lt;a id=&#34;__codelineno-23-2&#34; name=&#34;__codelineno-23-2&#34; href=&#34;#__codelineno-23-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;register&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Copy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;copyToServer&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-3&#34;&gt;&lt;a id=&#34;__codelineno-23-3&#34; name=&#34;__codelineno-23-3&#34; href=&#34;#__codelineno-23-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;props&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Properties&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-4&#34;&gt;&lt;a id=&#34;__codelineno-23-4&#34; name=&#34;__codelineno-23-4&#34; href=&#34;#__codelineno-23-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;propFile&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;build.properties&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-5&#34;&gt;&lt;a id=&#34;__codelineno-23-5&#34; name=&#34;__codelineno-23-5&#34; href=&#34;#__codelineno-23-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;propFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;exists&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;propFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;createNewFile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-6&#34;&gt;&lt;a id=&#34;__codelineno-23-6&#34; name=&#34;__codelineno-23-6&#34; href=&#34;#__codelineno-23-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;build.properties&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;reader&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;().&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;let&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;props&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;load&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;it&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-7&#34;&gt;&lt;a id=&#34;__codelineno-23-7&#34; name=&#34;__codelineno-23-7&#34; href=&#34;#__codelineno-23-7&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;props&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getProperty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;targetDir&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-8&#34;&gt;&lt;a id=&#34;__codelineno-23-8&#34; name=&#34;__codelineno-23-8&#34; href=&#34;#__codelineno-23-8&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;isEmpty&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RuntimeException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;targetDir is not set in build.properties&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-9&#34;&gt;&lt;a id=&#34;__codelineno-23-9&#34; name=&#34;__codelineno-23-9&#34; href=&#34;#__codelineno-23-9&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;cm&#34;&gt;/*(1)!*/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;from&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;shadowJar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-10&#34;&gt;&lt;a id=&#34;__codelineno-23-10&#34; name=&#34;__codelineno-23-10&#34; href=&#34;#__codelineno-23-10&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;destinationDir&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;File&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-11&#34;&gt;&lt;a id=&#34;__codelineno-23-11&#34; name=&#34;__codelineno-23-11&#34; href=&#34;#__codelineno-23-11&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-23-12&#34;&gt;&lt;a id=&#34;__codelineno-23-12&#34; name=&#34;__codelineno-23-12&#34; href=&#34;#__codelineno-23-12&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;Change it here&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&#34;nms-and-internals-using-the-paperweight-userdev-plugin&#34;&gt;NMS and internals using the Paperweight Userdev plugin&lt;/h2&gt;&lt;p&gt;I do not encourage using nms in any way, but if you want to, you should use the &lt;code&gt;userdev&lt;/code&gt; plugin from &lt;code&gt;paperweight&lt;/code&gt;.This allows you to develop against an environment with non-obfuscated names.It is also the only supported way of accessing internals in &lt;code&gt;org.bukkit.craftbukkit.v1_XX_RX&lt;/code&gt;.It also ensures that when you upgrade to a new version, you do not have to change any code that is using the &lt;code&gt;net.minecraft&lt;/code&gt; package.Of course, you still need to change code when Mojang changed something.However, you still need to change the package names when using internal code from &lt;code&gt;org.bukkit.craftbukkit.v1_XX_RX&lt;/code&gt;;&lt;/p&gt;&lt;h3 id=&#34;adding-the-repository&#34;&gt;Adding the repository&lt;/h3&gt;&lt;p&gt;For this we need to do something new and go into our &lt;code&gt;settings.gradle.kts&lt;/code&gt; to add a plugin repository.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-24-1&#34;&gt;&lt;a id=&#34;__codelineno-24-1&#34; name=&#34;__codelineno-24-1&#34; href=&#34;#__codelineno-24-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;pluginManagement&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-2&#34;&gt;&lt;a id=&#34;__codelineno-24-2&#34; name=&#34;__codelineno-24-2&#34; href=&#34;#__codelineno-24-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;repositories&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-3&#34;&gt;&lt;a id=&#34;__codelineno-24-3&#34; name=&#34;__codelineno-24-3&#34; href=&#34;#__codelineno-24-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;gradlePluginPortal&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-4&#34;&gt;&lt;a id=&#34;__codelineno-24-4&#34; name=&#34;__codelineno-24-4&#34; href=&#34;#__codelineno-24-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;maven&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;https://papermc.io/repo/repository/maven-public/&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-5&#34;&gt;&lt;a id=&#34;__codelineno-24-5&#34; name=&#34;__codelineno-24-5&#34; href=&#34;#__codelineno-24-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-24-6&#34;&gt;&lt;a id=&#34;__codelineno-24-6&#34; name=&#34;__codelineno-24-6&#34; href=&#34;#__codelineno-24-6&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To do this we need to configure the &lt;code&gt;pluginManagement&lt;/code&gt; section and change the repositories.By default, only &lt;code&gt;gradlePluginPortal()&lt;/code&gt; is imported, which usually contains all the important plugins so far.But now we want to add another repository.It is very important that you add &lt;code&gt;gradlePluginPortal()&lt;/code&gt; as well as the Paper repository.&lt;/p&gt;&lt;h3 id=&#34;importing_2&#34;&gt;Importing&lt;/h3&gt;&lt;p&gt;Now we can import the plugin into our &lt;code&gt;build.gradle.kts&lt;/code&gt; file.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-25-1&#34;&gt;&lt;a id=&#34;__codelineno-25-1&#34; name=&#34;__codelineno-25-1&#34; href=&#34;#__codelineno-25-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;plugins&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-25-2&#34;&gt;&lt;a id=&#34;__codelineno-25-2&#34; name=&#34;__codelineno-25-2&#34; href=&#34;#__codelineno-25-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;io.papermc.paperweight.userdev&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;version&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;1.7.7&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-25-3&#34;&gt;&lt;a id=&#34;__codelineno-25-3&#34; name=&#34;__codelineno-25-3&#34; href=&#34;#__codelineno-25-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This leaves just one step to set up the Paper version.&lt;/p&gt;&lt;h3 id=&#34;configuration_2&#34;&gt;Configuration&lt;/h3&gt;&lt;p&gt;To define the version we want to use, we need to add it to our dependencies.To do this we need to remove the old Paper compileOnly dependency and replace it with the paperweight dependency.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-26-1&#34;&gt;&lt;a id=&#34;__codelineno-26-1&#34; name=&#34;__codelineno-26-1&#34; href=&#34;#__codelineno-26-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;dependencies&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-26-2&#34;&gt;&lt;a id=&#34;__codelineno-26-2&#34; name=&#34;__codelineno-26-2&#34; href=&#34;#__codelineno-26-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;paperweight&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;paperDevBundle&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;quot;26.1.2.build.63-stable&amp;quot;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-26-3&#34;&gt;&lt;a id=&#34;__codelineno-26-3&#34; name=&#34;__codelineno-26-3&#34; href=&#34;#__codelineno-26-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The version entered here is the same as for Paper. You just remove the group and artefact id.Paper uses the obfuscated jar.This requires us to actually reobfuscate our jar before building.We can do this again by configuring a task.This time we configure the &lt;code&gt;assemble&lt;/code&gt; task and set a &lt;code&gt;dependsOn&lt;/code&gt; on it.&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-27-1&#34;&gt;&lt;a id=&#34;__codelineno-27-1&#34; name=&#34;__codelineno-27-1&#34; href=&#34;#__codelineno-27-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;tasks&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-27-2&#34;&gt;&lt;a id=&#34;__codelineno-27-2&#34; name=&#34;__codelineno-27-2&#34; href=&#34;#__codelineno-27-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;assemble&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-27-3&#34;&gt;&lt;a id=&#34;__codelineno-27-3&#34; name=&#34;__codelineno-27-3&#34; href=&#34;#__codelineno-27-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dependsOn&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;reobfJar&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-27-4&#34;&gt;&lt;a id=&#34;__codelineno-27-4&#34; name=&#34;__codelineno-27-4&#34; href=&#34;#__codelineno-27-4&#34;&gt;&lt;/a&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-27-5&#34;&gt;&lt;a id=&#34;__codelineno-27-5&#34; name=&#34;__codelineno-27-5&#34; href=&#34;#__codelineno-27-5&#34;&gt;&lt;/a&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;admonition note&#34;&gt;&lt;p class=&#34;admonition-title&#34;&gt;Note&lt;/p&gt;&lt;p&gt;In the future Paper plans to use a non-obfuscated jar for servers.This will make this step unnecessary.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;And that&#39;s it.Now you can use nms as comfortably as possible.&lt;/p&gt;&lt;h2 id=&#34;running-a-server-with-your-jar&#34;&gt;Running a server with your jar&lt;/h2&gt;&lt;p&gt;To quickly test your plugin, you can start a server directly.All you need to do is add the &lt;a href=&#34;https://github.com/jpenilla/run-task&#34;&gt;run-task plugin&lt;/a&gt; to your build file.&lt;/p&gt;&lt;p&gt;I&#39;ll refrain from simply copying their readme here, as I can&#39;t add any more value to it.&lt;/p&gt;&lt;h2 id=&#34;thank-you&#34;&gt;Thank you!&lt;/h2&gt;&lt;p&gt;Thank you for sticking with me so far.You now have a very good understanding of Minecraft development with Gradle.&lt;/p&gt;&lt;p&gt;Thanks for reading!If you liked this post, or have some questions, feel free to come by my discord and have a chat!&lt;/p&gt;&lt;p&gt;&lt;a href=&#34;https://discord.chojo.dev&#34;&gt;&lt;img alt=&#34;Discord Server invite for Chojos Coding Hell&#34; src=&#34;https://discordapp.com/api/guilds/1120671561368748092/widget.png?style=banner3&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Or write me a mail at &lt;code&gt;mail [at] chojo [dot] dev&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;If you want to support me, feel free to sponsor me via &lt;a href=&#34;https://github.com/sponsors/rainbowdashlabs&#34;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</description><link>https://chojo.dev/blog/2023/08/04/minecraft-development-with-gradle-basic-and-advanced--a-guide/</link> <pubDate>Fri, 04 Aug 2023 13:04:03 +0200</pubDate><source url="https://chojo.dev/feed_rss_created.xml">Chojo - Dev Blog and Portfolio</source><guid isPermaLink="true">https://chojo.dev/blog/2023/08/04/minecraft-development-with-gradle-basic-and-advanced--a-guide/</guid> </item> <item> <title>The plugin main class. A constant naming discussion!</title> <author>chojo</author> <description>&lt;h1 id=&#34;the-plugin-main-class-a-constant-naming-discussion&#34;&gt;The plugin main class. A constant naming discussion!&lt;/h1&gt;&lt;p&gt;&lt;a href=&#34;../../../../de/minecraft_main_class/&#34;&gt;German Version&lt;/a&gt;&lt;/p&gt;&lt;p&gt;The minecraft main class, or the class which usually extends &lt;code&gt;JavaPlugin&lt;/code&gt;, is nearly always subject of discussions when it comes to naming. In this post I try to explain my point of view, and also show my approach on naming them.&lt;/p&gt;&lt;!-- more --&gt;&lt;p&gt;To understand why we always discuss this, we first have to understand what the so called &lt;code&gt;Main&lt;/code&gt; class actually is.&lt;/p&gt;&lt;h2 id=&#34;the-java-main-class&#34;&gt;The java main class&lt;/h2&gt;&lt;p&gt;In java, the main class is the class which holds the main method &lt;code&gt;public static void main(String... args)&lt;/code&gt;.The class holding the main method itself does already not need to be named &lt;code&gt;Main&lt;/code&gt;.This &lt;code&gt;main&lt;/code&gt; method serves as the entry point into our application.Usually people create their application instance here and build up the startup logic of their application.Without this method our application would never do anything and can not be executed.When we build our application, we also need to point to our main class in our build file, to tell the jvm where to actually find our main class.&lt;/p&gt;&lt;h2 id=&#34;the-plugin-main-class&#34;&gt;The plugin &#34;main&#34; class&lt;/h2&gt;&lt;p&gt;The class we call main in our plugins has some very clear differences.&lt;/p&gt;&lt;ol&gt;&lt;li&gt;We don&#39;t have the main method.&lt;/li&gt;&lt;li&gt;We do not create our own instance of our plugin/application.&lt;/li&gt;&lt;li&gt;We don&#39;t have a single entrypoint into our application. In fact, we have at least three:&lt;ul&gt;&lt;li&gt;Constructor - When the server creates our instance&lt;/li&gt;&lt;li&gt;onLoad - When the server loads our plugin&lt;/li&gt;&lt;li&gt;onEnable - When the server enables our plugin&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;The jvm does not call our main methods itself, but the server does.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;em&gt;&#34;But I declare my main class in the plugin.yml&#34;&lt;/em&gt; you might say.Yes we do, however this naming is probably the main issue we have till today.&lt;/p&gt;&lt;p&gt;What we actually declare is not a main class as defined by java, but point at a class extending &lt;code&gt;JavaPlugin&lt;/code&gt; or &lt;code&gt;Plugin&lt;/code&gt;.The correct naming for this parameter should probably be &lt;code&gt;plugin_class&lt;/code&gt; or just &lt;code&gt;plugin&lt;/code&gt;.It is not a main class by all means, as defined by java.&lt;/p&gt;&lt;h2 id=&#34;the-ideal-name&#34;&gt;The &#34;ideal&#34; name&lt;/h2&gt;&lt;p&gt;I personally go with &lt;code&gt;tld.domain.pluginname.PluginName&lt;/code&gt; or &lt;code&gt;tld.domain.pluginname.PluginNamePlugin&lt;/code&gt;&lt;/p&gt;&lt;p&gt;A plugin with the name &lt;code&gt;Maya&lt;/code&gt; by me using the domain &lt;code&gt;chojo.dev&lt;/code&gt; would then be named: &lt;code&gt;dev.chojo.maya.Maya&lt;/code&gt; or &lt;code&gt;dev.chojo.maya.MayaPlugin&lt;/code&gt;&lt;/p&gt;&lt;p&gt;This won&#39;t be by far the holy grail for naming.However, this solves two big issues:&lt;/p&gt;&lt;h3 id=&#34;1-namespace-conflicts&#34;&gt;1. Namespace conflicts&lt;/h3&gt;&lt;p&gt;On minecraft servers we always share the server with multiple plugins which are most probably not written all by ourselves.We might run our plugin on a server with 50 or even 100 other plugins.Therefore, it is important that we choose a unique namespace which is &lt;code&gt;tld.domain&lt;/code&gt;.Furthermore, we need to avoid conflicts with our own plugins.That&#39;s why we add our &lt;code&gt;pluginname&lt;/code&gt; as well and end up with &lt;code&gt;tls.domain.pluginname&lt;/code&gt;.Of course, we now have a unique namespace for our plugin already, and we could easily call our class main.I personally prefer to call my class like I call my plugin, so &lt;code&gt;PluginName&lt;/code&gt; or &lt;code&gt;PluginNamePlugin&lt;/code&gt; to make clearer that the class extends the Plugin class.&lt;/p&gt;&lt;h3 id=&#34;2-class-name-conflict&#34;&gt;2. Class name conflict&lt;/h3&gt;&lt;p&gt;&lt;em&gt;&#34;Why not call it Main?&#34;&lt;/em&gt; For that to understand, you have to think about the users of your plugin.Or just think about it in general, if everyone would call their plugin class &lt;code&gt;Main&lt;/code&gt;.When using an api of a plugin you use the plugin class in at least 90% of the cases.Imagine searching it, and you get a list of 6 Main classes by 6 different plugins.A good start for errors and confusion already.&lt;/p&gt;&lt;p&gt;Or if you use multiple apis or plugin classes in your own plugin by others you would probably end up with something like this:&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-0-1&#34;&gt;&lt;a id=&#34;__codelineno-0-1&#34; name=&#34;__codelineno-0-1&#34; href=&#34;#__codelineno-0-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;dev&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;someone&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;nele&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nele&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dev&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;someone&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;nele&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getInstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-2&#34;&gt;&lt;a id=&#34;__codelineno-0-2&#34; name=&#34;__codelineno-0-2&#34; href=&#34;#__codelineno-0-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;dev&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;someone&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;lara&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lara&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dev&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;someone&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;lara&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getInstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-0-3&#34;&gt;&lt;a id=&#34;__codelineno-0-3&#34; name=&#34;__codelineno-0-3&#34; href=&#34;#__codelineno-0-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;dev&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;someone&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;maya&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Main&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;maya&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dev&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;someone&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;maya&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;Main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getInstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Instead, if you follow the naming mentioned above, it would look like this:&lt;/p&gt;&lt;div class=&#34;language-java highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span id=&#34;__span-1-1&#34;&gt;&lt;a id=&#34;__codelineno-1-1&#34; name=&#34;__codelineno-1-1&#34; href=&#34;#__codelineno-1-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;NelePlugin&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nele&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;NelePlugin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getInstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-1-2&#34;&gt;&lt;a id=&#34;__codelineno-1-2&#34; name=&#34;__codelineno-1-2&#34; href=&#34;#__codelineno-1-2&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;LaraPlugin&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;lara&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;LaraPlugin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getInstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;span id=&#34;__span-1-3&#34;&gt;&lt;a id=&#34;__codelineno-1-3&#34; name=&#34;__codelineno-1-3&#34; href=&#34;#__codelineno-1-3&#34;&gt;&lt;/a&gt;&lt;span class=&#34;n&#34;&gt;MayaPlugin&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;maya&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;MayaPlugin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;getInstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Isn&#39;t this much more readable?We avoid not only namespace conflicts but also class name conflicts. We communicate clearly that our class is a plugin and also directly show our plugins name with it as well.&lt;/p&gt;&lt;h2 id=&#34;i-dont-have-a-domain&#34;&gt;I don&#39;t have a domain&lt;/h2&gt;&lt;p&gt;That is not a problem. You probably have a GitHub or GitLab account already and if not I strongly recommend to make one.We use domains because we know that only we use it (ideally).So everything you need is something unique that is bound to you, which is the case when you have a GitHub or GitLab account.In that case you can use &lt;code&gt;io.github.username&lt;/code&gt; or &lt;code&gt;io.gitlab.username&lt;/code&gt; as your namespace.You can even use this namespace for publishing to maven central!&lt;/p&gt;&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;&lt;p&gt;Plugins should use their own namespace usually using an inversed domain &lt;code&gt;tld.domain&lt;/code&gt;, followed by the plugin name &lt;code&gt;pluginname&lt;/code&gt;. The plugin class itself should contain the name of the Plugin, optionally suffixed with &lt;code&gt;Plugin&lt;/code&gt; to show that it is a plugin class.&lt;/p&gt;&lt;p&gt;So next time you create and name your plugin class (not main class), consider this and choose a better name to make a better world!&lt;/p&gt;&lt;p&gt;Thanks for reading!If you liked this post, or have some questions, feel free to come by my discord and have a chat!&lt;/p&gt;&lt;p&gt;&lt;a href=&#34;https://discord.chojo.dev&#34;&gt;&lt;img alt=&#34;Discord Server invite for Chojos Coding Hell&#34; src=&#34;https://discordapp.com/api/guilds/1120671561368748092/widget.png?style=banner3&#34; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Or write me a mail at &lt;code&gt;mail [at] chojo [dot] dev&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;If you want to support me, feel free to sponsor me via &lt;a href=&#34;https://github.com/sponsors/rainbowdashlabs&#34;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</description><link>https://chojo.dev/blog/2023/08/03/the-plugin-main-class-a-constant-naming-discussion/</link> <pubDate>Thu, 03 Aug 2023 13:58:00 +0200</pubDate><source url="https://chojo.dev/feed_rss_created.xml">Chojo - Dev Blog and Portfolio</source><guid isPermaLink="true">https://chojo.dev/blog/2023/08/03/the-plugin-main-class-a-constant-naming-discussion/</guid> </item> </channel></rss>