<?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>DEV Community: Jatin | QuarryAI</title>
    <description>The latest articles on DEV Community by Jatin | QuarryAI (@quarryai).</description>
    <link>https://dev.to/quarryai</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4208027%2Fa0f91fd2-d898-46a3-8483-c0011e7c4835.png</url>
      <title>DEV Community: Jatin | QuarryAI</title>
      <link>https://dev.to/quarryai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/quarryai"/>
    <language>en</language>
    <item>
      <title>How to Create a plugin.yml File for a Minecraft Paper Plugin</title>
      <dc:creator>Jatin | QuarryAI</dc:creator>
      <pubDate>Mon, 26 Oct 2026 07:40:07 +0000</pubDate>
      <link>https://dev.to/quarryai/how-to-create-a-pluginyml-file-for-a-minecraft-paper-plugin-41a0</link>
      <guid>https://dev.to/quarryai/how-to-create-a-pluginyml-file-for-a-minecraft-paper-plugin-41a0</guid>
      <description>&lt;p&gt;How to Create a "plugin.yml" File for a Minecraft Paper Plugin&lt;/p&gt;

&lt;p&gt;If you're starting Minecraft plugin development, one of the first files you'll need to understand is "plugin.yml". It tells your Minecraft server important information about your plugin, including its name, version, main Java class, and commands.&lt;/p&gt;

&lt;p&gt;A plugin can contain perfectly valid Java code and still fail to load if its configuration is incorrect. That's why it's worth learning how this file works before moving on to more complicated features.&lt;/p&gt;

&lt;p&gt;What is "plugin.yml"?&lt;/p&gt;

&lt;p&gt;The "plugin.yml" file is a YAML configuration file placed in the root of your plugin's JAR file. Paper and Bukkit use it to identify and load traditional Java plugins.&lt;/p&gt;

&lt;p&gt;For example, a basic plugin project might look like this:&lt;/p&gt;

&lt;p&gt;MyPlugin/&lt;br&gt;
├── src/&lt;br&gt;
│   └── main/&lt;br&gt;
│       ├── java/&lt;br&gt;
│       │   └── com/example/myplugin/&lt;br&gt;
│       │       └── MyPlugin.java&lt;br&gt;
│       └── resources/&lt;br&gt;
│           └── plugin.yml&lt;br&gt;
└── build.gradle&lt;/p&gt;

&lt;p&gt;When you build the project, your build tool should package "plugin.yml" into the root of the resulting JAR.&lt;/p&gt;

&lt;p&gt;Step 1: Write a basic plugin.yml&lt;/p&gt;

&lt;p&gt;Here is a simple example for a plugin called WelcomePlugin:&lt;/p&gt;

&lt;p&gt;name: WelcomePlugin&lt;br&gt;
version: '1.0.0'&lt;br&gt;
main: com.example.myplugin.MyPlugin&lt;br&gt;
api-version: '1.21'&lt;/p&gt;

&lt;p&gt;description: A simple welcome message plugin&lt;br&gt;
author: ExampleDev&lt;/p&gt;

&lt;p&gt;commands:&lt;br&gt;
  welcome:&lt;br&gt;
    description: Displays a welcome message&lt;br&gt;
    usage: /welcome&lt;br&gt;
    permission: welcome.use&lt;/p&gt;

&lt;p&gt;permissions:&lt;br&gt;
  welcome.use:&lt;br&gt;
    description: Allows the player to use /welcome&lt;br&gt;
    default: true&lt;/p&gt;

&lt;p&gt;This is an example configuration, not a complete working plugin by itself. Your Java class and package must match the "main" value, and the command must be implemented in your code.&lt;/p&gt;

&lt;p&gt;Step 2: Understand the important fields&lt;/p&gt;

&lt;p&gt;"name" — The plugin's display name.&lt;/p&gt;

&lt;p&gt;"version" — The version of your plugin. Quoting the version is a useful habit when writing YAML.&lt;/p&gt;

&lt;p&gt;"main" — The fully qualified name of your plugin's main Java class. If your class is "MyPlugin.java" inside the package "com.example.myplugin", the value should be "com.example.myplugin.MyPlugin".&lt;/p&gt;

&lt;p&gt;"api-version" — Specifies the Minecraft API version your plugin targets. Choose a version supported by the Paper/Bukkit API you are developing against.&lt;/p&gt;

&lt;p&gt;"commands" — Declares commands your plugin provides. Declaring a command doesn't implement its behavior; you must also register its handler in your Java code.&lt;/p&gt;

&lt;p&gt;"permissions" — Defines permissions that can be assigned to players or groups. Make sure the permission names match the checks in your code.&lt;/p&gt;

&lt;p&gt;Step 3: Create the main Java class&lt;/p&gt;

&lt;p&gt;For a basic Bukkit-compatible plugin, the Java class could look like this:&lt;/p&gt;

&lt;p&gt;package com.example.myplugin;&lt;/p&gt;

&lt;p&gt;import org.bukkit.command.Command;&lt;br&gt;
import org.bukkit.command.CommandSender;&lt;br&gt;
import org.bukkit.plugin.java.JavaPlugin;&lt;/p&gt;

&lt;p&gt;public final class MyPlugin extends JavaPlugin {&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@Override
public void onEnable() {
    getLogger().info("WelcomePlugin has been enabled!");
}

@Override
public boolean onCommand(
        CommandSender sender,
        Command command,
        String label,
        String[] args
) {
    if (command.getName().equalsIgnoreCase("welcome")) {
        sender.sendMessage("Welcome to the server!");
        return true;
    }

    return false;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;This example demonstrates the basic command-handling approach. For a production plugin, you may prefer separate command classes and explicit permission checks. The permission declaration in "plugin.yml" alone does not enforce every permission check in your custom code.&lt;/p&gt;

&lt;p&gt;Step 4: Validate your configuration&lt;/p&gt;

&lt;p&gt;Before uploading your plugin to a server, check the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The "main" class points to the correct package and class.&lt;/li&gt;
&lt;li&gt;The YAML indentation uses spaces consistently.&lt;/li&gt;
&lt;li&gt;The command names in "plugin.yml" match those used by your code.&lt;/li&gt;
&lt;li&gt;Your "api-version" is compatible with the API you target.&lt;/li&gt;
&lt;li&gt;The compiled JAR contains "plugin.yml" at its root.&lt;/li&gt;
&lt;li&gt;You test the plugin on a compatible Paper server and inspect the console for errors.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;YAML indentation matters. For example, "description" under "welcome" must be indented beneath the command. Incorrect indentation or invalid YAML syntax can prevent the configuration from being parsed correctly.&lt;/p&gt;

&lt;p&gt;Step 5: Generate a configuration more quickly&lt;/p&gt;

&lt;p&gt;If you're unsure how to structure your configuration, you can write it manually or use a generator as a starting point.&lt;/p&gt;

&lt;p&gt;QuarryAI provides a Paper plugin YAML generator that can help developers create a "plugin.yml" draft without writing every field from scratch:&lt;/p&gt;

&lt;p&gt;Try it here: &lt;a href="https://quarryai.dpdns.org/tools/paper-plugin-yml-generator" rel="noopener noreferrer"&gt;https://quarryai.dpdns.org/tools/paper-plugin-yml-generator&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should still review the generated YAML, verify the main class and API version, and test the finished plugin. A generator can save time on boilerplate, but it cannot replace compatibility checks or testing.&lt;/p&gt;

&lt;p&gt;Final thoughts&lt;/p&gt;

&lt;p&gt;Learning "plugin.yml" is a small but important step toward building Minecraft server plugins. Once you understand the metadata, commands, permissions, and main class fields, you can move on to more advanced features such as event listeners, custom items, configuration files, and database integration.&lt;/p&gt;

&lt;p&gt;The best approach is to understand the configuration, validate it, and test your plugin before deploying it to a live server.&lt;/p&gt;

</description>
      <category>minecraft</category>
      <category>java</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
