[JAVA] Laden der WildFly-Klasse

Einführung

Ich hatte keine spezielle Anfrage, aber ich werde eine Fortsetzung von [Versuchen Sie, WildFly Wild zu bewegen] schreiben (https://qiita.com/tama1/items/829be5aacd81637ae73a). Dieses Mal geht es um das Laden von Klassen. Dieses Mal werden wir ab Dezember 2018 das neueste "WildFly-15.0.0.Final" verwenden.

Laden der WildFly-Klasse

Die in WildFly enthaltenen Gläser werden mit der Idee von Modulen verwaltet. Es gibt zwei Arten von Modulen: statische Module und dynamische Module.

Modultyp

** 1. Statisches Modul ** Bezieht sich auf das im Modulverzeichnis installierte JAR. Sie können auch ein vom Benutzer erstelltes benutzerdefiniertes Modul jar einfügen. ** 2. Dynamisches Modul ** Ein Glas oder eine Klasse in einer Kriegs- oder Ohrfeile.

Wenn Sie ein statisches Modul aus Ihrer Anwendung verwenden möchten, müssen Sie eine Bereitstellungsdeskriptordatei "jboss-deploy-struct.xml" in Ihre Anwendung einfügen und eine ** Abhängigkeit ** schreiben, die angibt, dass Sie dieses Modul verwenden werden. Es gibt.

Einige statische Module haben jedoch ** implizite ** Abhängigkeiten **, und diese sind egoistisch, ohne sie in "jboss-deploy-struct.xml" schreiben zu müssen. Wird geladen in.

Priorität beim Laden von Klassen

Klassen (Module) werden in der Reihenfolge ihrer Priorität geladen. Wenn sich Klassen mit demselben Namen im selben Paket befinden, wird die Klasse mit der höchsten zuerst geladenen Priorität verwendet.

Jedes Modul wird in der folgenden Reihenfolge geladen [^ 1].

  1. Statisches Modul für implizite Abhängigkeiten ^ 2
  2. Benutzerabhängigkeiten, die vom Benutzer in "jboss-deploy-struct.xml" festgelegt wurden
  3. Dynamisches Modul (lokale Ressource)

Überprüfen Sie, ob es wahr ist

Ich bin skeptisch, also werde ich versuchen zu sehen, ob es wahr ist.

Erstellen einer JSP zur Bestätigung

Überprüfen Sie mit org.apache.log4j im Modul Implizite Abhängigkeit. Bereiten Sie zunächst den folgenden JSP vor.

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>

Erstellen einer gefälschten Klasse zur Bestätigung

Erstellen Sie eine gefälschte Logger-Klasse wie die folgende, kompilieren Sie sie und konsolidieren Sie sie in classloadTestInModules.jar. Installieren Sie dies als ** statisches Modul ** im Modulverzeichnis.

Logger.java


package org.apache.log4j;
public class Logger {

	public static String getLogger(String name) {
	//org.apache.log4j.Gibt das Zeichenfolgenmodul anstelle der Logger-Klasse zurück.
		return "module";
	}
}

Nehmen Sie dann einige Änderungen vor und kompilieren Sie sie auf die gleiche Weise in classloadTestInWar.jar. Dies ist in der Anwendung (war) als ** dynamisches Modul ** enthalten.

Logger.java


package org.apache.log4j;
public class Logger {

	public static String getLogger(String name) {
	//org.apache.log4j.Gibt den String War anstelle der Logger-Klasse zurück.
		return "war";
	}
}

Installation von statischen Modulen

Installieren Sie die erstellte classloadTestInModules.jar im Modulverzeichnis.

Erstellen Sie die folgenden Verzeichnisse.  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

Platzieren Sie classloadTestInModules.jar unten.  wildfly-15.0.0.Final/modules/system/layers/base/test/test/main

Erstellen Sie module.xml mit den folgenden Inhalten. test.test ist der Name dieses Moduls.

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>

Dann platzieren Sie "logger.jsp" direkt unter "classloadTestInWar.jar" war in "WEB-INF / lib" der entsprechenden Anwendung "helloworld.war" in "wildfly-15.0.0.Final / standalone / deployments" .. Erstellen Sie die Bereitstellungsmarkierungsdatei "helloworld.war.dodeploy" und stellen Sie sie bereit.

Wird das implizite Abhängigkeitsmodul verwendet?

Gehen Sie in Ihrem Browser zu "http: // localhost: 8080 / helloworld / logger.jsp".

Es wurde wie folgt angezeigt. Nachdem das Logger-Klassenobjekt zurück ist, können Sie sehen, dass die implizite Abhängigkeitsmodulklasse zurück ist.

org.apache.log4j.Logger org.apache.log4j.Logger@62af7a58

Es hat wie erwartet funktioniert: klatschen:

Wird das vom Benutzer platzierte statische Modul verwendet?

Fügen wir eine Einstellung ein, die ein benutzerdefiniertes Modul anstelle eines impliziten Abhängigkeitsmoduls verwenden möchte. Erstellen Sie eine Bereitstellungsdeskriptordatei "jboss-deploy-struct.xml" in "helloworld.war / META-INF" mit folgendem Inhalt:

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>

<Abhängigkeiten> ist der Name des statischen Moduls, das Sie verwenden möchten. <Ausschlüsse> ist der Name des impliziten Abhängigkeitsmoduls, das Sie nicht verwenden möchten. Erstellen Sie nun erneut die Datei "helloworld.war.dodeploy" und stellen Sie sie erneut bereit, um auf "http: // localhost: 8080 / helloworld / logger.jsp" zuzugreifen.

Es wurde wie folgt angezeigt. Der String-Typ mit dem Inhaltsmodul wird zurückgegeben, sodass Sie sehen können, dass die Klasse des installierten test.test-Moduls verwendet wurde.

java.lang.String module

Es hat wie erwartet funktioniert: klatschen:

Wird ein dynamisches Modul verwendet?

Stellen Sie dann ein, dass nur dynamische Module verwendet werden. Ändern Sie "jboss-deploy-struct.xml" wie folgt: Belassen Sie nur die Einstellungen, die das implizite Abhängigkeitsmodul ausschließen.

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>

Erstellen Sie die Datei "helloworld.war.dodeploy" erneut und stellen Sie sie erneut bereit, um auf "http: // localhost: 8080 / helloworld / logger.jsp" zuzugreifen.

Es wurde wie folgt angezeigt. Der String-Typ mit dem Content War wird zurückgegeben, sodass Sie sehen können, dass die Klasse des dynamischen Moduls classloadTestInWar.jar in WEB-INF / lib verwendet wurde.

java.lang.String war

Es hat wie erwartet funktioniert: klatschen:

Zusammenfassung

Wenn WildFly die Priorität des Ladens von Klassen nicht kennt und die von Ihnen erstellte Anwendung dasselbe Modul wie die implizite Abhängigkeit enthält, können unerwartete Fehler aufgrund unterschiedlicher Versionen auftreten. Bitte beachten Sie, dass es gibt.

Referenzmaterial

[^ 1]: Prioritätsreihenfolge beim Laden von Klassen ⇒ 1.3. Vorrang beim Laden von Klassen [^ 2]: Liste der impliziten Abhängigkeitsmodule ⇒ 2.3. Welche impliziten Modulabhängigkeiten gibt es? Kapitel 6 Laden der JBoss EAP-Klasse

Recommended Posts

Laden der WildFly-Klasse
Anonyme Klasse (anonyme Klasse)
Wildfly Installation
Klassenmethode
ArrayList-Klasse