Bonjour, N'ayant pas trouvé de documentation claire sur comment faire pour embarqué un conteneur web dans un war, je vais faire un petit tuto. Donc, au départ, l'idée était d'inclure un conteneur comme hudson l'avait fait, il on utilisé winstone. Il est vraiment petit (300ko) et marche bien. Le lancement se fera à la manière d'un jar: java -jar app.war Main ---- Donc, le point de départ, était d'écrire une classe Main() a inclure dans le war, qui sera le point d'entrée quand on essayera d'excuter le war directement. public class MyLauncher { public static void main(String[] args) throws IOException { String fqnLauncherFile = MyLauncher.class.getName().replaceAll("\\.", "/")+ ".class"; URL classFile = MyLauncher.class.getClassLoader().getResource(fqnLauncherFile); // strange following line seams also work for jpnl launch File me = new File(((JarURLConnection) classFile.openConnection()).getJarFile().getName()); Map hashArgs = new HashMap(); hashArgs.put("warfile", me.getAbsolutePath()); Launcher.initLogger(hashArgs); Launcher winstone = new Launcher(hashArgs); } } En gros, le main "se cherche" lui même dans le classpath pour déterminer quel est le chemin complet du war sur le système. Ensuite, il lance un serveur wintone (Launcher) en lui indiquant le war qu'il doit déployer. Note: Il est important qu'ici le code soit du pur "java" (plus winstone), l'inclusion de code venant d'autre classes non standard ne fonctionnera pas. (commons-logging par exemple). Maven ----- L'étape suivante consiste a configurer maven. Premièrement, il faut ajouter "winstone" en dépendance du projet: <dependency> <groupId>net.sourceforge.winstone</groupId> <artifactId>winstone</artifactId> <version>0.9.10</version> <scope>provided</scope> </dependency> Il a seulement besoin d'être provided pour compiler le Main. Il n'a pas besoin de se retrouver dans le WEB-INF/lib du war. Ensuite, il faut surcharger la configuration du plugin war pour ajouter winstone dedans et le main dans le manifest. <plugins> <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.1-beta-1</version> <configuration> <webResources> <resource> <directory>${basedir}/target/classes</directory> <includes> <include>**/MyLauncher.*</include> </includes> </resource> </webResources> <!-- for putting Main-Class into war --> <archive> <manifest> <mainClass>org.exemple.test.war.MyLauncher</mainClass> </manifest> </archive> <overlays> <overlay> <groupId>net.sourceforge.winstone</groupId> <artifactId>winstone</artifactId> <type>jar</type> </overlay> </overlays> </configuration> </plugin> </plugins> Cette configuration recopie manuellement le main a la base du war. (il y en a une copie dans WEB-INF/classes, mais c'est pas grave) et l'ajoute dans le manifest. Il ajoute également le contenu décompressé de winstone. Voilà pourquoi winstone est la seule dépendance à pouvoir être utilisée dans le Main. Exemple ------- Cet exemple est utilisé dans pollen : - main : http://www.chorem.org/repositories/entry/pollen/trunk/pollen-ui/src/main/jav... - maven : http://www.chorem.org/repositories/entry/pollen/trunk/pollen-ui/pom.xml?rev=... -- Éric <chatellier@codelutin.com> Tel: 02 40 50 29 28 http://www.codelutin.com
participants (1)
-
Eric Chatellier