[JAVA] Chargement de la classe WildFly

introduction

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.

Chargement de la classe WildFly

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.

Type de module

** 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.

Priorité de chargement de classe

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].

  1. Module statique de dépendances implicites [^ 2](Dépendances système)
  2. Dépendances utilisateur définies par l'utilisateur dans jboss-deployment-structure.xml
  3. Module dynamique (ressource locale)

Vérifiez si c'est vrai

Je suis sceptique alors je vais essayer de voir si c'est vrai.

Création d'un JSP pour confirmation

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éer une fausse classe pour confirmation

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";
	}
}

Installation de modules statiques

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.

Le module de dépendance implicite est-il utilisé?

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:

Le module statique placé par l'utilisateur sera-t-il utilisé?

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. «» est le nom du module de dépendance implicite que vous ne souhaitez pas utiliser. Maintenant encore, créez le fichier 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:

Un module dynamique est-il utilisé?

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:

Résumé

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.

Matériel de référence

[^ 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

Recommended Posts

Chargement de la classe WildFly
Classe anonyme (classe anonyme)
Installation de Wildfly
Méthode de classe
Classe ObjectMapper
Classe ArrayList