// voxen field notes

Minecraft 26.x for Plugin Developers: Java 25, Unobfuscated Jars, New Versions

· 7 min read · [ GUIDE ] · by Matteo Orazietti

Minecraft 26.1 was the biggest break for plugin developers in years, and the new version number was the least of it. The server now needs Java 25, the server jar ships with readable names, and Paper dropped the remapper that quietly translated old plugins. If your plugin only uses the Bukkit, Spigot or Paper API, the move is a rebuild. If it touches server internals, it is a port. This is what changed and what to do about each part.

The new version numbers

The last release with a "1." prefix was 1.21.11, in December 2025. Since 2026 Java Edition usesyear.drop.hotfix: the first drop of 2026 is 26.1, its hotfixes are 26.1.1 and 26.1.2, and the next drops are 26.2 and 26.3.

VersionReleasedJava needed
1.21.11December 2025Java 21
26.124 March 2026Java 25
26.1.11 April 2026Java 25
26.1.29 April 2026Java 25
26.216 June 2026Java 25
26.315 September 2026Java 25

26.4 is in snapshots as of October 2026. On Paper, 26.2 has stable builds and 26.3 builds are still pre-release, while 1.21.11 no longer receives fixes: only the 26.x line does.

Change 1: Java 25 is mandatory

Every 26.x server needs Java 25. PaperMC's documentation is direct about it: Paper requires at least Java 25 to run on 26.1 and newer. Two consequences for a plugin developer:

  • Your build has to target Java 25 when you compile against the 26.x API, because the API jar itself is built for it.
  • A plugin built for Java 25 will not load on a Java 21 server. If you ship one jar for both 1.21.11 and 26.x servers, the 1.21.11 side will reject it. Either keep two builds or drop 1.21.

The mismatch shows up as UnsupportedClassVersionError with class file version 69, which is Java 25. The full table of Java versions per Minecraft release is in Which Java Version Does a Minecraft Server Need?

Change 2: unobfuscated server jars, and no more remapper

Until 1.21.11 the server shipped with obfuscated internal names, and plugins that reached intonet.minecraft (NMS) used Spigot's mapped names. Paper translated those names at load time with an internal remapper. From 26.1 Mojang ships the server jar with real class, method and field names, Spigot moved to unobfuscated jars as well, and Paper removed its plugin remapper.

The result: a plugin that uses Spigot-mapped internal names, directly or through reflection, does not work on 26.1 and newer, on Paper or on Spigot. A class like EntityHuman simply is not there any more.

terminal — server console
java.lang.NoClassDefFoundError: net/minecraft/world/entity/player/EntityHuman
Not affected: plugins that only use the Bukkit, Spigot or Paper API. The remapper change touches internals only. Check your imports and any Class.forName or reflection strings for net.minecraft or org.bukkit.craftbukkit before assuming you are safe.

Change 3: version parsing that expects "1."

A lot of plugins read the server version to toggle features: split on the dot, take the second number, compare it to 13 or 20. On 26.x that logic returns nonsense. "26.2".split(".")[1] is 2, so the plugin thinks it is running on something older than 1.8 and disables half its features, or crashes on a missing branch.

terminal — Java
// Breaks on 26.x: assumes "1.<minor>"
int minor = Integer.parseInt(version.split("\\.")[1]);
boolean modern = minor >= 13;

// Works on both schemes
String[] p = version.split("\\.");
int major = Integer.parseInt(p[0]);
boolean isModern = major >= 26 || Integer.parseInt(p[1]) >= 13;

Change 4: api-version in plugin.yml

On 26.x the api-version field takes the major and minor number, like '26.1'. A bare'26' has been reported to fail. The server also refuses any plugin that declares a newer API than its own, so a plugin with api-version: '26.2' will not load on a 26.1 server. Declare the oldest 26.x version you actually support, not the newest you built against.

terminal — plugin.yml
name: MyPlugin
version: 2.0.0
main: com.example.myplugin.MyPlugin
api-version: '26.1'

Every other field is covered in plugin.yml Explained.

The migration checklist

  1. Install JDK 25 and set your build to target it.
  2. Bump the API dependency to a 26.x paper-api or spigot-api build. Prefer the newest stable line over pre-release builds.
  3. Set api-version to the oldest 26.x version you support, in '26.x' form.
  4. Search for internals: imports and reflection strings mentioning net.minecraft or CraftBukkit. Rewrite them against the readable names, or replace them with API calls where the API now covers the feature.
  5. Fix version parsing so it handles both 1.x and 26.x.
  6. Update dependencies first: Vault, ProtocolLib, PlaceholderAPI and the like need their own 26.x builds.
  7. Test on a copy of the server, with a backup of the world and configs, before touching production.

For the general process of moving a plugin between versions, including the case where you only have the .jar, see How to Update a Minecraft Plugin to 1.21 and 26.x.

Doing it with Voxen

Voxen builds Spigot, Paper and Purpur plugins from 1.8.8 up to 26.3, and compiles 26.x targets with Java 25. The Plugin Porter takes your .jar or source, decompiles it if needed, migrates the code to the Minecraft version you pick with AI and recompiles it, so the Java target, the API dependency and the api-version line up without you editing build files. You still test the result on your server: a compiled jar is the start of the check, not the end of it.