<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Classloader on Java &amp; Moi</title><link>https://javaetmoi.com/tags/classloader/</link><description>Recent content in Classloader on Java &amp; Moi</description><generator>Hugo</generator><language>fr</language><lastBuildDate>Wed, 23 Apr 2014 15:28:37 +0000</lastBuildDate><atom:link href="https://javaetmoi.com/tags/classloader/feed.xml" rel="self" type="application/rss+xml"/><item><title>14 prises de notes à Devoxx France 2014</title><link>https://javaetmoi.com/2014/04/14-prises-de-notes-a-devoxx-france-2014/</link><pubDate>Wed, 23 Apr 2014 15:28:37 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1082</guid><description>&lt;p&gt;En attendant que les vidéos des &lt;a href="http://cfp.devoxx.fr/devoxxfr2014"&gt;différentes conférences de l’édition 2014&lt;/a&gt; de Devoxx France soient mises en ligne sur &lt;a href="http://www.parleys.com/"&gt;Parleys&lt;/a&gt; et en complément des &lt;a href="http://www.parleys.com/"&gt;supports&lt;/a&gt; déjà mis en ligne par certains Speakers, je mets librement à votre disposition les différentes notes que j’ai pu prendre sur mon laptop.
Les sujets sont variés : de Docker à Angular JS, en passant par Java 8. Certaines pourront être lues de manière autonome ; je pense par exemple au quickie &lt;a href="wp-content/uploads/2014/04/Outils-pour-manager-une-%C3%A9quipe.pdf"&gt;Outils pour manager une équipe&lt;/a&gt; et à la conférence &lt;a href="wp-content/uploads/2014/04/33-things-your-want-to-do-better.pdf"&gt;33 things your want to do better&lt;/a&gt;. Pour être exploitables en l’état, d’autres notes demanderont à ce que vous ayez assisté à la conférence ou que vous ayez pu récupérer les supports de présentation.&lt;/p&gt;
&lt;p&gt;&lt;a href="wp-content/uploads/2014/04/devoxx-france-2014-les-cast-codeurs.jpg"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="devoxx-france-2014-les-cast-codeurs"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/04/devoxx-france-2014-les-cast-codeurs.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="devoxx-france-2014-les-cast-codeurs"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/04/devoxx-france-2014-les-cast-codeurs.jpg"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Isoler le classloader de son EAR sous JBoss</title><link>https://javaetmoi.com/2013/01/isoler-classloader-ear-jboss/</link><pubDate>Sat, 05 Jan 2013 09:41:40 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=520</guid><description>&lt;p&gt;Lors de la &lt;strong&gt;migration&lt;/strong&gt; d’une application d’un &lt;strong&gt;serveur d’application&lt;/strong&gt; vers un autre, il est fréquent d’être confronté à des problématiques de &lt;strong&gt;conflits de librairies&lt;/strong&gt;. C’est par exemple le cas lorsqu’une application initialement déployée sur un Websphere Application Server 6.1 doit migrer sur &lt;strong&gt;JBoss 5.1 EAP&lt;/strong&gt; (version commerciale de JBoss AS).
Pour rappel, WAS 6.1 implémente J2EE 1.4 et s’exécute donc sur Java 5. Quant à JBoss 5.1 EAP, il implémente la norme Java EE 5, embarque donc de nombreuses implémentations des standards tels que JPA 1, JSF 1.2 et JAX-WS 1, et tourne sur Java 6.&lt;/p&gt;
&lt;p&gt;Pour illustration, prenons une application s’appuyant sur Hibernate 3.6 pour sa couche de persistance et JAXB 2.2 pour le marshalling lors d’appel de web services. Ces 2 librairies sont embarquées dans le répertoire lib de son EAR et ne posent pas de problèmes particuliers à WAS 6.1.
Par contre, sur JBoss 5.1 EAP, c’est un tout autre problème. En effet, son implémentation JPA repose sur la version 3.3 d&amp;rsquo;Hibernate. Qui plus est, JAXB 2.1 a été intégrée dans Java 6.
Si vous tentez de déployer une telle application sur un JBoss installé avec la configuration par défaut, il y’a de fortes chances que vous tombiez sur l’une ou l’autre des exceptions suivantes : &lt;em&gt;ClassCastException&lt;/em&gt;, &lt;em&gt;NoSuchMethodException, IllegalAccessErrors&lt;/em&gt;, &lt;em&gt;VerifyError.&lt;/em&gt;
A ce que j’ai compris en parcourant la documentation mais également déduis de mes tests, différents mécanismes permettent d’expliquer ces comportements :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Par défaut, lors du chargement d’une classe, le classloader de l’EAR va commencer par demander à son classloader parent (en l’occurrence celui de JBoss) de trouver la classe. Ainsi, c’est par exemple la classe Session d’Hibernate 3.3 qui sera chargée et non celle de la version 3.6 comme attendu. Il s’agit du comportement standard d’un classloader. Et c’est ce qu’on appelle communément le « j2se classloading compliance ». Sous WAS, cette stratégie de chargement peut être changée en paramétrant le classloader en PARENT_LAST.&lt;/li&gt;
&lt;li&gt;Les classes chargées par d’autres applications déployées sur la même instance de JBoss peuvent être partagées par votre application. Par exemple, la console d’admin JBoss admin-console.war embarque sa propre version de Richfaces et de Seam et peut, malgré elle, vous en faire bénéficier.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="solutions-étudiées"&gt;&lt;em&gt;Solutions étudiées&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;Pour mener à bien la migration, plusieurs pistes ont été étudiées :
&lt;strong&gt;Solutions&lt;strong&gt;&lt;strong&gt;Inconvénients&lt;/strong&gt;&lt;/strong&gt;Avantages&lt;/strong&gt;1Downgrader les versions des frameworks pour utiliser celles embarquées dans JBoss 5.1Important travail de refactoring pour combler les fonctionnalités manquantes.
Bugs existants récupérés.Respect de la norme Java EE 5.
Support éditeur maximal.2Configurer sur mesure le répertoire d’installation de JBoss (ex : supprimer le support des EJB 3 et de JPA)Mutualisation du répertoire d’installation rendue caduque.
Main sur la production _._Un JBoss qui démarre plus vite.
Pas d’impact sur le code.3Isoler le déploiement de l’applicationLire la documentation JBoss.
Augmentation possible de la PermGen.Risque nul.
Simple configuration.
Configuration embarquée dans l’EAR.&lt;/p&gt;
&lt;h2 id="configurer-le-classloader-de-lapplication"&gt;Configurer le classloader de l’application&lt;/h2&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="@Copyright JBoss - Classe chargée en priorité depuis l&amp;amp;amp;rsquo;EAR:right"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2013/01/JBoss-ClassLoading-Scoped-Java2ParentDelegationOff-300x202.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;Pour mettre en œuvre la solution n°3 concernant à « scoper » l’application, il est nécessaire de configurer le chargement des classes de JBoss . Une description détaillée de son fonctionnement est disponible sur la page &lt;a href="https://community.jboss.org/wiki/JBossClassLoadingUseCases"&gt;JBossClassLoadingUseCases&lt;/a&gt; du wiki de JBoss.
Dans notre cas, La configuration des classes loaders nécessaire est &lt;strong&gt;deployment scoped&lt;/strong&gt; et &lt;strong&gt;Java2ParentDelegation&lt;/strong&gt; &lt;strong&gt;désactivé&lt;/strong&gt;. Cette configuration est représentée par la figure ci-contre.&lt;/p&gt;
&lt;p&gt;Cette configuration présente les 2 avantages suivants :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Les JARs embarqués dans l&amp;rsquo;EAR priment sur celles fournies par JBoss 5.1 et le JRE.&lt;/li&gt;
&lt;li&gt;Chaque application déployée sur le même serveur possède son propre UnifiedLoaderRepository (ULR). Le chargement des classes est isolé et n&amp;rsquo;interfère pas. Elles sont également isolées du chargement des applications tierces (ex: jmx-console et admin-console).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;La configuration du fichier &lt;code&gt;jboss-app.xml&lt;/code&gt; à déposer dans le répertoire META-INF de l’EAR est décrite sur la page &lt;a href="https://community.jboss.org/wiki/ClassLoadingConfiguration"&gt;ClassLoadingConfiguration&lt;/a&gt; du wiki JBoss. En voici un exemple :
Lors de la &lt;strong&gt;migration&lt;/strong&gt; d’une application d’un &lt;strong&gt;serveur d’application&lt;/strong&gt; vers un autre, il est fréquent d’être confronté à des problématiques de &lt;strong&gt;conflits de librairies&lt;/strong&gt;. C’est par exemple le cas lorsqu’une application initialement déployée sur un Websphere Application Server 6.1 doit migrer sur &lt;strong&gt;JBoss 5.1 EAP&lt;/strong&gt; (version commerciale de JBoss AS).
Pour rappel, WAS 6.1 implémente J2EE 1.4 et s’exécute donc sur Java 5. Quant à JBoss 5.1 EAP, il implémente la norme Java EE 5, embarque donc de nombreuses implémentations des standards tels que JPA 1, JSF 1.2 et JAX-WS 1, et tourne sur Java 6.&lt;/p&gt;</description></item></channel></rss>