Je n'ai pas eu de demande particulière, mais j'écrirai une suite de Essayez de déplacer WildFly Wild. Cette fois, il s'agit du chargement de classe. Cette fois, nous utiliserons le dernier WildFly-15.0.0.Final
à partir de décembre 2018.
Les jars inclus dans WildFly sont gérés avec l'idée de modules. Il existe deux types de modules: les modules statiques et les modules dynamiques.
** 1. Module statique ** Fait référence au fichier jar installé sous le répertoire modules. Vous pouvez également mettre un fichier jar de module personnalisé créé par l'utilisateur. ** 2. Module dynamique ** Un pot ou une classe dans un fichier de guerre ou d'oreille.
Si vous souhaitez utiliser un module statique de votre application, vous devez mettre un fichier descripteur de déploiement jboss-deployment-structure.xml
dans votre application et écrire une ** dépendance ** qui déclare que vous utiliserez ce module. Il y a.
Cependant, certains modules statiques ont des dépendances ** implicites ** ** [^ 2], et celles-ci sont égoïstes sans être décrites dans jboss-deployment-structure.xml
. Sera chargé dans.
Les classes (modules) sont chargées par ordre de priorité, et s'il y a des classes avec le même nom dans le même package, celle avec la priorité la plus élevée chargée en premier sera utilisée.
Chaque module est chargé dans l'ordre suivant [^ 1].
jboss-deployment-structure.xml
Je suis sceptique alors je vais essayer de voir si c'est vrai.
Vérifiez en utilisant «org.apache.log4j» dans le module Dépendance implicite. Tout d'abord, préparez le fichier jsp.
logger.jsp
<%@page contentType="text/html; charset=UTF-8" %>
<html>
<body>
<%
Object logger = org.apache.log4j.Logger.getLogger("test");
out.print(logger.getClass().getName());
out.print("<br>");
out.print(logger.toString());
%>
</body>
</html>
Créez une fausse classe Logger comme celle ci-dessous, compilez-la et consolidez-la dans classloadTestInModules.jar. Installez-le en tant que ** module statique ** sous le répertoire modules.
Logger.java
package org.apache.log4j;
public class Logger {
public static String getLogger(String name) {
//org.apache.log4j.Renvoie le module de chaîne au lieu de la classe Logger.
return "module";
}
}
Ensuite, apportez quelques modifications et compilez-le de la même manière dans classloadTestInWar.jar. Ceci est inclus dans l'application (war) en tant que ** module dynamique **.
Logger.java
package org.apache.log4j;
public class Logger {
public static String getLogger(String name) {
//org.apache.log4j.Renvoie la chaîne war au lieu de la classe Logger.
return "war";
}
}
Installez le classloadTestInModules.jar créé dans le répertoire modules.
Créez les répertoires suivants. wildfly-15.0.0.Final/modules/system/layers/base/test wildfly-15.0.0.Final/modules/system/layers/base/test/test wildfly-15.0.0.Final/modules/system/layers/base/test/test/main
Placez classloadTestInModules.jar ci-dessous. wildfly-15.0.0.Final/modules/system/layers/base/test/test/main
Créez module.xml
avec le contenu suivant. test.test
est le nom de ce module.
module.xml
<?xml version="1.0" encoding="UTF-8"?>
<module name="test.test" xmlns="urn:jboss:module:1.7">
<resources>
<resource-root path="classloadTestInModules.jar"/>
</resources>
</module>
Puis placez logger.jsp
directement sous classloadTestInWar.jar
war dans WEB-INF / lib
de l'application appropriée helloworld.war
dans wildfly-15.0.0.Final / standalone / deployments
.. Créez et déployez le fichier de marqueurs de déploiement helloworld.war.dodeploy
et vous êtes prêt à partir.
Accédez à http: // localhost: 8080 / helloworld / logger.jsp
dans votre navigateur.
Il était affiché comme suit. Maintenant que l'objet de classe Logger est de retour, vous pouvez voir que la classe de module de dépendance implicite est de retour.
org.apache.log4j.Logger org.apache.log4j.Logger@62af7a58
Cela a fonctionné comme prévu: clap:
Mettons un paramètre qui souhaite utiliser un module spécifié par l'utilisateur au lieu d'un module de dépendance implicite. Créez un fichier descripteur de déploiement jboss-deployment-structure.xml
dans helloworld.war / META-INF
avec le contenu suivant:
jboss-deployment-structure.xml
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<exclusions>
<module name="org.apache.log4j" />
</exclusions>
<dependencies>
<module name="test.test"/>
</dependencies>
</deployment>
</jboss-deployment-structure>
<dependencies>
est le nom du module statique que vous souhaitez utiliser. «helloworld.war.dodeploy
et redéployez-le pour accéder http: // localhost: 8080 / helloworld / logger.jsp
.
Il était affiché comme suit. Le type String avec le module de contenu est renvoyé, vous pouvez donc voir que la classe du module test.test installé a été utilisée.
java.lang.String module
Cela a fonctionné comme prévu: clap:
Ensuite, réglez-le pour n'utiliser que des modules dynamiques. Remplacez jboss-deployment-structure.xml
par ce qui suit: Ne laissez que les paramètres qui excluent le module de dépendance implicite.
jboss-deployment-structure.xml
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<exclusions>
<module name="org.apache.log4j" />
</exclusions>
</deployment>
</jboss-deployment-structure>
Créez et redéployez le fichier helloworld.war.dodeploy
à nouveau pour accéder http: // localhost: 8080 / helloworld / logger.jsp
.
Il était affiché comme suit. Le type String avec le contenu war est retourné, vous pouvez donc voir que la classe du module dynamique classloadTestInWar.jar dans WEB-INF / lib a été utilisée.
java.lang.String war
Cela a fonctionné comme prévu: clap:
Si WildFly n'est pas conscient de la priorité de chargement des classes, si l'application que vous créez contient le même module que la dépendance implicite, vous pouvez souffrir d'erreurs inattendues dues à des versions différentes. Veuillez noter qu'il y en a.
[^ 1]: Ordre de priorité du chargement des classes ⇒ 1.3. Priorité de chargement des classes [^ 2]: Liste des modules de dépendances implicites ⇒ 2.3. Quelles sont les dépendances implicites des modules? Chapitre 6 Chargement de classe JBoss EAP