Install and Setup Minecraft on Linux: Launcher and Java Server

Featured banner showing one download source splitting into two builds, one blocked by an architecture gate

Mojang publishes two downloads for Minecraft on Linux, and they are not the same product. The desktop launcher starts the game you play.

The server jar starts a world your friends connect to, and it runs on any CPU Java supports. Java 25 is now the floor for that jar, and a launcher package built for one CPU will not install on another.

Java Edition and Bedrock, and which one Linux runs

Minecraft ships as two products that cannot play together. Java Edition has a Linux desktop client and a free server, and Bedrock is the edition Mojang builds for Windows, consoles, phones and Chromebooks.

Mojang publishes no Linux client for Bedrock, so a Microsoft Store purchase of that edition buys nothing on a Linux desktop.

What you wantWhat Mojang offers for LinuxApplies to
The game on your own desktopMinecraft.deb, Minecraft.tar.gz, AUR packagex86-64 machines
A world other players joinserver.jarany CPU with Java 25
The Microsoft Store copy of Bedrocknothingnot on Linux

The Linux download page lists three artifacts with no architecture note and no Java note against any of them. Both launcher files are x86-64 binaries, and the package control file is the only place that says so.

I verified that control file before installing anything. It reports package version 2.1.3, architecture amd64, and a dependency list that runs from GTK through NSS to the audio libraries.

Check the CPU, the distribution and the Java version first

Your CPU architecture, your distribution’s package format and the Java version already on the machine decide which file you need.

Architecture decides which launcher artifact applies

Ask the kernel which machine it is running on.

uname -m

x86_64 means the launcher artifacts apply to you. aarch64 means they do not, which makes the server the half of this page that runs.

The package manager uses a different name for the same thing, which is the name that shows up in an error message.

dpkg --print-architecture

Java, because the floor moved to 25

Release 26.3 was published on 15 September 2026, and the package metadata Mojang serves for it declares a Java component at major version 25. Pick a runtime below that floor and the server stops before it reads a single setting.

Minecraft releaseJava floor
up to 1.168
1.1716
1.18 to 1.20.417
1.20.5 to 1.21.1121
26.1 and later25

Older releases keep their own older floors, which is why a machine serving two Minecraft versions sometimes needs two runtimes side by side.

The account and the disk space

The launcher needs a Microsoft account that owns Java Edition. The server needs no licence at all, so a world for your household costs nothing beyond the machine it runs on.

Plan for about 130 MB of disk once the server unpacks its bundled libraries, and 1 GB of RAM for a small survival world. I measured 129 MB in my own server directory, and the world inside it grows with the terrain players load.

Install the Minecraft launcher on Debian or Ubuntu

The launcher is one package plus a dependency tree. A single flag letter decides what lands on disk, so the download is the step worth slowing down for.

Download the package with the right flag

Capital O names the output file. Lowercase o is the log flag, and it writes the transfer log to the path you gave instead of the package.

The log and the package are nowhere near the same size, so the mix-up shows up the moment you look at them. The log came out at 1,759 bytes and the package is 825,844 bytes.

wget -O Minecraft.deb https://launcher.mojang.com/download/Minecraft.deb

If you want the download to report its progress on screen, the wget command has flags for that which do not touch the destination name.

Install it with apt rather than dpkg

apt installs a local package file and resolves its dependencies in the same run. dpkg installs the file alone and leaves you a second command to repair the dependency errors.

sudo apt install ./Minecraft.deb

The leading ./ is not optional, because without it apt reads the argument as a package name and searches the repositories instead of your disk.

On an x86-64 Ubuntu machine the install finishes with minecraft-launcher 2.1.3 at /usr/bin/minecraft-launcher and a desktop entry in the applications grid. The difference between apt and dpkg shows up on exactly this kind of handed-down package.

Start it and sign in

Launch it from the applications grid or by running the launcher command. It asks for a Microsoft account first, then downloads the game files for the version you pick.

The installed game lives under a hidden directory in your home folder, which is the path mod launchers ask you to point at and the directory to back up alongside your saved worlds.

Install the launcher without a package, or on an ARM machine

Not every Linux machine can take the package route. A distribution with no Debian package support and a board whose CPU the launcher was never built for each need a different answer.

RouteCPU it runs onDistribution it needs
Minecraft.debx86-64Debian, Ubuntu and their derivatives
Minecraft.tar.gzx86-64anything with glibc
A third-party launcher from your repositoriesx86-64 and arm64whatever the package targets

The tarball route

Mojang publishes the same launcher as a tarball. The archive holds one executable and its libraries, and there is no installation step to speak of.

wget https://launcher.mojang.com/download/Minecraft.tar.gz
tar -xzf Minecraft.tar.gz
./minecraft-launcher/minecraft-launcher

The binary inside that archive is an x86-64 ELF executable, the same one the .deb carries. The tarball buys you distribution independence, not CPU independence.

What an ARM machine can and cannot do

Both official Linux artifacts are x86-64. On an arm64 machine dpkg stops at the architecture check before it unpacks a single file.

dpkg refusing the amd64 launcher package on an arm64 machine
The launcher package is amd64, so an ARM machine stops here

That message describes the package rather than your system. I saw the same refusal on an arm64 board, and there is no ARM build of the official launcher to switch to.

The server jar is a different case entirely, because Java bytecode does not care which CPU executes it. A Raspberry Pi or an ARM VPS runs the server as long as Java 25 is installed.

Third-party launchers cover the desktop side instead. Prism Launcher is packaged on Flathub and in several distributions, it runs on ARM, and it signs in with the same Microsoft account the official launcher uses.

I checked Flathub for it, and version 11.1.0 sits on the stable channel. Take it from there or from your distribution’s repository rather than from a mirror link in a comment thread.

Run a Minecraft Java Edition server

The server half needs no paid licence and no display, which is what makes it a good fit for a box in a cupboard.

Install Java 25

Ubuntu 24.04 and its derivatives carry OpenJDK 25 in the universe component. The headless package is the one a server wants, because there is no window for it to draw.

sudo apt install openjdk-25-jre-headless

Confirm the version before you go further.

java -version
java -version reporting OpenJDK 25.0.4
Java 25 is the version the current release asks for

A machine that answers with 21 or 17 will refuse the jar. If that is what you see, checking the Java version shows which runtime the shell is picking up, and installing Java on Ubuntu covers the switch between two installed runtimes.

Create an account for the server

A server running as your login account has your files, your keys and your shell history within reach. Give it an account of its own.

sudo useradd -r -m -U -d /opt/minecraft -s /bin/bash minecraft

The -r flag makes it a system account with no password, and the -d flag puts its home directory at /opt/minecraft. With no password set, nobody can log into it over SSH, and the useradd command covers the other flags.

Step into that account for the sections that follow. sudo asks for your password rather than the minecraft account’s, because it authenticates the person running it.

sudo su - minecraft

Download the server jar and check its hash

Take the download link from the server page on minecraft.net rather than from a tutorial. The path carries the build hash for the current release, and it changes every time Mojang ships one.

mkdir -p server
cd server

Then fetch the jar from the path that carries the hash for release 26.3. The same forty characters sit next to the file size on the download page.

wget -O server.jar https://piston-data.mojang.com/v1/objects/33680f5f2ac32864d6d7cf5e56a705fdb3e05f4c/server.jar

Ask the file what it is before you run it, because sha1sum prints a fingerprint that has to match the string in the URL you just used.

sha1sum server.jar
sha1sum of server.jar in the server directory
The hash matches the one in Mojang’s download link

When the strings differ, the download was truncated or came from somewhere else. Delete it and fetch it again.

Run it once and accept the EULA

The first start does three things at once. It unpacks the libraries the jar bundles, it writes the default configuration, and it stops.

java -Xmx1024M -Xms1024M -jar server.jar nogui
The first Minecraft server run stopping at the EULA line
The first start stops until the EULA is accepted

Mojang requires the person operating a server to accept the end user licence agreement, and the file it wants edited is eula.txt in the server directory. That file holds two comments and one setting.

sed -i 's/^eula=false/eula=true/' eula.txt

The caret anchors the match to the start of the line, which keeps the edit on the key itself. A wider match would rewrite anything else in the file that reads false.

That line now reads eula=true, and the server is ready for its next start.

Run it again and watch it reach the port

A start with the agreement in place creates the world and binds the port. Nothing else about the command changes.

java -Xmx1024M -Xms1024M -jar server.jar nogui
Minecraft server reaching Done and listening on port 25565
The server reaches port 25565 with the world loaded

The port line and the Done line in that output are worth reading closely. The server announces the port it took, and the Done line carries the time the world needed to generate.

I ran the same command on the machine I tested this on, and a fresh world was ready in 5.7 seconds.

Java 25 also prints a pair of native access warnings about the jna and joml libraries the server bundles. They are noise rather than a fault, and adding –enable-native-access=ALL-UNNAMED to the command silences the first one.

Hand it to systemd

A server started by hand dies with the terminal that started it. Type exit to leave the minecraft shell, then write a unit file so systemd owns the process.

sudo nano /etc/systemd/system/minecraft.service

The unit below leaves out the KillMode=none line that older Minecraft guides carried because systemd 255 marks that setting deprecated and unsafe. Process management goes back to the service manager instead.

[Unit]
Description=Minecraft Server
After=network.target

[Service]
Type=simple
User=minecraft
WorkingDirectory=/opt/minecraft/server
ExecStart=/usr/bin/java -Xmx1024M -Xms1024M -jar server.jar nogui
Restart=on-failure
SuccessExitStatus=0 1
ProtectHome=true
ProtectSystem=full
PrivateDevices=true
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

Type=simple matches a process that stays in the foreground and Restart=on-failure brings the server back if the JVM falls over. I keep the two heap flags equal in my own unit file so the JVM does not resize on every start.

Ask systemd to read the file back before you start anything. It reports a typo in a directive without touching the running system.

sudo systemd-analyze verify /etc/systemd/system/minecraft.service

Then reload the unit list and start it.

sudo systemctl daemon-reload
sudo systemctl enable --now minecraft

The enable flag makes the service come back after a reboot, and –now starts it in the same breath. The systemctl commands for starting and stopping services cover the rest of the lifecycle.

Open the port, or decide not to

If the machine runs UFW, opening port 25565 takes one command. That port is the default the server binds, and its startup line prints it on the way up.

sudo ufw allow 25565/tcp

That rule exposes the server to the internet, which is what a public server wants and often not what a household one does. A world for the people in your house can stay closed and be reached over the local network.

The UFW setup guide covers the rest of the rule set, and finding the open ports on the server shows whether the jar still holds 25565.

When the launcher or the server refuses to start

Each message below names a specific cause, and none of them means the machine is broken. All but one have a one-line fix.

What you seeWhat it meansWhat to do
package architecture (amd64) does not match system (arm64)the launcher package is built for x86-64use an ARM-capable launcher instead, or run the server
You need to agree to the EULA in order to run the servereula.txt is still falseset it to true and start again
Failed to load properties from file: server.propertiesthe first start, before the file existsnothing, the server writes it on the way out
UnsupportedClassVersionError, class file version 69.0the JRE on the PATH is older than the release needsinstall Java 25 and check which runtime the shell picks
java: command not foundno JRE on the machine at allinstall openjdk-25-jre-headless
FAILED TO START THE SERVER, with a LockException on world/session.locka second server is already running from the same folderstop the first one, or give the second its own directory

The class file version is the number to act on. Java 25 writes class file version 69, and Java 21 tops out at 65.

When the server jar is newer than the runtime, the error names those numbers instead of the Java version, so the fix is a newer JRE rather than a different jar.

The whole world is one folder you can copy

Everything the server generates lives under the directory you started it in. The terrain, the player data, the properties and the logs are all there, which makes a backup a copy rather than an export.

sudo systemctl stop minecraft
sudo tar czf minecraft-backup.tgz -C /opt/minecraft server
sudo systemctl start minecraft

Stopping first is what keeps the archive clean, since a running server holds region files open mid-write and an archive built while it does will not restore cleanly.

The archive lands in your home directory as a dated snapshot, and the same tar command in reverse puts it back. That is also how you move a world between hosts.

Frequently asked questions

Does Minecraft Java Edition run on ARM Linux?

The server does, because the server jar is Java bytecode and any CPU with a matching runtime can execute it. The official desktop launcher is an x86-64 package, so an ARM machine needs a third-party launcher such as Prism Launcher, which is packaged on Flathub and in several distributions.

Which Java version does the Minecraft server need?

Release 26.1 and later need Java 25. Releases from 1.20.5 to 1.21.11 need Java 21, and older versions keep their own lower floors, so a machine serving two releases sometimes needs two runtimes installed side by side.

Is the Minecraft server free to run?

Yes. The server software carries no licence key and no subscription. Every player who connects needs a Java Edition account, but the machine hosting the world does not.

Where does the Minecraft launcher keep the game files?

Under a hidden directory in your home folder. That is the path mod launchers ask you to point at when they cannot find an existing installation, and it is the directory to back up along with your saved worlds.

Why does dpkg say the package architecture does not match?

The official Linux launcher package is built for amd64 only, so on an arm64 machine there is no matching build to install. The refusal happens before any file is unpacked, which means nothing on the system was touched.