Installation du MMORPG Stendhal 1.49 sous Lubuntu 26.04
STATUS:PAGE LOADED — 2026-07-15

Installation du MMORPG Stendhal 1.49 sous Lubuntu 26.04

Ce document décrit la procédure suivie pour compiler ce checkout du jeu Stendhal (client + serveur Java) avec Apache Ant, ainsi que le correctif nécessaire pour un checkout incomplet comme celui-ci.

1. Prérequis

Outil Version testée Vérification
Système Lubuntu 26.04 LTS cat /etc/os-release
Java (JDK) OpenJDK 25.0.3 java -version
Apache Ant 1.10.15 ant -version
Accès Internet requis une seule fois pour récupérer buildtools/ (voir §3)

Le dépôt fournit déjà toutes les dépendances .jar nécessaires dans le dossier libs/ (Guava, log4j, JUnit, H2, Tomcat embarqué, etc.) — aucun téléchargement de dépendance n'est requis en dehors de buildtools/.

2. Structure attendue du projet

stendhal-1.49/
├── build.xml                  # point d'entrée Ant (target par défaut : compile)
├── build.ant.properties       # propriétés de build (versions, chemins, jars)
├── buildtools/                # scripts Ant importés par build.xml (MANQUANT au départ)
│   └── ant_modules/
│       ├── system.xml
│       ├── main.xml
│       ├── apps.xml
│       ├── clean.xml
│       ├── dist.xml
│       ├── maps.xml
│       ├── docs.xml
│       ├── locale.xml
│       ├── testing.xml
│       ├── tools.xml
│       └── package.xml
├── src/                        # sources Java (client + serveur)
├── tests/                      # tests unitaires
├── data/                       # ressources du jeu (cartes, sprites, sons, conf)
├── libs/                       # dépendances .jar déjà présentes
├── lib/                        # fichiers de licence des dépendances
└── bin/
    ├── runserver.sh
    └── runserver.bat

3. Problème rencontré : buildtools/ absent

Ce checkout ne contenait pas le dossier buildtools/, qui héberge les modules Ant (system.xml, main.xml, etc.) importés par build.xml :

ant
BUILD FAILED
build.xml:79: Cannot find /…/stendhal-1.49/buildtools/ant_modules/system.xml
imported from /…/stendhal-1.49/build.xml

Ce dossier n'est pas fourni par un simple téléchargement des .jar (voir le commentaire dans build.ant.properties) : il fait partie du dépôt source officiel github.com/arianne/stendhal.

Correctif appliqué

Récupération du dossier buildtools/ depuis le tag Git correspondant à la version du checkout (v1.49), via un clone Git en sparse checkout (pour n'importer que ce dossier, sans polluer le projet avec un .git) :

# Dans un dossier temporaire
git init -q stendhal-buildtools-fetch
cd stendhal-buildtools-fetch
git remote add origin https://github.com/arianne/stendhal.git
git config core.sparseCheckout true
echo "buildtools/*" > .git/info/sparse-checkout
git fetch --depth 1 origin v1.49
git checkout -q FETCH_HEAD

# Copie dans le projet
cp -r buildtools /chemin/vers/stendhal-1.49/

ℹ️ Adapter v1.49 si vous compilez une autre version — vérifier d'abord les tags disponibles : git ls-remote --tags https://github.com/arianne/stendhal.git

Une fois buildtools/ant_modules/*.xml en place, la compilation fonctionne.

4. Compilation

Depuis la racine du projet :

cd stendhal-1.49
ant

(compile est la target par défaut de build.xml, donc ant seul suffit ; ant compile fait la même chose explicitement.)

Cette commande :

  1. compile les sources serveur (build/build_server), client (build/build_client), cartes (build/build_server_maps), scripts serveur, et données de configuration XML ;
  2. copie les ressources (sprites, sons, musiques, cartes, fontes, GUI) ;
  3. génère les archives .jar dans build/lib/ :
Archive Contenu
stendhal-server-1.49.jar Serveur de jeu
stendhal-1.49.jar Client de jeu
stendhal-starter-1.49.jar Lanceur du client
stendhal-maps-1.49.jar Données des cartes
stendhal-data-1.49.jar Données graphiques du client
stendhal-sound-data-1.49.jar Effets sonores
stendhal-music-data-1.49.jar Musiques
stendhal-xmlconf-1.49.jar Configuration XML serveur

Résultat attendu :

BUILD SUCCESSFUL
Total time: ~54 seconds

Seuls des avertissements du compilateur sont normaux (API dépréciées, option -source 8 obsolète) — ils n'empêchent pas la compilation.

5. Lancer le serveur

./bin/runserver.sh

Le script se place désormais lui-même à la racine du projet (correctif apporté, voir ci-dessous), donc il peut être lancé depuis n'importe quel répertoire. Il détecte automatiquement s'il doit utiliser le .jar compilé (stendhal-server-1.49.jar) ou, à défaut, les classes compilées dans build/build_server* avec le classpath des libs/.

🔧 Correctif appliqué : la ligne cd "$(dirname "$0")" || exit était commentée dans le script d'origine, ce qui obligeait à toujours lancer runserver.sh depuis la racine du projet (cd stendhal-1.49 && ./bin/runserver.sh) sous peine de ne pas trouver libs/ et les classes compilées. Elle a été remplacée par cd "$(dirname "$0")/.." || exit (retour au dossier parent du script, c'est-à-dire la racine du projet — pas bin/ lui-même, qui ne contient pas de dossier libs/), et activée. Le script fonctionne maintenant correctement quel que soit le répertoire courant.

Testé avec succès (premier lancement, assistant de configuration server.ini, choix h2) : INFO [main] marauroad (122) - marauroa 3.9.8 is up and running...

Contrairement au client (§6), le serveur ne présente pas de problème de compatibilité avec Java 24+ : il n'utilise pas de SecurityManager.

Au premier lancement, en l'absence de server.ini, un assistant interactif en ligne de commande pose quelques questions (moteur de base de données — h2 par défaut convient pour un usage local, etc.) puis génère le fichier de configuration.

Sous Windows : bin\runserver.bat.

Contenu de bin/runserver.sh

#!/usr/bin/env bash

STENDHAL_VERSION="1.49"
SERVER_JAR="stendhal-server-${STENDHAL_VERSION}.jar"

# se placer a la racine du projet (parent de ce script), pour pouvoir
# lancer ce script depuis n'importe quel repertoire
cd "$(dirname "$0")/.." || exit

# parse arguments
vm_args=()
app_args=()
for arg in "$@"; do
    if [[ "${arg}" =~ ^-D ]]; then
        vm_args+=("${arg}")
    else
        app_args+=("${arg}")
    fi
done

if [ -f "${SERVER_JAR}" ]; then
    LOCALCLASSPATH="./${SERVER_JAR}:./libs/*"
else
    LOCALCLASSPATH=".:./build/build_server:./build/build_server_maps:./build/build_server_script:./build/build_server_xmlconf:./libs/*"
fi

java -Xmx400m -cp "${LOCALCLASSPATH}" "${vm_args[@]}" games.stendhal.server.StendhalServer "${app_args[@]}"

6. Lancer le client

java -jar build/lib/stendhal-starter-1.49.jar

⚠️ Sur Java 24+ (testé avec OpenJDK 25.0.3), ce lanceur échoue :

java.lang.UnsupportedOperationException: Setting a Security Manager is not supported
  at games.stendhal.client.update.Bootstrap.boot(Bootstrap.java:350)
...
java.lang.ClassNotFoundException: games.stendhal.client.stendhal
  at games.stendhal.client.update.Bootstrap.boot(Bootstrap.java:386)

Le starter tente de positionner un SecurityManager (API supprimée en Java 24+) puis, après cet échec, ne parvient plus à charger la classe principale du client via son chargeur de classes dynamique.

Contournement : un script bin/runclient.sh a été ajouté ; il lance directement la classe principale du client avec le classpath complet (jars générés + dépendances), en contournant le mécanisme d'auto-mise-à-jour du starter :

./bin/runclient.sh

Équivalent manuel :

java -cp "build/lib/*:libs/*" games.stendhal.client.stendhal

Ce script accepte les mêmes options que bin/runserver.sh (les arguments -Dxxx=yyy sont passés à la JVM, les autres à l'application). Il a été testé et ouvre correctement la fenêtre du client (« Stendhal 1.49 - a multiplayer online game using Arianne »).

Contenu de bin/runclient.sh

#!/usr/bin/env bash

# Lance le client Stendhal compile localement (build/lib/*.jar).
#
# Le lanceur officiel bin/stendhal-starter-*.jar echoue sur Java 24+
# (java.lang.UnsupportedOperationException: Setting a Security Manager
# is not supported), donc ce script demarre directement la classe
# principale du client avec le classpath complet.

STENDHAL_VERSION="1.49"

# se placer a la racine du projet (parent de ce script)
cd "$(dirname "$0")/.." || exit

# parse arguments : options -D vers la JVM, le reste vers l'application
vm_args=()
app_args=()
for arg in "$@"; do
    if [[ "${arg}" =~ ^-D ]]; then
        vm_args+=("${arg}")
    else
        app_args+=("${arg}")
    fi
done

LOCALCLASSPATH="build/lib/*:libs/*"

java -cp "${LOCALCLASSPATH}" "${vm_args[@]}" games.stendhal.client.stendhal "${app_args[@]}"

7. Autres commandes Ant utiles

Commande Effet
ant clean Supprime le dossier build/
ant compile_tests Compile les tests unitaires
ant report_test Lance les tests et génère un rapport
ant dist Génère les archives de distribution
ant javadocs Génère la documentation Javadoc

8. Résumé

Étape Statut
Prérequis Java / Ant ✅ déjà présents
Dépendances .jar (libs/) ✅ déjà présentes
Dossier buildtools/ ⚠️ manquant → récupéré depuis github.com/arianne/stendhal (tag v1.49)
ant (compilation) BUILD SUCCESSFUL
Archives générées ✅ dans build/lib/

9. Tests effectués

Environnement de test : Lubuntu 26.04 LTS, OpenJDK 25.0.3, Apache Ant 1.10.15.

Composant Commande testée Résultat
Compilation ant BUILD SUCCESSFUL, ~54 s, 8 archives générées dans build/lib/
Serveur ./bin/runserver.sh (lancé depuis /tmp, hors racine du projet) ✅ assistant de première configuration (server.ini, choix h2) répondu, toutes les zones/quêtes chargées, marauroa 3.9.8 is up and running...
Client (lanceur officiel) java -jar build/lib/stendhal-starter-1.49.jar UnsupportedOperationException: Setting a Security Manager is not supported (API supprimée en Java 24+), puis ClassNotFoundException
Client (script de contournement) ./bin/runclient.sh ✅ fenêtre « Stendhal 1.49 - a multiplayer online game using Arianne » ouverte correctement, logs sans erreur

Après chaque test du serveur, les fichiers générés (server.ini, server_stats.xml, log/, base H2 dans ~/stendhal/database/) ont été supprimés pour ne pas laisser d'état de test dans le projet.