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.49si 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 :
- compile les sources serveur (
build/build_server), client (build/build_client), cartes (build/build_server_maps), scripts serveur, et données de configuration XML ; - copie les ressources (sprites, sons, musiques, cartes, fontes, GUI) ;
- génère les archives
.jardansbuild/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 lancerrunserver.shdepuis la racine du projet (cd stendhal-1.49 && ./bin/runserver.sh) sous peine de ne pas trouverlibs/et les classes compilées. Elle a été remplacée parcd "$(dirname "$0")/.." || exit(retour au dossier parent du script, c'est-à-dire la racine du projet — pasbin/lui-même, qui ne contient pas de dossierlibs/), 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, choixh2) :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.sha é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.stendhalCe script accepte les mêmes options que
bin/runserver.sh(les arguments-Dxxx=yyysont 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.