Skip to content
Development

Minestom and custom jars

Run your own server.jar in a group and connect a Minestom server to the cloud with the MinestomBridge.

A group does not have to run Paper or Spigot. With a custom jar it starts any server.jar you give it, for example a Minestom server. The MinestomBridge connects such a server to the cloud, so it appears like any other server and can use the full API.

Reference: Minestom API Javadoc.

A custom jar group

Choose Custom jar when you create the group in the web panel, CUSTOM in group create, or "server_jar": "CUSTOM" in the API. Nothing is downloaded. Then put your jar into the template:

templates/<group>/default/server.jar

You can upload it on the Templates page of the web panel. The group’s servers wait until the jar is there. For static groups it goes into servers/templates/<group>/default/ on their wrapper.

The wrapper starts it with java -jar server.jar and the group’s memory and Java arguments. It adds no cloud plugin, no Paper/Spigot configuration and no start arguments. Everything the server needs is in the cloud.json in its folder: name, port, forwarding mode and secret, and the token for the wrapper.

The MinestomBridge

Add it to your Minestom server, in the same version as the cloud:

repositories {
    mavenCentral()
    maven { url = 'https://repo.rexlcloud.de/snapshots' }
}

dependencies {
    implementation 'net.minestom:minestom:2026.10.07-26.2'
    implementation 'de.rexlcloud:minestom-api:2.0.22'
}

Build a fat jar (e.g. with the Shadow plugin), because the wrapper starts it with java -jar.

import de.rexlcloud.bridge.RexlCloudBridge;
import net.minestom.server.MinecraftServer;

public final class Main {

    public static void main(String[] args) {
        var cloud = RexlCloudBridge.getInstance();
        // Velocity/BungeeCord forwarding like the proxies use
        var server = MinecraftServer.init(cloud.getAuth());

        // ... create instances, register events ...

        // Connects to the wrapper; the cloud API is usable from now on
        cloud.initialize();
        server.start("0.0.0.0", cloud.getPort());
    }
}

After initialize() the server has the same RexlCloudApi as Paper plugins; see Plugins for servers and proxies.

Good to know

  • Started by hand without a cloud.json, the server runs offline on port 25565 and does not connect to a cloud. Handy for testing.
  • When the cloud stops the server or its wrapper goes away for good, the server stops. Change that with setShutdownHook.
  • The bridge must match the cloud’s version. Rebuild your server when you update the cloud.

Something missing? Tell us on Discord.