Minecraft Server aufsetzen

Das Spielprinzip von Minecraft, welches mittlerweile von Microsoft aufgekauft wurde, lässt sich am besten als LEGO für Erwachsene beschreiben. In einer Welt, die nur aus Blöcken besteht, kann sich der Spieler ausleben und seiner Kreativität freien Lauf lassen.

Vor einigen Jahren schrieb ich einen Artikel, wie ein Minecraft-Server unter Ubuntu aufgesetzt wird. Da der Artikel mittlerweile etwas veraltet ist, wird die Anleitung mit diesem Artikel aktualisiert.

Um einen Minecraft-Server aufzusetzen, muss im ersten Schritt Java mittels:

apt install openjdk-11-jre

installiert werden. Nun kann die Version des installierten Javas mittels des Befehls:

java --version

bestimmt werden. Für die Ausführung von Minecraft wird hierbei Java 7 oder höher benötigt. In der Ausgabe des Befehls finden sich die notwendigen Informationen:

openjdk 11.0.3 2019-04-16
OpenJDK Runtime Environment (build 11.0.3+7-Ubuntu-1ubuntu218.04.1)
OpenJDK 64-Bit Server VM (build 11.0.3+7-Ubuntu-1ubuntu218.04.1, mixed mode, sharing)

Nachdem damit die Grundvoraussetzungen erfüllt sind, wird mittels:

adduser --disabled-login --gecos "" minecraft
su minecraft

ein Nutzer für den Server angelegt und in diesen Nutzer gewechselt. Im Kontext des Nutzer muss nun der Server heruntergeladen werden. Die aktuelle URL des Server ist über die Minecraft-Webseite in Erfahrung zu bringen:

wget https://launcher.mojang.com/v1/objects/d0d0fe2b1dc6ab4c65554cb734270872b72dadd6/server.jar

Nachdem der Server heruntergeladen wurde, kann er für einen ersten Tests gestartet werden:

java -Xmx1024M -Xms1024M -jar server.jar nogui

Beim ersten Start wird folgende Meldung erscheinen:

[13:36:13] [main/ERROR]: Failed to load properties from file: server.properties
[13:36:14] [main/WARN]: Failed to load eula.txt
[13:36:14] [main/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.

Im Home-Verzeichnis des Nutzers findet sich nun eine Datei mit dem Namen eula.txt. Diese Datei muss bearbeitet werden:

nano eula.txt

Der Wert:

eula=false

muss hierbei auf den Wert true gesetzt werden. Anschließend kann die Datei gespeichert werden und der Editor verlassen werden. Nach dem abermaligen Start des Servers mittels:

java -Xmx1024M -Xms1024M -jar server.jar nogui

sollte derselbe nun hochfahren. Nachdem der Server erfolgreich hochgefahren wurde, sollte er wieder beendet werden. Damit der Service automatisch hochfährt, muss eine sogenannte systemd-Unit angelegt werden. Dazu wird der Nutzer minecraft verlassen und die systemd-Unit angelegt:

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

Die neu angelegte Datei wird nun mit folgendem Inhalt befüllt:

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

[Service]
Type=simple
WorkingDirectory=/home/minecraft
User=minecraft
Group=minecraft

Restart=always

ExecStart=/usr/bin/screen -DmS minecraft-server java -Xmx4096M -Xms2048M -jar server.jar nogui

ExecStop=/usr/bin/screen -p 0 -S minecraft-server -X eval 'stuff "save-all"15'
ExecStop=/usr/bin/screen -p 0 -S minecraft-server -X eval 'stuff "stop"15'
ExecStop=/bin/sleep 2

[Install]
WantedBy=multi-user.target

Nachdem die Datei gespeichert wurde, kann die systemd-Unit aktiviert werden:

systemctl enable minecraft
systemctl start minecraft

Damit ist der Minecraft-Server eingerichtet und startet automatisch und läuft anschließend im Hintergrund.

Im Home-Verzeichnis des Nutzers minecraft finden sich einige Dateien, welche der Konfiguration des Servers dienen. In der Datei ops.json werden die Operatoren für den Server hinterlegt. Die Datei server.properties enthält die grundlegenden Einstellungen des Servers. Wurde die Option white-list auf den Wert true gesetzt, so können die berechtigten Nutzer in der Datei whitelist.json hinterlegt werden.

Exception-Hierarchie unter Java

Java nutzt, wie viele andere Sprachen, Exceptions zur Fehlersignalisierung und Fehlerbehandlung. Folgender Code würde hierbei dem Anschein nach alle Exceptions fangen:

try {
  // Do something wrong
} catch(Exception e) {
  // Gotta Catch 'Em All
}

An dieser Stelle trügt der Schein nicht. Allerdings werden nur einige Fehlerklassen gefangen, nämlich nur solche vom Typ Exception. Die Hierarchie der Fehlerklassen ist unter Java ein wenig differenzierter. In Java erbt jede Klasse implizit von der Klasse Object und so erbt auch die Klasse Throwable von dieser und implementiert das Interface Serializable.

Die Hierarchie der Klassen, welche für Fehlersignalisierung zuständig sind

Von der Klasse Throwable wiederum erben die Klassen Error und Exception. Fehler vom Typ Error stellen laut Definition immer Fehler innerhalb der JVM da, während Exceptions gewöhnliche Fehler des Programmes bzw. des Entwicklers sind. Sollen nun alle Fehlerklassen gefangen werden, so müsste der Quellcode wie folgt aussehen:

try {
  // Do something wrong
} catch(Throwable t) {
  // Gotta Catch 'Em All
}

Das Beispiel sollte nur als solches betrachtet werden, da es sich immer empfiehlt spezielle Fehler zu fangen und zu behandeln. Ein solch allgemeiner Fehlerhandler eignet sich nur für Spezialfälle wie z.B. das Logging nicht behandelter Fehler. Die Hierarchie verästelt sich anschließend noch weiter, so erben unterschiedlichste Klassen von der Klasse Error. Bei der Klasse Exception sieht dies ähnlich aus, allerdings existiert hier eine Besonderheit, die Klasse RuntimeException. Normalerweise muss eine Methode Exceptions, die sie wirft im Methodenkopf bekannt geben, wenn sie nicht in der Methode behandelt werden:

public static void example() throws Exception {
  throw new Exception();
}

Bei Klassen die von der Klasse RuntimeException erben muss diese Bekanntmachung im Methodenkopf nicht erfolgen. Sie werden trotzdem nach oben durchgereicht bis sie gefangen werden oder sich das Programm beendet, wenn die Behandlung der Exception nicht durchgeführt wurde.

jQuery Mobile und jQuery UI sind tot

Die bekannte JavaScript-Bibliothek jQuery, welche unter anderem zur Manipulation des DOMs genutzt wird, wird von zwei Bibliotheken flankiert, welche sich dem UI annehmen. Die Rede ist von jQuery Mobile und jQuery UI. Mithilfe dieser Bibliotheken ist es möglich Oberflächen für Webanwendungen zu entwickeln.

Eine mittels jQuery UI entwickelte Webapplikation

Während sich die Bibliotheken weiterhin sehr beliebt sind, was sich unter anderen in den Fragen auf Stack Overflow widerspiegelt, gibt es ein Problem mit den Projekten; sie sind praktisch tot. Der letzte Commit für jQuery UI ist vom Mai 2017 und auch die Entwicklung der letzten Jahre von jQuery Mobile ist sehr übersichtlich. Ansonsten sind viele andere Zeichen zu entdecken das die beiden Projekte tot sind.

Für neue Projekte in der Webentwicklung, sollte sich deshalb nach einem anderen Framework für die Erstellung von Weboberflächen umgesehen werden. Eine Alternative stellt unter anderem Framework 7 dar, welches von der Einfachheit der jQuery UI– und jQuery Mobile-Bibliotheken inspiriert ist.

Internationalisierung mittels JavaScript

Für mein neues Projekt Wryte war ich auf der Suche nach einer Möglichkeit die Anwendung zu lokalisieren. Das genutzte Framework 7 unterstützt leider keine Lokalisierung von Haus aus, so das diese nachgerüstet werden musste. Zum Tragen kam hierbei die JavaScript-Bibliothek i18next. Nach dem Download und der Einbindung der Bibliothek kann diese initialisiert werden:

i18next
  .use(window.i18nextBrowserLanguageDetector)
  .init({
    debug: false,
    resources: {
      en: {
        translation: {
          "about": "About"
        }
      },
      de: {
        translation: {
          "about": "Über"
        }
      }
    }
  });

In diesem Fall wird zusätzlich der i18nextBrowserLanguageDetector eingebunden, damit die Sprache des Nutzers automatisch erkannt wird. Anschließend kann die Übersetzung abgerufen werden:

$('#tab-author').html(i18next.t('author'));

Nach diesem Schema lässt sich anschließend die gesamte Anwendung übersetzen. Die offizielle Projektseite von i18next ist unter i18next.com zu finden. Die Quelltexte der einzelnen Projektbestandteile sind auf GitHub zu finden. Lizenziert ist i18next unter der MIT-Lizenz und damit freie Software.