The first serious job anyone opening a Minecraft server from scratch runs into is installing the plugin pack correctly and getting it running. Most of the guides you find online either date from the old Bukkit era of 2014 or are YouTube videos that skip the version information entirely. This page explains, as of 2026, how to install a plugin pack on Paper 1.20.x and newer servers, how to manage dependencies, how to prepare the config and permissions sections, and how to solve the errors you are most likely to meet — from beginning to end.
Before you read the guide there is one thing you must be sure of: the plugin pack in your hands has to be compatible with your Minecraft version. The chance of a pack built for 1.8 working on 1.20 is close to zero. The reverse holds too — modern libraries written for 1.20 throw NoClassDefFoundError on a 1.8 server. 90% of installations done without checking version compatibility fail.
The Difference Between Spigot, Paper, Bukkit and Folia
Before you install your plugin pack you need to know what your server core is, because the pack may have been compiled for a specific core. Choosing the wrong core causes 30% of the plugins not to work, plus performance losses you never notice.
Bukkit
Bukkit is the original plugin API, released in 2011. It is no longer maintained today and the great majority of modern plugins will not run on a Bukkit server. If you still see craftbukkit.jar in a server guide, that guide is out of date. Installing a plugin pack on Bukkit makes no sense today.
Spigot
Spigot is a fork of Bukkit that carried on being developed. It has been active since 2012 and a lot of free plugins are still written for Spigot. But in performance terms it has fallen a long way behind Paper. It works for a small Survival server, but TPS problems are unavoidable on servers with 30+ players.
Paper
Paper is the de facto standard used by 80% of server owners in 2026. Because it is Spigot compatible, Spigot plugins run on it too, but Paper is far more efficient at chunk loading, entity ticking and async IO. On Paper there are three configuration layers: paper.yml, spigot.yml and bukkit.yml. When you buy a plugin pack, Paper should be your first choice.
Folia
Folia is the multi-threaded version of Paper introduced in 1.20. It processes each chunk on a separate thread, which makes an incredible performance difference on servers with 500+ players. But for a plugin to be Folia compatible it has to be specifically rewritten. Ordinary Paper plugins do not run on Folia. If the plugin pack has no Folia label, do not attempt to install it on Folia — the server will not start.
What Does a Plugin Pack Contain?
A Minecraft plugin pack is a .zip or .rar archive. When you unpack it, it typically contains: a plugins folder (jar files), a world folder (if a map is used), config presets, ready-made server.properties settings and, optionally, an INSTALL.txt file. In professional packs, the installation instructions and the dependency list are given in a separate document.
Unpack the archive and look through its contents before installing. If there are only jar files — which is the most common case — it means you will be doing the config work from scratch. If there is a complete folder structure (plugins/, world/, server.properties), copying all the files into your server's root directory is enough.
Step 1: Stop Your Server
Adding plugins while the server is running is always risky. Many plugins ask for other plugins' APIs the moment they load; when they are added at runtime the dependency chain is not built and the plugin either does not work or brings the server down. Always stop the server before installing.
The vanilla console command. It shuts the server down safely and saves every world.
stopIf you are using a panel (Pterodactyl, Plesk, aaPanel), shut the server down from the interface with the Stop button. Ctrl+C, or killing the server by force, leads to chunk corruption — and then you spend hours trying to repair the world.
Step 2: Find the Plugins Folder
The first time the server runs it automatically creates a folder called plugins/. If that folder is not there, you need to run the server at least once. You can also create it by hand even while the server is stopped; once the Minecraft server core finds the folder it will scan the jar files inside it.
On a standard Paper server the folder structure looks like this:
server/
├── paper-1.20.4-XXX.jar # Server core
├── server.properties # Basic settings
├── eula.txt # Licence acceptance
├── world/ # Main world
├── world_nether/ # Nether dimension
├── world_the_end/ # End dimension
├── logs/ # Log files
├── cache/ # Mojang cache
├── plugins/ # ← RIGHT HERE
│ ├── PluginName.jar
│ ├── AnotherPlugin.jar
│ └── PluginName/ # Plugin config folder (created on the first run)
│ ├── config.yml
│ └── messages.yml
├── paper.yml # Paper settings
├── spigot.yml # Spigot settings
└── bukkit.yml # Bukkit settingsStep 3: Copy the Jar Files into the Plugins Folder
Copy every file with a .jar extension from inside the plugin pack into your server's plugins/ folder. If there are subfolders (for example plugins/EssentialsX/) you need to copy those as well — they usually hold the plugin's pre-configured config files.
If you have SSH access to the VPS, using scp or rsync is the fastest method:
# Uploading the plugins from your local machine to the VPS
scp -P 22 plugin-pack.zip root@server-ip:/home/minecraft/server/
# Unpacking it on the server
ssh root@server-ip
cd /home/minecraft/server
unzip plugin-pack.zip -d plugins/
# Fixing the file permissions
chown -R minecraft:minecraft plugins/
chmod -R 755 plugins/If you are using the Pterodactyl panel, go to the File Manager, click the Upload button and drag the jar files into the plugins folder. The interface is similar on panels such as Aaron. If you are using FTP (FileZilla), go up to the parent folder and drag and drop into plugins/.
Step 4: Install the Dependencies
The most critical step in installing a plugin pack is dependency management. 70% of modern Minecraft plugins depend on other plugins. If those dependencies are not installed, the plugin either does not run at all or runs with critical features missing. The most common dependencies:
| Dependency | What is it for? | Who usually needs it? |
|---|---|---|
| Vault | Abstracts the economy, chat and permissions API | Economy plugins, shop plugins, permission plugins |
| PlaceholderAPI (PAPI) | Dynamic variables such as %player_name%, %server_tps% | Scoreboard, tab, hologram and chat format plugins |
| ProtocolLib | Player-server communication at the packet level | Disguise, hologram and custom UI plugins |
| WorldEdit | World editing commands (//wand, //pos1) | WorldGuard, building plugins |
| WorldGuard | Region protection, PvP zones | Economy, claim and safe-zone plugins |
| Citizens | Creating and managing NPCs | Shop NPC and quest NPC plugins |
| LuckPerms | Advanced permission system | Almost every rank-based plugin |
| Multiverse-Core | Managing multiple worlds | SkyBlock and minigame plugins |
| HolographicDisplays | Floating text | Top player lists, NPC labels |
Professional plugin packs list their dependencies in an INSTALL.txt or README.md file. If the pack has no such file, open each plugin's plugin.yml and check the depend: and softdepend: lines. depend is mandatory; without it the plugin will not run. softdepend is optional; without it some features will not work but the plugin still loads.
Prints plugin.yml straight from inside the jar file in your terminal. The fastest way to check dependencies.
unzip -p EssentialsX-2.20.1.jar plugin.yml | grep -E 'depend|softdepend'Step 5: Start the Server
Once every plugin and dependency is in place, start the server. The first start lets the config files be created for each plugin. Watch the log carefully at this stage.
# Starting it directly on the VPS
java -Xms2G -Xmx4G -jar paper-1.20.4-XXX.jar nogui
# Or with Aikar's flags (recommended)
java -Xms4G -Xmx4G -XX:+UseG1GC -XX:+ParallelRefProcEnabled \
-XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions \
-XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 \
-XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M \
-XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 \
-XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 \
-XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 \
-XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 \
-Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true \
-jar paper-1.20.4-XXX.jar noguiWatch for these lines in the log stream: [INFO] Loading PluginName v1.0.0 → the plugin loaded. [ERROR] Could not load plugin → the plugin failed to load. Could not find dependency → a dependency is missing. Note down every ERROR line; there is a troubleshooting section further down.
Step 6: Set Up the Config Files
After the first start the server automatically creates plugins/PluginName/config.yml for every plugin. You then need to stop the server again, open these files one by one and edit them to suit your needs. The default settings will not match your server's profile — they are either far too loose or far too strict.
Plugin packs mostly ship with pre-configured config files. In that case you do not have to do anything by hand; plugins/PluginName/config.yml is already there, ready made, inside the pack. When the server runs it does not overwrite an existing config.
Common config mistakes
- Broken YAML indentation: YAML does not accept the tab character, only spaces. A single tab starts the server with no plugins at all.
- UTF-8 BOM: editors such as Windows Notepad add a BOM at the start of the file; the Linux server does not recognise that character. Use VSCode or Notepad++.
- Missing apostrophe/quote: in messages containing special characters, write them inside single quotes as
message: 'Hello!'. Double quotes bring escaping problems. - Clashing port/ID: a clash occurs when two plugins try to create a table with the same name in the same MySQL database. Give each plugin its own
table_prefix.
Step 7: Set Up the Permissions System (LuckPerms)
Plugins come with commands. The system that decides who can use those commands is permissions. In the old Bukkit days there was PermissionsEx, but LuckPerms is the de facto standard now. If LuckPerms is in your pack, the commands below are all you need to build your groups and permissions.
The default group every new player is assigned to automatically.
/lp creategroup defaultThe group for players with the VIP rank.
/lp creategroup vipThe group for the server staff.
/lp creategroup adminAdds a permission to a group.
/lp group default permission set essentials.homeMakes the group inherit permissions from another group.
/lp group vip parent add defaultAssigns a group to a player.
/lp user KEYDAL parent add adminLuckPerms has a web editor: type /lp editor and click the link it produces, and you can edit all the permissions by drag and drop in your browser. After you save the changes, all you have to do is paste the code it gives you into the console.
Step 8: The Database Connection (If There Is One)
Large plugin packs keep their data in a MySQL or MariaDB database. That approach is much faster than file-based storage and is mandatory when you are running multiple servers (a proxy network). If there is a plugin in your pack that uses a database, you first need to install MySQL/MariaDB.
# Installing MariaDB on Ubuntu/Debian
apt update && apt install -y mariadb-server
mysql_secure_installation
# Creating the database and the user
mysql -u root -p
CREATE DATABASE mcserver CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'mcuser'@'localhost' IDENTIFIED BY 'your-strong-password';
GRANT ALL PRIVILEGES ON mcserver.* TO 'mcuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;In plugin config files the MySQL connection is usually defined like this:
database:
enabled: true
host: 127.0.0.1
port: 3306
name: mcserver
username: mcuser
password: 'your-strong-password'
table-prefix: 'plg_'
useSSL: falseStep 9: Testing and Verification
The server has started, the logs are clean, the plugin configs are ready. Now join the server as a test player and try the critical commands of each plugin. If not all of them work — and especially if you find that many of them do not — you have a dependency or a permission problem.
Shows the list of installed plugins. A green name = it is running. A red name = it loaded with an error.
/pluginsThe short form of the /plugins command.
/plShows the version and dependency information for a specific plugin.
/version EssentialsXIf a plugin shows up red in the /plugins list, open logs/latest.log and read the error it produced at load time. With 95% probability there is either a missing dependency or a version mismatch.
The 10 Most Common Installation Mistakes
1. The Wrong Minecraft Version
The plugin pack was written for 1.8 but your server is running 1.20. In that case the plugins either do not load or throw strange errors. Always ask which version range the pack supports before you buy it.
2. A Missing Dependency
You installed EssentialsX but there is no Vault. The result: the economy commands do not work. The log says [ERROR] Could not find dependency: Vault. Install Vault and restart the server.
3. An Incompatible Java Version
A 1.17+ Paper server wants Java 17. 1.20.5+ now wants Java 21. If you try to start it on an older Java version you get UnsupportedClassVersionError. Check with java -version and install JDK 21 if you need to.
4. The Plugins Folder Is in the Wrong Place
Putting the folder somewhere wrong, such as world/plugins, instead of the server root directory. The plugins do not load. The folder must be in the same directory as the server jar.
5. A Corrupt Jar File
The file broke during download, or something went wrong while unzipping. The server says Invalid plugin file. Download the pack again and verify the MD5 checksum.
6. Two Plugins Clash
Two plugins that listen for the same command or event interfere with each other. Example: EssentialsX and CMI both provide the same /home command. You cannot run both; you have to pick one.
7. A Port Clash
Plugins that open their own web server, such as Dynmap, use port 8123. If another service is holding that port, it crashes Dynmap. Change the port in the config.
8. A Permission Clash
The permission plugin does not recognise the plugins' permission nodes. Players get a no permission reply to every command. Position LuckPerms as one of the dependencies you install first.
9. An Outdated Config File
After you update a plugin, the old config.yml does not contain the new fields. The plugin falls back on default values, and sometimes crashes. Back up the config before updating, and update it by hand using the new version's config as your reference.
10. Not Enough Disk Space
On cheap VPS boxes in particular, 20 GB of disk fills up fast. Logs, world backups and plugin caches all take space. Check with df -h, then find and clean up the full folders with du -sh *.
Monitoring Performance
Monitoring the server's performance after installation is the only way to tell whether the plugin pack is too heavy for the server. The Spark profiler is the standard tool for this.
If TPS is below 20, your plugin pack is too heavy for your server. You either need to add RAM/CPU or move to a lighter pack. Spark shows how much tick time each plugin consumes; with that information you can make the right optimisation.
A Ready-Made Plugin Pack, or From Scratch?
Reading this guide should have shown you just how complicated the installation process is. A small server needs 15-20 plugins, a medium-sized server 40-60, and a competitive server 80-120. Installing each one and making them all compatible with one another takes a novice server owner an average of 2-3 weeks. A professionally prepared plugin pack brings the same job down to 2-3 hours.
Why the Plugin Load Order Matters
Paper follows a particular order when loading plugins at server startup. That order is determined by the load, depend and softdepend fields in plugin.yml. The most common cause of a loading problem is that another plugin a plugin needs has not been loaded yet.
There are three load categories:
- STARTUP: the plugin is loaded at server startup (the default)
- POSTWORLD: the plugin is loaded after the worlds have loaded; plugins that need world data, such as WorldGuard and WorldEdit, use this mode
- startup: for special scenarios; things started at the API level, such as ProtocolLib
The structure you will meet in an example plugin.yml:
name: ChestShop
version: 3.12.2
main: com.Acrobot.ChestShop.ChestShop
author: Acrobot
api-version: 1.13
load: POSTWORLD
depend: [Vault]
softdepend: [PlaceholderAPI, WorldGuard, Towny]
commands:
chestshop:
description: ChestShop admin commands
aliases: [cs, shopadmin]Reading that file tells you a great deal: Vault is essential for ChestShop to work (depend), extra features are unlocked if PlaceholderAPI/WorldGuard/Towny are present (softdepend), and it starts after the world has loaded (load: POSTWORLD). Whenever a plugin throws a Could not load
error, always open its plugin.yml and check these fields.
Plugin Naming and Folder Organisation
In large plugin packs the plugins/ folder can be filled with 60-100 jars. Finding the right plugin in that chaos takes hours. Professional pack managers use this organisation system:
- Keep jar names short:
EssentialsX.jarrather thanEssentialsX-2.20.1.jar(the version number is inside the jar, and renaming it on every update is pointless) - Create a
plugins/disabled/folder; move any jars you want to disable temporarily into it (Paper does not scan it) - Keep the previous versions under
plugins/backup/ - Take a double backup before every update: the complete pack and the
plugins/folder
The 5 Best Update Checking Tools
- PluginUpdater: automatically checks for new plugin versions as the server starts and downloads them into the
plugins/update/folder - AutoUpdater: sends a notification when there is a new version on Spigot
- UpdateChecker: mail/webhook alerts for critical CVE vulnerabilities
- McSpark: automatically posts performance metrics to Discord
- Prometheus exporter: TPS, MSPT, player count — connects to Grafana
Frequently Asked Questions
I installed the plugin pack but some entries are grey in the /plugins list — why?
Grey means disabled
. The plugin loaded but was disabled either by the enabled: false setting in its config or by another plugin. Open the config file, set the enabled field to true and restart the server.
Is it harmful to use the /reload command to update a plugin?
Yes, it is harmful. The /reload command cannot call plugins' onDisable
method properly; event listeners stay in memory, scheduler tasks get duplicated and memory leaks appear. The Paper developers tell you not to use this command. Always do a full restart.
Two plugins have the same name but different versions — what happens if I install both?
Paper cannot load either of them and throws an Ambiguous plugin name error. Remove one of them from the plugins folder or rename it. In a clash, prefer the newer version.
Does the licence break if I copy the plugin pack to another server?
For most professional packs the licence is not tied to the server IP but to the KEYDAL ID. So you can run it on different servers with the same licence, but only one server can be active at a time. The exact situation should be checked with the seller; transferring a licence usually requires the seller's approval.